对 PInvoke 函数“”的调用导致堆栈不对称

jun1986129x 2011-03-14 02:40:44
[DllImport("DSStream.dll", EntryPoint = "DSStream_Initialize")]
public static extern bool DSStream_Initialize();
[DllImport("DSStream.dll", EntryPoint = "DSStream_Uninitialize")]
public static extern void DSStream_Uninitialize();
[DllImport("DSStream.dll", EntryPoint = "DSStream_ConnectDevice")]
public static extern bool DSStream_ConnectDevice(int iCardID, bool bOverlay, IntPtr hParentWnd);

bool num = SdkApi.DSStream_Initialize();


SdkApi.DSStream_ConnectDevice(0, false, this.Handle);

对 PInvoke 函数“Demo!Demo.SdkApi::DSStream_ConnectDevice”的调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配



本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/jun1986129x/archive/2011/03/14/6248272.aspx
...全文
2492 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
llf88741358 2013-11-02
  • 打赏
  • 举报
回复
添加属性:CallingConvention=CallingConvention.Cdecl http://blog.csdn.net/wjeson/article/details/8263320
Acc2013 2013-04-01
  • 打赏
  • 举报
回复
引用 4 楼 mizuho_2006 的回复:
WinAPI的long类型是32位的,而C#的long是64位的,会引发PInvokeStackImbalance错误。因此需要将原来的long类型改……
++
mizuho_2006 2012-05-29
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
应该是DSStream_ConnectDevice参数的数据类型声明不对
我曾经碰到过,在自己的机器上声明为long,运行没问题,换了台机器后就报签名不匹配,换成int就没事了
一直很费解
[/Quote]

WinAPI的long类型是32位的,而C#的long是64位的,会引发PInvokeStackImbalance错误。因此需要将原来的long类型改为int类型,C#中int是32位的
xiaoqianfxl 2012-05-29
  • 打赏
  • 举报
回复
我也遇到了这个问题,不知道怎么办才好啊?????????
paopaozhu8899 2011-03-14
  • 打赏
  • 举报
回复
应该是DSStream_ConnectDevice参数的数据类型声明不对
我曾经碰到过,在自己的机器上声明为long,运行没问题,换了台机器后就报签名不匹配,换成int就没事了
一直很费解
lizhibin11 2011-03-14
  • 打赏
  • 举报
回复
int iCardID, bool bOverlay改成short iCardID, short bOverlay
调用时
SdkApi.DSStream_ConnectDevice(0, 0, this.Handle);

111,077

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧