Нужно передавать string и record.
В вызывающей программе и в ДЛЛ первым модулем в uses прописал sharemem.
Откомпилировал fpcmemdll и fpcmemdll.dll положил возле вызывающей программы.
Все одно при попытке вызова функции с параметром типа string вылет.
Что делаю не так?
Должна ли такая схема в будущем работать в Линукс?
Если отказаться от sharemem, то как лучше передавать string?
Лазарь 1.6.4
Код:
Проба обратного вызова процедуры из формы вызывающей программы.
Вызывающая программа:
- Код: Выделить всё
//Эта процедура будет вызваться из ДЛЛ
procedure Imp_MyShowMes(fm:TForm1; txt:string);
begin
fm.MyShowMes(txt);
end;
procedure TForm1.MyShowMes(txt:string);
begin
ShowMessage(txt);
end;
//Процедура загружает ДЛЛ, передает в нее ссылку на форму
//и вызывает процедуру, которая вызывает Imp_MyShowMes
procedure TForm1.Button2Click(Sender: TObject);
type
TDLLShowMes=procedure(fm:Tform); stdcall;
var
DLLhnd: THandle = 0;
DLLShowMes:TDLLShowMes;
begin
DLLhnd:=LoadLibrary('CallBackDLL.dll');
If DLLhnd=0 Then begin
ShowMessage('CallBackDLL.dll не найдена');
Exit;
end;
DLLShowMes:=TDLLShowMes(GetProcAddress(DLLhnd, 'DLLShowMes'));
If DLLShowMes=nil Then begin
ShowMessage('DLLShowMes не найдена');
Exit;
end;
DLLShowMes(self);
end;
exports Imp_MyShowMes index 1 name 'Imp_MyShowMes';
Код в ДЛЛ:
- Код: Выделить всё
library CallBackDLL;
{$mode objfpc}{$H+}
uses
sharemem,
Classes, Windows
{ you can add units after this };
type
TProcImp_MyShowMes=procedure(fm:pointer; txt:string);stdcall; //: Imp_MyShowMes(fm:TForm1);stdcall;
var fm:Pointer;
procedure DLLShowMes(fm:Pointer);
var EXEProc:TProcImp_MyShowMes;
begin
EXEProc:=TProcImp_MyShowMes(GetProcAddress(GetModuleHandle(nil), 'Imp_MyShowMes'));
EXEProc(fm, 'Привет из ДЛЛЛ');
end;
exports DLLShowMes;