Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2007.04.01;
Скачать: [xml.tar.bz2];

Вниз

реализация Callback вызова из DLL: не выходит каменный цветочек..   Найти похожие ветки 

 
savva ©   (2006-11-14 19:09) [0]

Вообщем приспичило сделать DLL которой передается указатель на процедуру, которую надо вызвать в нужный момент (кодом из DLL). Ну че то у меня не выходит.
основные моменты:

var
 callBackProc: TFarProc; // указатель на нужную процедуру

procedure initCBPointer(p: Pointer); stdcall; external "testDLL";// утанавливает указатель на нужную процедуру
procedure TestCall; stdcall; external "testDLL"; // просто для проверки

procedure testProc(const p: Pchar); { это вызываемая процедура }
begin
 ShowMessage(StrPas(p));// до сюда даже не доходит:)
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 callBackProc := MakeProcInstance(@testProc, hInstance);
 initCBPointer(callBackProc); // инициализируем
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
 FreeProcInstance(callBackProc);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 TestCall; // вызываем
end;

соответственно код DLL

type
 PCallbackProc = ^TCallbackProc;
 TCallbackProc = procedure(p :PChar);stdcall;

var
 saveCBProc : PCallbackProc;

 
procedure initCBPointer(cbProc: Pointer); stdcall;
begin
 saveCBProc := cbProc;
end;

procedure TestCall; stdcall;
var
 tmp : Pchar;
begin
 getMem(tmp, 4);
 try
   StrPCopy(tmp,"test");
   saveCBProc^(tmp);
 finally
   FreeMem(tmp);
 end;
end;


ЗЫ. Вот уж не думал что спрошу на эту тему. Стыдно, млин:)
ЗЫЫ. исходники тестового проекта http://www.webfile.ru/1191680


 
Eraser ©   (2006-11-14 19:46) [1]

> callBackProc := MakeProcInstance(@testProc, hInstance);

лишнее. достаточно initCBPointer(@callBackProc);

> procedure testProc(const p: Pchar); { это вызываемая процедура
> }
> begin
> ShowMessage(StrPas(p));// до сюда даже не доходит:)
> end;

должна быть объявлена как stdcall, судя по логике программы.

> FreeProcInstance(callBackProc);

лишнее.


 
savva ©   (2006-11-14 19:50) [2]

>> Eraser ©   (14.11.06 19:46) [1]
изначально так все и было - перестраховался, ибо не выходило..
stdcall было и убирал..

ЗЫ. Возможно имеет смысл объявить ОС: WinXP, Win2003 Server


 
savva ©   (2006-11-14 19:51) [3]

попробуй прогнать тестовый проект, а?


 
Eraser ©   (2006-11-14 19:56) [4]

> [2] savva ©   (14.11.06 19:50)

нет, тут не в системе дело.

>   saveCBProc^(tmp);

"^" возможно здесь и ошибка, лучше не использовать PCallbackProc.
код до туда и после выполняется?


 
savva ©   (2006-11-14 20:05) [5]

выполняется.. а что криминального в таком определении?


 
Eraser ©   (2006-11-14 21:02) [6]

> [5] savva ©   (14.11.06 20:05)
> выполняется.. а что криминального в таком определении?

скорее всего то, что если уж так делать,
то нужно вместо

> procedure initCBPointer(cbProc: Pointer); stdcall;
> begin
> saveCBProc := cbProc;
> end;

писать
procedure initCBPointer(cbProc: Pointer); stdcall;
begin
 New(saveCBProc);
 saveCBProc^ := cbProc;
end;

а вообще лучше убрать эти заморочки с указателями, лишнее никому не нужно нагромаждение.


 
Eraser ©   (2006-11-14 21:04) [7]

ЗЫ
потестил с

> procedure initCBPointer(cbProc: Pointer); stdcall;
> begin
> New(saveCBProc);
> saveCBProc^ := cbProc;
> end;

и без PCallbackProc вообще - прекрасно работает.

ЗЗЫ
не забудьте раставить где надо stdcall.


 
savva ©   (2006-11-14 22:13) [8]

да уж:) веки живи, век учись - дураком помрешь:)

Спасибо  большое...

ЗЫ. придется заново начинать процесс самообучения по части указателей:)


 
Eraser ©   (2006-11-15 00:42) [9]

> [8] savva ©   (14.11.06 22:13)


> Спасибо  большое...

не за что!

ну в принципе, там почти все правильно было, чтобы использовать код как есть можно просто заменить

> saveCBProc^(tmp);

на
TCallbackProc(saveCBProc)(tmp);
только, опять же, в чем тогда тайный смысл использования типизированного указателя, когда он используется как нетипизировнный ))



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2007.04.01;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.065 c
15-1173109716
muhh
2007-03-05 18:48
2007.04.01
Работа с реестром


2-1173442023
AMW
2007-03-09 15:07
2007.04.01
Invalid pointer operation при FreeMem


2-1173689177
DelphiLexx
2007-03-12 11:46
2007.04.01
Как БД состоящая из DBF файлов показать дублирующиеся строки


2-1173116281
kalic nord
2007-03-05 20:38
2007.04.01
Размер файла


3-1167987914
Сергей Ю
2007-01-05 12:05
2007.04.01
Помогите с запросом полному нолю, т.е. мне :)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский