![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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 ?