提问:关于DLL的调用出错问题 ( 积分: 50 )

  • 主题发起人 主题发起人 小鱼鱼
  • 开始时间 开始时间

小鱼鱼

Unregistered / Unconfirmed
GUEST, unregistred user!
我做了一个DLL,作为一个模块,里面只有一个FORM(fsNormal)处理数据库数据。
我在一个主叫程序里,只有菜单(fsNormal),然后在菜单里面调用该DLL模块,但不知为什么调用出错。代码如下,不知道是什么原因!
........................
procedure TfrmMain.nFJClick(Sender: TObject)
///主叫程序
begin
//--调用DLL--
dllshowform('fj','shWl',xtcs);
end;
//.....
type wl = procedure (cs:txtcs)
stdcall;
......
procedure dllshowform(dllname:pchar;pname:pchar;cs:txtcs)

var
DllHandle: THandle;
ProcAddr: FarProc;
ProvaChild: wl;
begin
DllHandle := LoadLibrary(dllname);
ProcAddr := GetProcAddress(DllHandle, pname);
try
if ProcAddr <> nil then
begin
ProvaChild := ProcAddr;
ProvaChild(cs);
end;
finally
FreeLibrary(DllHandle);
end;
end;
................
//-----fj.dll代码----
procedure shWl(AHandle:THandle;cs:txtcs)
export
stdcall;
var
frmFJ: TfrmFJ;
begin
Application.Handle:=AHandle;
frmFJ:=TfrmFJTD.Create(Application);//---这里就出错
try
frmFJ.Caption:='XXXXXX';
frmFJ.ShowModal;
xtcs:=cs;
finally
frmFJ.Free;
end;
end;
------------------------
公共变量
type
tXTCS=record
s1:string

s2:string

...........
end;
能帮忙看看哪里出了问题?
 
我做了一个DLL,作为一个模块,里面只有一个FORM(fsNormal)处理数据库数据。
我在一个主叫程序里,只有菜单(fsNormal),然后在菜单里面调用该DLL模块,但不知为什么调用出错。代码如下,不知道是什么原因!
........................
procedure TfrmMain.nFJClick(Sender: TObject)
///主叫程序
begin
//--调用DLL--
dllshowform('fj','shWl',xtcs);
end;
//.....
type wl = procedure (cs:txtcs)
stdcall;
......
procedure dllshowform(dllname:pchar;pname:pchar;cs:txtcs)

var
DllHandle: THandle;
ProcAddr: FarProc;
ProvaChild: wl;
begin
DllHandle := LoadLibrary(dllname);
ProcAddr := GetProcAddress(DllHandle, pname);
try
if ProcAddr <> nil then
begin
ProvaChild := ProcAddr;
ProvaChild(cs);
end;
finally
FreeLibrary(DllHandle);
end;
end;
................
//-----fj.dll代码----
procedure shWl(AHandle:THandle;cs:txtcs)
export
stdcall;
var
frmFJ: TfrmFJ;
begin
Application.Handle:=AHandle;
frmFJ:=TfrmFJTD.Create(Application);//---这里就出错
try
frmFJ.Caption:='XXXXXX';
frmFJ.ShowModal;
xtcs:=cs;
finally
frmFJ.Free;
end;
end;
------------------------
公共变量
type
tXTCS=record
s1:string

s2:string

...........
end;
能帮忙看看哪里出了问题?
 
frmFJ:=TfrmFJTD.Create(Application);//---这里就出错

=======> frmFJ:=TfrmFJTD.Create(nil);
是否应该这样?>
 
也不行。。。。。
下面代码也试过,也不行,DLL出错,句柄问题吗?
procedure shWlyw(owner:TForm;cs:txtcs)
export
stdcall;
var
frmFJ: TfrmFJTD;
DllProc: Pointer;
begin
//Application.Handle:=AHandle;
frmFJTD:=TfrmFJTD.Create(owner);
try
frmFJTD.Caption:='xxxx;
frmFJTD.ShowModal;
xtcs:=cs;
finally
frmFJTD.Free;
end;
end;

procedure DLLUnloadProc(Reason: Integer)
register;
begin
if Reason = DLL_PROCESS_DETACH then Application:=DllApplication;
end;

exports
shWlyw;

begin
DllApplication:=Application;
DLLProc := @DLLUnloadProc;
end.
 
动态调用你去掉StdCall;
 
呵呵,找到原因了,顺序问题,也是torasession没有传递!
 
好好调试一下,就可以解决问题!
 
后退
顶部