【发布时间】:2011-05-23 17:27:04
【问题描述】:
我在调用的 delphi 2007 函数中有这个签名(SomeOtherFile 是另一个它调用的 DLL):
function MyFunction(Place, Name: PChar):_Recordset; stdcall; far; external 'SomeOtherFile.DLL';
我正在尝试从 C# 代码中调用它,如下所示:
[DllImport("MyFile.dll", CallingConvention = CallingConvention.StdCall,
CharSet = CharSet.Ansi, EntryPoint="MyFunction")]
public static extern DataSet MyFunction(string Place, [MarshalAs(UnmanagedType.LPStr)]string Name);
每当我运行它并将其存储到变量中时,我都会收到有关类型不匹配的运行时错误。我想我读错了签名,但我不知道它应该是什么。
编辑 实际错误是:调用 PInvoke 函数 [...] 使堆栈不平衡...我也尝试使用 MarshalAs 属性的两个参数,但它抛出了同样的事情。
【问题讨论】:
-
“类型不匹配”通常是编译时错误,而不是运行时错误。你能引用错误文本并告诉我们你得到的错误的类名吗?另外,是什么让您认为第二个参数需要特别编组,而第一个参数不需要?
MyFunction对这些指针有什么作用? (它是写入缓冲区,还是只读取缓冲区?)最后,DataSet和_Recordset是什么? -
很难看到 P/Invoke 编组器匹配
_Recordset和DataSet!您也不需要MarshalAs属性,但这是一个细微差别。 -
@Dan 为什么你在
Name参数中使用MarshalAs而不是Place,如果两个参数类型相同? -
@RRUZ 但您也不需要它,因为它是字符串参数的默认编组。此外,同一类型的两个参数可能需要不同的编组:考虑一个 IN PChar 参数和一个 OUT PChar 参数。
-
@David 但在这种情况下,函数被声明为
function MyFunction(Place, Name: PChar)而不是function MyFunction(Place, var Name: PChar)所以我想知道如果两个参数都相等,为什么 OP 使用MarshalAs。
标签: c# delphi delphi-2007