Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

callBack на Дельфи... [D7, XP]


andreil ©   (2008-04-03 18:46:00) 

Пишу одну ДЛЛку с callBack-процедурами. Самособой, при тестах вызываю все из программы на Дельфи.
Код ДЛЛки, отвечающий за callBack'и:
unit USEpackage;
procedure ExtractItem(Item, Dst, Param: pChar); export; stdcall;
begin
 tOutTextMessage(Dst);
end;
-------------------------------------
unit utils;
interface
type
 TUSEVoid =
   (VOID_OUT_TEXT);

var
 tOutTextMessage: procedure(Mess: pChar); stdcall;

procedure SetVoid(VoidName: TUSEVoid; Void: pointer); export; stdcall;

implementation

procedure SetVoid(VoidName: TUSEVoid; Void: pointer); export; stdcall;
begin
 if VoidName=VOID_OUT_TEXT then
   tOutTextMessage:=Void;
end;


Код тестовой программы:
program test;
--------------инициализацию ДЛЛки писать нету смысла------
begin
 LoadUSELibrary('USE.dll');
 SetVoid(VOID_OUT_TEXT, @OutVoid);
 ExtractItem('\', 'C:\1', '');
end;


Само собой, я еще только начал делатьДЛЛку, причем начал делать с самого сложного. Но это оправдано, тк все модули, юзаемые ДЛЛкой, уже протестированы на других программах и работают 99%.
Проблема заключается в том, что при вызове
ExtractItem('\', 'C:\1', '');
, что поидее должно привести к вызову CallBack'a, однако ошибку выбивает еще а ДЛЛке непосредственно при вызове процедуры вывода :(
Объясните, что я не так делаю?
ЗЫ: Все проблемы в ДЛЛке, тк тот прием, что используется в тестовой проге для регистрации CallBack'а, уже проверен мною на С++ ДЛЛках, но вот как это сделать на Дельфи?


Германн   (2008-04-05 00:57:00) [1]


> tesseract ©   (05.04.08 00:49) [13]


> Главное понимать зачем они нужны.

Этого вполне достаточно.


tesseract   (2008-04-05 00:49:00) [2]


> Сергея интересует другой вопрос: нахрена ты stdcall в dll
> поставил? (меня этот вопрос тоже интересует... :) )


Стабильнее пашет.  Когда Dll пишет один я использует второй лучше stdcall или SafeCall. Главное понимать зачем они нужны.


Сергей М.   (2008-04-04 23:50:00) [3]


> Хз почему, просто рекомендуется по документации (уже не
> помню по какой


Мда ..

хз почему, но доктор рекомендовал в морг)


andreil   (2008-04-04 23:09:00) [4]

Хз почему, просто рекомендуется по документации (уже не помню по какой, но есть такое). Да и ДЛЛка работает на 100% вместе со всеми КАЛЛБЭКАМИ ;) Уже организовал почти все, щас только ввожу новые типы поддерживаемых файлов (ДЛЛка представляет из себя распаковщик нескольких специфических форматов файлов).


Ega23   (2008-04-04 01:06:00) [5]


> Поставил их и заработало ;) Так чтог не нафик.


Если уж ты поставил stdcall в dll, то будь любезен использовать это соглашение о вызове в вызывающем приложении.

Сергея интересует другой вопрос: нахрена ты stdcall в dll поставил? (меня этот вопрос тоже интересует... :) )


Сергей М.   (2008-04-03 21:24:00) [6]


> Поставил их и заработало ;) Так чтог не нафик.


Аааа ..

Ну-ну.


andreil   (2008-04-03 21:21:00) [7]

Поставил их и заработало ;) Так чтог не нафик.


Сергей М.   (2008-04-03 20:49:00) [8]


> забыл поставить stdcall в двух местах


Хоть в десяти)

Нафих они тебе нужны ? Ты это осознаешь ?


Reindeer Moss Eater   (2008-04-03 19:01:00) [9]

а OutVoid это что такое?


andreil   (2008-04-03 19:01:00) [10]

Сорри, и вправду, забыл поставить stdcall в двух местах, а именно:
var
 SetVoid: procedure(VoidName: TUSEVoid; Void: pointer); stdcall;
 ExtractItem: procedure(Item, Dst, Param: pChar); stdcall;

Еще раз сорри за то, что мешаю глупыми вопросами :)


Reindeer Moss Eater   (2008-04-03 18:59:00) [11]

2) Зачем? Я ведь передаю указатель на процедуру.

У тебя tOutTextMessage не инициализирована. Вот зачем.


andreil   (2008-04-03 18:57:00) [12]


> Где проверка результата LoadLibrary?Где GetProcAddress для
> tOutTextMessage ?

1) Пока не делал ;) тк загружается не все, да и загружается 100%
2) Зачем? Я ведь передаю указатель на процедуру.
> Внутри программы stdcall поставил?

Да, ставил.


Ega23   (2008-04-03 18:56:00) [13]

в код сильно не вникал.
Внутри программы stdcall поставил?


Reindeer Moss Eater   (2008-04-03 18:55:00) [14]

Где проверка результата LoadLibrary?
Где GetProcAddress для tOutTextMessage ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо