我正在尝试迁移使用c ++ builder构建的应用程序。我们的客户希望我们导入VCL功能,而不是因为时间限制而找到.net等价物或创建一个新的功能。
我试图将具有AnsiString作为返回和参数的rtl100.bpl的ExtractRelativePath函数设为pinvoke。然后我使用IntPtr传递并获取字符串,但是在调用API时会发生AccessViolationException。
这是来自rtl100.bpl的函数原型
PACKAGE AnsiString __fastcall ExtractRelativePath(const AnsiString BasrName, AnsiString DestName);
这就是我对它的描述。
[DllImport("rtl100.bpl", EntryPoint = "@Sysutils@ExtractRelativePath$qqrx17System@AnsiString1", CallingConvention = CallingConvention.Cdecl)]
Internal static extern IntPtr ExtractRelativePath(IntPtr BaseName, IntPtr DestName);
当然,我将使用thr marshal类分配和释放intptrs。
问题是,delphi库真的可以在c#中使用吗?它的大部分API都使用AnsiString,这是一个原生的delphi字符串。或者我们应该开始考虑使用.net函数?
由于
答案 0 :(得分:3)
您有多个问题:
AnsiString
是Delphi特定类型,无法传递到其他工具链或从其他工具链传递。 我认为您可能需要重新调整客户的期望。你所尝试的是不可行的。