当前位置:编程学习 > C#/ASP.NET >>

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

   [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 --------------------编程问答-------------------- int iCardID, bool bOverlay改成short iCardID, short bOverlay
调用时
SdkApi.DSStream_ConnectDevice(0, 0, this.Handle); --------------------编程问答-------------------- 应该是DSStream_ConnectDevice参数的数据类型声明不对
我曾经碰到过,在自己的机器上声明为long,运行没问题,换了台机器后就报签名不匹配,换成int就没事了
一直很费解 --------------------编程问答-------------------- 我也遇到了这个问题,不知道怎么办才好啊????????? --------------------编程问答--------------------
引用 2 楼  的回复:
应该是DSStream_ConnectDevice参数的数据类型声明不对
我曾经碰到过,在自己的机器上声明为long,运行没问题,换了台机器后就报签名不匹配,换成int就没事了
一直很费解


WinAPI的long类型是32位的,而C#的long是64位的,会引发PInvokeStackImbalance错误。因此需要将原来的long类型改为int类型,C#中int是32位的 --------------------编程问答--------------------
引用 4 楼 mizuho_2006 的回复:
WinAPI的long类型是32位的,而C#的long是64位的,会引发PInvokeStackImbalance错误。因此需要将原来的long类型改……


++
--------------------编程问答--------------------  添加属性:CallingConvention=CallingConvention.Cdecl
http://blog.csdn.net/wjeson/article/details/8263320
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,