Текущий архив: 2008.04.27;
Скачать: CL | DM;
Вниз
callBack на Дельфи... Найти похожие ветки
← →
andreil © (2008-04-03 18:46) [0]Пишу одну ДЛЛку с 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"а, уже проверен мною на С++ ДЛЛках, но вот как это сделать на Дельфи?
← →
Reindeer Moss Eater © (2008-04-03 18:55) [1]Где проверка результата LoadLibrary?
Где GetProcAddress для tOutTextMessage ?
← →
Ega23 © (2008-04-03 18:56) [2]в код сильно не вникал.
Внутри программы stdcall поставил?
← →
andreil © (2008-04-03 18:57) [3]
> Где проверка результата LoadLibrary?Где GetProcAddress для
> tOutTextMessage ?
1) Пока не делал ;) тк загружается не все, да и загружается 100%
2) Зачем? Я ведь передаю указатель на процедуру.
> Внутри программы stdcall поставил?
Да, ставил.
← →
Reindeer Moss Eater © (2008-04-03 18:59) [4]2) Зачем? Я ведь передаю указатель на процедуру.
У тебя tOutTextMessage не инициализирована. Вот зачем.
← →
Reindeer Moss Eater © (2008-04-03 19:01) [5]а OutVoid это что такое?
← →
andreil © (2008-04-03 19:01) [6]Сорри, и вправду, забыл поставить stdcall в двух местах, а именно:
var
SetVoid: procedure(VoidName: TUSEVoid; Void: pointer); stdcall;
ExtractItem: procedure(Item, Dst, Param: pChar); stdcall;
Еще раз сорри за то, что мешаю глупыми вопросами :)
← →
Сергей М. © (2008-04-03 20:49) [7]
> забыл поставить stdcall в двух местах
Хоть в десяти)
Нафих они тебе нужны ? Ты это осознаешь ?
← →
andreil © (2008-04-03 21:21) [8]Поставил их и заработало ;) Так чтог не нафик.
← →
Сергей М. © (2008-04-03 21:24) [9]
> Поставил их и заработало ;) Так чтог не нафик.
Аааа ..
Ну-ну.
← →
Ega23 © (2008-04-04 01:06) [10]
> Поставил их и заработало ;) Так чтог не нафик.
Если уж ты поставил stdcall в dll, то будь любезен использовать это соглашение о вызове в вызывающем приложении.
Сергея интересует другой вопрос: нахрена ты stdcall в dll поставил? (меня этот вопрос тоже интересует... :) )
← →
andreil © (2008-04-04 23:09) [11]Хз почему, просто рекомендуется по документации (уже не помню по какой, но есть такое). Да и ДЛЛка работает на 100% вместе со всеми КАЛЛБЭКАМИ ;) Уже организовал почти все, щас только ввожу новые типы поддерживаемых файлов (ДЛЛка представляет из себя распаковщик нескольких специфических форматов файлов).
← →
Сергей М. © (2008-04-04 23:50) [12]
> Хз почему, просто рекомендуется по документации (уже не
> помню по какой
Мда ..
хз почему, но доктор рекомендовал в морг)
← →
tesseract © (2008-04-05 00:49) [13]
> Сергея интересует другой вопрос: нахрена ты stdcall в dll
> поставил? (меня этот вопрос тоже интересует... :) )
Стабильнее пашет. Когда Dll пишет один я использует второй лучше stdcall или SafeCall. Главное понимать зачем они нужны.
← →
Германн © (2008-04-05 00:57) [14]
> tesseract © (05.04.08 00:49) [13]
> Главное понимать зачем они нужны.
Этого вполне достаточно.
Страницы: 1 вся ветка
Текущий архив: 2008.04.27;
Скачать: CL | DM;
Память: 0.5 MB
Время: 0.018 c