C# 调用 C++ dll出错
来源:互联网 发布:nec投影机网络投影 编辑:程序博客网 时间:2024/05/22 04:49
由于各自使用的调用规则不同,导致DLL回调或C#调用返回时系统直接calldown,可能原因如下:
并不是所有的语言都支持_cdcel调用规则,但是都支持_sdtcall调用规则, 假如你用VC做了一个DLL,导出了某些函数,如果你想这个DLL被其他语言也能调用的话,VB.DEPHI.PB..你的把他的调用约定声明为__stdcallwindows api都是_stdcall调用规则,函数调用约定确定一个程序如何实现一个函数调用及参数如何传递。在单一语言程序中,调用约定几乎总是正确的,这是因为对所有模块总有一个缺省的约定并且头文件会负责调用和被调用程序之间的一致性。在一个混合语言程序中,不同的语言不可能分享同一个头文件。由于调用约定而产生的错误在编译时无法发现,直到程序在运行时(run-time)实现函数调用时才出现并会立即导致应用程序崩溃。
关键字 栈的维护者 参数传递
__cdecl 调用者 参数反序入栈(右-> 左)
__stdcall 被调用者 参数反序入栈(右-> 左)
__fastcall 被调用者 参数先存寄存器,接着入栈
thiscall(并非关键字) 被调用者 参数入栈,this指针存ECX
在C++中,可以在函数声明或定义时用关键字__stdcall指定调用约定。__stdcall调用约定经常在Windows程序或API函数中使用。在GUI程序中,PASCAL、WINAPI和CALLBACK都被定义为__stdcall。C语言的缺省调用约定为__cdecl。
__stdcall产生的名字修饰是将名字符号前加下划线(_),并且后加”@”和函数参数字节数(所需栈空间)
列如:
<在C++中如下定义>
#define APPWINAPI __stdcall
typedef void (APPWINAPI *FunOnRspUserLogin)(CFfexFtdcRspUserLoginField *pRspUserLogin, CFfexFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
<C#调用时必须如下声明调用约定>
[UnmanagedFunctionPointer(CallingConvention.StdCall, CharSet = CharSet.Ansi)]
public delegate void FunOnRspUserLogin(ref CFfexFtdcRspUserLoginField rspUserLogin, ref CFfexFtdcRspInfoField rspInfo, int nRequestID, bool bIsLast);
- C#调用DLL函数出错
- C# 调用 C++ dll出错
- C#调用C++DLL
- C#调用C++dll
- C#调用C++dll
- C#调用C++DLL
- c#调用c++DLL
- C# 调用C++dll
- C#调用C++DLL
- C#调用C++DLL
- C#调用C++DLL
- C#调用C++Dll
- C#调用C++DLL
- C#调用C、C++dll
- C#调用C(C++)dll示例教程,包含dll找不到函数入口的解决办法,包含C#dll调用方式不对出错的解决办法
- CallbackOnCollectedDelegate was detected C#调用C++DLL注册函数指针出错解决方案
- C#调用C的DLL
- C#动态调用C++DLL
- URL在线转义
- Android下拉刷新的ListView制作
- COGS182. [USACO Jan07] 均衡队形
- 简单的计算器程序 c++
- 如何写好代码
- C# 调用 C++ dll出错
- asp.net在IIS环境中访问第三方需数字证书接口时 报 “请求被中止: 未能创建 SSL/TLS 安全通道”
- node-inspector 调试nodejs
- 两台Linux机器,使用NFS(Net File Systerm)挂载共享文件夹
- Http协议详解
- android---(webService)
- Android sdk content loader 0%的解决方案
- 换个新号 重新开始
- java中的一些对XML的操作与方法