【发布时间】:2015-03-16 07:53:07
【问题描述】:
我正在尝试从 Delphi 2007 访问 ntextcat dll。
注册 dll 失败(我尝试过 32 位和 64 位 regsvr32)。 在 Delphi 中导入类型库也失败了(如 .dll 和 .Net)。
有没有人可以在 Delphi 中访问 ntextcat?
【问题讨论】:
标签: delphi dll delphi-2007
我正在尝试从 Delphi 2007 访问 ntextcat dll。
注册 dll 失败(我尝试过 32 位和 64 位 regsvr32)。 在 Delphi 中导入类型库也失败了(如 .dll 和 .Net)。
有没有人可以在 Delphi 中访问 ntextcat?
【问题讨论】:
标签: delphi dll delphi-2007
这是一个 .net 库。因此,它不容易从 Delphi 等非托管代码中访问。如果您确实想从 Delphi 使用它,您需要创建一个包装器。例如,使用以下方法之一:
后两者允许您将 .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;
}
}
}
德尔福源码:
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 库。
【讨论】: