使用指针类型从C#调用Delphi DLL时的PInvokeStackImbalance

时间:2012-08-09 18:21:29

标签: c# delphi pointers dll

我试图用C#调用Delphi开发的外部提供的DLL。但是,在尝试传递Delphi类型“指针”的参数时调用函数时,似乎总是会出现堆栈不平衡错误。

以下是DLL开发人员提供的定义:

procedure SetSeparator( const aIsEuropean: Pointer ); stdcall; 
  external 'DLLName.dll';

我在C#中的前瞻声明是:

[DllImport(EXPERT_RT_NAME, EntryPoint = "SetSeparator", 
      CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] 
public static extern void SetSeparator(string strSeparator);

在C#中调用此代码的代码是:

string s = "1";
SetSeparator(s);

调用时,收到的错误是:

  

对PInvoke函数':: SetSeparator'的调用使堆栈失衡。这很可能是因为托管PInvoke签名与非托管目标签名不匹配。检查PInvoke签名的调用约定和参数是否与目标非托管签名匹配。

指定了调用约定,所以我很确定没问题。我认为参数是问题吗?

我尝试使用IntPtr更改PInvoke编组,并更改参数周围的各种选项。还有另一个(无参数)调用似乎有效(但直到我可以用这个和其他几个类似的调用来初始化DLL,我无法确定)。

另外,我有一些调用,我需要传递指针以便接收信息。

希望有人可以提供帮助,因为我已经花费了大量时间来重新解决这个问题,尽管我可以看到所有相关的内容并且没有选择。

遗憾的是,我无法访问Delphi代码的源代码。

0 个答案:

没有答案