【问题标题】:Delphi ntextcat - how to implementDelphi ntextcat - 如何实现
【发布时间】:2015-03-16 07:53:07
【问题描述】:

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

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

有没有人可以在 Delphi 中访问 ntextcat?

【问题讨论】:

    标签: delphi dll delphi-2007


    【解决方案1】:

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

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

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

    如果库具有丰富而广泛的界面,那么包装它的任务如果不是非常容易或方便的话。您可能会更好地找到一个更易于使用的不同库。

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

    【讨论】:

    • 嗨,大卫,感谢您的回复。与此同时,我已经检查了 Delphi XE2。它找到了选项“导入组件”->“导入 .NET-Assembly”。但这也不起作用。也许将 .net 库包装在一个小的 C# dll 中更容易......
    • 最简单的将是 UnmanagedExports。您只想提供一些文本并返回候选语言列表。这可能是一个单一的电话。在 Delphi 端使用 WideString。 UnmanagedType.BStr 在托管端。如果你以前做过,大约需要 15 分钟,但你可能需要先做很多学习!
    • FWIW:有一个C library。正如大卫所写的那样,这可能是一条更容易的道路。
    • 好的,我试试看:-)
    【解决方案2】:

    根据 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;
           }
        }
    }
    

    德尔福源码:

    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 库。

    【讨论】:

      猜你喜欢
      • 2011-03-19
      • 2011-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-18
      • 2013-04-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多