DLL 动态调用的问题!(100)

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

fwd

Unregistered / Unconfirmed
GUEST, unregistred user!
用接口封装类.以下静态调用没有问题. function CreateDBTreeForm(DataSet:TDataSet; FieldCode,FieldName, LevelStru,TreeMean:string):IDBTree; stdcall; external 'DBTree.DLL';可用动态调用出现 EAccessViolation错误,存储地址违例. 不知为什么? 请大伙帮忙.以下是动态装载DLL代码:type TCreateDBTreeForm=function(DataSet:TDataSet; FieldCode,FieldName,LevelStru,TreeMean:PChar):IDBTree; stdcall; {返回管理树形TreeForm信息的接口} function CreateDBTreeForm(DataSet:TDataSet; FieldCode,FieldName,LevelStru,TreeMean:PChar):IDBTree; ...implementationfunction CreateDBTreeForm(DataSet:TDataSet; FieldCode,FieldName,LevelStru,TreeMean:PChar):IDBTree;var Handle: THandle; Link: TCreateDBTreeForm;begin Handle := LoadLibrary('DBTree.DLL'); Try if Handle <> 0 then begin @Link:=GetProcAddress(Handle, PChar('CreateDBTreeForm')); if Assigned(@Link) then result:=Link(DataSet,PChar(FieldCode),PChar(FieldName), PChar(LevelStru),PChar(TreeMean)); end else BoxError('找不到文件 DBTree.DLL!'); finally FreeLibrary(Handle); end;end;调用代码: ITree:=CreateDBTreeForm(ADOQuery1, PChar('Office'),PChar('Name'),PChar('122'),PChar('部门')); ITree.ShowWithModal(False);
 
end else1 BoxError('找不到文件 DBTree.DLL!');2 finally3 FreeLibrary(Handle);4 end;end;用单步踪执行到4时,出现错误。
 
在调用的工程与DLL工程中都加和ShareMem单元再试试,注意,你调用DLL的工程中一定要加ShareMem单元的,因为你用到了String类型
 
楼上说的没错,而且是两边都要加sharemem,放在所有引用单元的最前面~~
 
你可真能逗,接口还没用完,就把动态库释放了,[:D]
 
result :=nil; //新增一行FreeLibrary(Handle);
 
对于ShareMem我倒是没用,我用的是FastShareMem有资料称,这个更好用些,发布时不须用有borlandmm.dll文件。tseug: 你可真能逗,接口还没用完,就把动态库释放了,这个让我茅塞顿开:是呀,接口不同于其它类型变量,调用完后即可释放,这个接口还要继续用呀。我试试!
 
无语,大富翁把A贴的回复给B帖了。关闭算了。
 
地质灾害(如果有rmb报酬,有人会回答的)我是在邮箱看到的。说吧,开个价.
 
finally FreeLibrary(Handle); 晕死你创造主体都释放了 返回的对象怎么可能还存在 FreeLibrary(Handle); 去掉就好了 释放也只能是先释放接口在是dll
 
多人接受答案了。
 
后退
顶部