在线程中调用dll,应该注意什么问题?为什么我调用完毕后,线程中的对象都指针错误了呢?(200分)

  • 主题发起人 主题发起人 fbyang
  • 开始时间 开始时间
F

fbyang

Unregistered / Unconfirmed
GUEST, unregistred user!
线程里原本有一个指向Record的指针,在调用Dll(动态装载)后,再使用原来的指针,就不能用了,报地址错啊!
继续补充:
调用函数是这样的:
dll函数声明:
type
TRuleCallDLL = function(MobileNum,SMSContent:PChar;HappenTime:double ): Integer;
PSMS = ^TSMS ;
TSMS = Record
MobileNum:AnsiString ;
SMSContent:AnsiString ;
HappenTime:double ;
end ;
线程主函数创建完指针对象后,给这个对象赋了值,然后调用CallDll
callDll('project1.dll','test',pSMS1^.MobileNum,pSMS1^.SMSContent,pSMS1^.Happentime) ;
当调用完毕后,我的pSMS1就再也不能用了。

CALLdll的实现是这样的:
function TXXXThread.CallDLL(dllName,funcName,MobileNum,
SMSContent: AnsiString;Happentime: TDatetime): Boolean;
var
dllhandle:THandle ;
proc:TFarProc ;
begin
Result := false ;
dllhandle:=Loadlibrary(PChar(dllName));
If dllhandle<32 then
Exit ;
proc := GetProcAddress(dllhandle,Pchar(funcName)) ;
try
TRuleCallDLL(proc)(PChar(MobileNum),PChar(SMSContent),Double(HappenTime)) ;
result := true ;
except
on e:Exceptiondo
;
end ;
FreeLibrary(dllhandle) ;
end;

不仅仅这个指针对象没有了,还有一些TList对象,好像内容也出错了,出现Index outof bound等错误。请大虾帮忙吧,我算晕菜了。
 
你的表达不是很清晰啊
如果不想被改
你可以复制一份然后传入DLL
 
dll函数声明改为:
type
TRuleCallDLL = function(MobileNum,SMSContent:PChar;HappenTime:double ): Integer;stdcall;
 
终于有人给我答案了!
 
后退
顶部