日期:2014-05-17  浏览次数:21088 次

c#调用c++ DLL库函数 签名不匹配 求大神
这是dll中定义的函数

void   JVS_SetVideoPreview(intnChannel, HWND hWnd, RECT rtWindow, BOOL bPreview);


下面是我在c#中写的对应的函数

[DllImport("JVSDK.dll", EntryPoint = "JVS_SetVideoPreview", CallingConvention = CallingConvention.Cdecl)]
        public static extern void JVS_SetVideoPreview(int nChannel, IntPtr hWnd, Rectangle rtWindow, bool bPreview); 


报以下错误
 对 PInvoke 函数“AutoCount!AutoCount.JVSDK::JVS_SetVideoPreview”的调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配。 


请高手帮忙

------解决方案--------------------
CallingConvention = CallingConvention.stdcall
------解决方案--------------------
方法1 
修改dll,将rtWindow 参数改为指针类型RECT* 
方法2 
C#这边rtWindow改为4个int参数传递 dll那边不改动
------解决方案--------------------
Rectangle rtWindow
Rectangle和RECT不兼容。自己定义一个原型。
------解决方案--------------------
引用:
Rectangle rtWindow
Rectangle和RECT不兼容。自己定义一个原型。


+1

[StructLayout(LayoutKind.Sequential)]
public struct RECT {
public int Left;
public int Top;
public int Right;
public int Bottom;
}


Api_Exp [.net下的api查看工具]
需要安装.net framework 1.1