lazarus 使用Delphi的dll导出类的问题
Delphi的DLL导出类的方法,无外乎就是利用TClass的特性,就是,定义要导出类的Class类,即比如说,要导出的类是TMyObject,那么就定义
TMyObjectClass=class of TMyObject
在导出函数里面,使用TMyObjectClass变量,可以在参数里面使用var或者直接返回。
类似于
function GetMyObject(var MyClass:TMyObjectClass):Boolean;stdcall;
或者
function GetMyObject:TMyObjectClass;stdcall;
在Lazarus里面,声明函数为
type TGetMyClass = function(var MyClass:TMyObjectClass):Boolean ; stdcall;
使用方法
function LoadModule(var ErrMsg: string): boolean; var objClass: TMyObjectClass; GetClass: TGetMyClass; const LIB_FILENAME='pModule.dll'; FUNC_GETVOICECALL='GetMyObject'; begin Result := False; if not FileExists(LIB_FILENAME) then begin ErrMsg:='模块库文件不存在 '; exit; end; try FHandle := LoadLibrary(LIB_FILENAME); except on e: Exception do begin ErrMsg:='载入模块错误:' + e.Message; Exit; end; end; if FHandle <= 0 then Exit; Pointer(GetClass) := GetProcAddress(FHandle, FUNC_GETVOICECALL); if not Assigned(GetClass) then Exit; if not GetClass(objClass) then //调用dll函数,获得TMyObjClass(1) exit; FMyObj := objClass.Create; //根据类创建对象 (2) if Assigned(FMyObj) then Result := True; end;
上面的代码,在Delphi中,可以正确运行,可是,在Lazarus中呢,有问题:
在运行到(2)的时候,会出现“external sigsgev”的错误,跟踪调试,可以发现,运行完(1)的时候,
objClass的值是没有的,提示是“record<incomplete type>”,然后,在往下,就出错了。
具体原因还没有找到,估计是类型转换的问题吧。
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。