将类成员映射到外部dll托管函数是否正确?

将类成员映射到外部dll托管函数是否正确?,dll,delphi-7,Dll,Delphi 7,假设我有一个Dlldll1.Dll,它导出一个具有此签名的函数: procedure Foo(Value: Integer); cdecl; 在我的应用程序中,我需要实例化2个使用此dll的独立对象。 我无法重写这样的dll,而且它不是线程安全的,所以我必须将它用作一种“对象”,插入我的鼻子并复制dll文件,这样我们现在就有了:dll1.dll和dll2.dll 现在我正在编写以下代码: type T_Foo: procedure(Value: Integer); cdecl; cl

假设我有一个Dll
dll1.Dll
,它导出一个具有此签名的函数:

procedure Foo(Value: Integer); cdecl;
在我的应用程序中,我需要实例化2个使用此dll的独立对象。 我无法重写这样的dll,而且它不是线程安全的,所以我必须将它用作一种“对象”,插入我的鼻子并复制dll文件,这样我们现在就有了:
dll1.dll
dll2.dll

现在我正在编写以下代码:

type
  T_Foo: procedure(Value: Integer); cdecl;

  class TMyClass(TObject) 
  private
    FDllHandle: THandle;
    Foo: T_Foo;
  public
    constructor Create(const dllName: String);
    destructor Destroy; override;
    procedure DoFoo(Value: Integer); 
  end;

[...]

constructor TMyClass.Create(const dllName: String);
begin
  FDllHandle := LoadLibrary(PChar(dllName));
  if (FDllHandle = 0) then
    RaiseLastOSError; 
  @Foo := GetProcAddress(FDllHandle, '_Foo'); 
end;

destructor TMyClass.Destroy;
begin
  if (FDllHandle <> 0) then
    Freelibrary(FDllHandle);
  inherited;
end;

procedure TMyClass.DoFoo(Value: Integer);
begin
  Foo(Value);
end;
我觉得这些调用是正确的,完全独立的,因为这些方法都调用一个标准过程,其地址是从两个不同的DLL获得的


还是我遗漏了什么?

我觉得不错。你真的有问题吗?谢谢你,雷米。不,问题似乎出在dll中,但当我编写dll时,我通常使用标准函数编写接口单元,然后如果需要,我将它们包装在类的层次结构中。我没有编写那些dll和接口单元,也从未在成员类中直接使用过这样的过程类型。因此,考虑到这个“多实例”dll的特殊性质,我需要确保这些映射按照我的预期工作。。。
MyObj1 := TMyClass.Create('dll1.dll');
MyObj2 := TMyClass.Create('dll2.dll');

MyObj1.DoFoo(10);  
MyObj2.DoFoo(20);