Delphi ntextcat - 如何实现

Delphi ntextcat - how to implement

我正在尝试访问 Delphi 2007 年的 ntextcat dll。

注册 dll 失败(我试过 32 位和 64 位 regsvr32)。 在 Delphi 中导入类型库也失败了(作为 .dll 和 .Net)。

是否有人在 Delphi 内访问了 ntextcat?

这是一个 .net 库。因此,它不容易从非托管代码(如 Delphi)访问。如果你确实想从 Delphi 使用它,你需要创建一个包装器。例如,使用以下其中一项:

  • COM接口。
  • 包装托管库并公开非托管接口的混合模式 C++/CLI 程序集。
  • 基于 Robert Giesecke 的 UnmanagedExports 的包装器。

后两者允许您将 .net 程序集用作本机 DLL。

如果库具有丰富而广泛的接口,那么包装它的任务就不会非常简单或方便。您最好找到一个更易于使用的不同库。

如果库的接口很小,或者您只需要它的一小部分功能,那么制作包装器可能更容易处理。

根据 David 的回答(感谢您为我指明了正确的方向),这是使用 Robert Giesecke 的 UnmanagedExports 的解决方案:

C#(注意将平台目标设置为与 Delphi 应用程序目标相同!不要使用 "AnyTarget"!)

using RGiesecke.DllExport;
using System.Runtime.InteropServices;

namespace ClassLibrary1
{
    public class Class1
    {
       [DllExport("testfunc", CallingConvention = CallingConvention.StdCall)]
       public static int anytest(int iInt) {
          return iInt;
       }
    }
}

Delphi来源:

Type
   Ttest = function(const iInt: Integer): Integer; stdcall;

procedure TForm1.btTestClick(Sender: TObject);
var
   Handle: Integer;
   test  : Ttest;
begin
   Handle := LoadLibrary(<PathToDLL>ClassLibrary1.dll');

   if Handle <> 0 then begin
      @test := GetProcAddress(Handle, 'testfunc');
      if @test <> NIL then ShowMessage(IntToStr(test(1234)));
   end;
end;

基于此可以访问 ntextcat .net 库。