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>”,然后,在往下,就出错了。

 

具体原因还没有找到,估计是类型转换的问题吧。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据