Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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
2-1207232874
savyhinst
2008-04-03 18:27
2008.04.27
Как сделать кнопку во время исполнения???


2-1206891532
cyber-pilot
2008-03-30 19:38
2008.04.27
Создание и уничтожение дочерней формы


11-1188218102
Compiler
2007-08-27 16:35
2008.04.27
KOLMHXPStyle


15-1205498404
question
2008-03-14 15:40
2008.04.27
Помогите пожалуйста определиться с ценой разработки.


2-1207330381
Снежинка
2008-04-04 21:33
2008.04.27
Ошибка при добавление Combobox в DBGrid