Delphi---关于在线程单元中调用动态链接库的问题 ( 积分: 100 )

  • 主题发起人 主题发起人 czs1984
  • 开始时间 开始时间
C

czs1984

Unregistered / Unconfirmed
GUEST, unregistred user!
大家好,我最近编写的一个程序需要在Delphi的线程单元中调用一个C++编写的动态链接库,在exe程序中我已经调用了这个动态库没有问题,但是在线程单元里调用这个动态库在Execute过程退出的时候出现一个access violation错误。好像是某个内存地址不可读。下面是我的线程单元的代码,请大家看一下,我第一次写这样的程序,写的可能有问题,请帮指点一下。谢谢。
procedure THLoginThread.Execute;
type
//显示调用链接库
tthauth_authen
ticate2userinfo_pin = function(serverip: PChar;
serverport: Integer;
appkey: PChar;
user: PChar;
pin: PChar;
userinfo: p_userinfo): Integer;
stdcall;
//登录接口
var
TpLogin: TFarProc;
ILoginResult: Integer;
pUserinfo: p_userinfo;
Test: tthauth_authen
ticate2userinfo_pin;
begin

{ Place thread code here }
EnterCriticalSection(OraCS);
//进入临界区
FreeOnTerminate := True;
try
Th := LoadLibrary( 'thauth.dll ');
//加载动态链接库
TpLogin := GetProcAddress(Th, 'thauth_authen
ticate2userinfo_pin ');
New(pUserinfo);
@Test := TpLogin;
if @Test <> nil then

//断点调试过,就是下面这句话执行之后在退出这个过程的时候有问题,下面这句话执行通过了,返回值也对。
ILoginResult := Test(PChar( '166.111.4.125 '), 3335, PChar( 'ICCARD:abcd1234 '), PChar(Tid), PChar(Tpwd), pUserinfo);
THLoginCheckResult := pUserinfo^.code;
Dispose(pUserinfo);
TpLogin := nil;
FreeLibrary(Th);
except
THLoginCheckResult := -1;
end;

Synchronize(GiveResult);
LeaveCriticalSection(OraCS);
//退出临界区
end;
 
把LoadLibrary和FreeLibrary放到线程外面去做
你这样搞在并发的时候可能会重复释放.
还有,这个临界区的使用,OraCS如果是THLoginThread的成员,这样调用是不起任何作用的
他应该是一个全局的变量
我觉得静态调用就可以了,一点个人意见
 
非常感谢您的答复。嗯,我改成静态调用了。OraCS是个全局变量。这个调用过程我反复修改了几次,发现将“pUserinfo”改成“@Userinfo”就可以调用了。另外我想问一下,如果想把调用结果返回给主线程,应该怎么做比较好?
 
接受答案了.
 
后退
顶部