创建一个包含外部dll函数的Delphi类

创建一个包含外部dll函数的Delphi类,delphi,Delphi,我需要创建一个这样的类 unit Classname; interface type TSomeClass = class public member1 : SomeType; member2 : AnotherDataType; .... function SomeFunction: SomeType; stadcall;external 'ExternalDll.dll'; end; 能做到吗 如何从

我需要创建一个这样的类

unit Classname;
interface
type

     TSomeClass = class
     public
       member1  : SomeType;
       member2  : AnotherDataType;


       ....
       function SomeFunction: SomeType; stadcall;external 'ExternalDll.dll';

 end;
能做到吗

如何从Delphi中的类声明外部函数(存储在c dll中)

我用的是Delphi7


提前感谢

外部函数不能作为类声明的一部分。您需要声明具有全局作用域的外部函数,并安排类的方法调用该外部函数

您可以使用如下伪方法创建一个类:

type
  TMyDllClass = class
  public
    NameOfDllEntryPoint: TFunctionTypeOfDllEntryPoint;
    constructor Create;
  end;

constructor TMyDllClass.Create;
begin
  inherited Create;
  LibHandle := LoadLibrary('path\to.dll');
  @NameOfDllEntryPoint := GetProcAddress(LibHandle, 'NameOfDllEntryPoint');
end;

MyDllClass := TMyDllClass.Create;
MyDllClass.NameOfDllEntryPoint(some, parameters);
这工作得很好,我已经做过多次了,例如针对mitab.dll、libjpeg_turbo.dll和其他dll。其思想是减少名称空间与全局函数的混乱


注意:为了清楚起见,我省略了任何错误处理(例如,如果DLL无法加载或没有入口点)。在本例中,这将导致访问冲突,因为NameOfDelentryPoint字段尚未初始化。

为什么希望外部例程成为类的成员?通常,它们是全球性的。查看一下Windows.pas并检查如何导入
MessageBox等
。我很确定这根本不可能。对于这种行为,您需要为类的每个实例加载一个单独的库实例,这本身是不可能的,因为从同一进程到同一DLL多次调用
LoadLibrary
会重复使用同一实例。感谢您的支持answers@jerry内部方法没有每个对象一个代码实例instance@DavidHeffernan对,但我不是这个意思。我指的不是这些方法的实例,而是整个类的实例。感谢您的回答,我本人从未将字段直接放在类的
public
部分。它们应该仅位于
private
部分,然后由实际函数包装,该函数反过来调用函数指针。这将确保此类类成员保持只读。它甚至不会编译-字段必须在方法之前。@Jerrydoge:如果将它们放在新的公共块中,它会起作用。@Rudy True,但不是这个答案的编写方式。只是指出而已。@Jerrydoge我没有试着编译那段代码。我认为没有必要,但现在已经改变了顺序。关于在公共部分中不包含字段:将字段移动到私有部分,并创建访问该字段的公共只读属性。问题解决了。