Форум: "Основная";
Текущий архив: 2007.09.30;
Скачать: [xml.tar.bz2];
ВнизУказатели на функции и DLL Найти похожие ветки
← →
SpellCaster (2007-07-20 19:53) [0]Всем привет!
Возникла проблема при вызове функции основного модуля через указатель из функции DLL. Вкратце, идея заключается в создании callback-механизма, чтобы при вызове функции, динамически загруженной из ДЛЛ, она могла вызвать функцию основного модуля, переданную ей через указатель.
Однако при попытке выполнить код вылезает AV. Есть подозрение, что это из-за несоответствия адресных пространств, но я не уверен.
Вот простейший проект:
Юнит проги
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, DecoderTypes;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
init: TTestInitData;
initfn: tinitfn;
implementation
{$R *.dfm}
procedure proc(msg: integer);
begin
ShowMessage(IntToStr(msg));
end;
procedure TForm1.FormCreate(Sender: TObject);
var fLibHandle: THandle;
begin
fLibHandle:=LoadLibrary("dll.dll");
if fLibHandle=0 then
ShowMessage("Ошибка загрузки dll.dll");
@InitFn:=GetProcAddress(fLibHandle,"InitFn");
if @InitFn=nil then
ShowMessage("Ошибка загрузки InitFn");
init.pr:=proc;
initfn(@init);
end;
end.
Юнит описания типов
unit DecoderTypes;
interface
type
TProc = procedure(msg: integer);
TInitFn = function(const InitData: Pointer): Boolean;
TTestInitData = record
pr: TProc;
end;
implementation
end.
Проект ДЛЛ
library dll;
uses SysUtils,
DecoderTypes;
{$R *.res}
var Init: TTestInitData;
function InitFn(const InitData: Pointer): Boolean; stdcall;
begin
TTestInitData(InitData^).pr(3);
Result:=True;
end;
exports
InitFn;
begin
end.
Что я делаю не так и как можно сделать правильно?
← →
begin...end © (2007-07-20 20:54) [1]> Есть подозрение, что это из-за несоответствия адресных пространств
Есть другое подозрение: это из-за несоответствия соглашений о вызове в описании типа TInitFn и описании заголовка реальной функции InitFn. Либо добавьте stdcall в описание типа, либо уберите его из описания функции.
← →
Rouse_ © (2007-07-20 23:31) [2]убирать не нужно... с void EXPORT FAR PASCAL тоже не все дружат :)
← →
SpellCaster (2007-07-23 01:11) [3]begin...end, действительно, проблема решилась! Огромное спасибо!
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2007.09.30;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.041 c