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

简介: 调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配

作者推荐

【动态规划】C++算法312 戳气球

关键字:

函数调用约定 混合编程 __stdcall c++ WINAPI APIENTRY _cdecl

调用方出错提示如下:

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

可能原因:

修改之前的C++定义:

extern “C” __declspec(dllexport) void G(int a);
void G(int a)
{
}
改成:
修改之后的C++定义:
extern “C” __declspec(dllexport) void _stdcall G(int a);
void _stdcall G(int a)
{
}

原因

__stdcall是函数调用约定的一种,函数调用约定主要约束了两件事:

1.参数传递顺序

2.调用堆栈由谁(调用函数或被调用函数)清理

常见的函数调用约定:stdcall cdecl fastcall thiscall naked call

__stdcall表示

1.参数从右向左压入堆栈

2.函数被调用者修改堆栈

3.函数名(在编译器这个层次)自动加前导的下划线,后面紧跟一个@符号,其后紧跟着参数的尺寸

在win32应用程序里,宏APIENTRY,WINAPI,都表示_stdcall,非常常见。

其它函数调用约定

_fastcall 是编译器指定的快速调用方式。由于大多数的函数参数个数很少,使用堆栈传递比较费时。因此_fastcall通常规定将前两个(或若干个)参数由寄存器传递,其余参数还是通过堆栈传递。不同编译器编译的程序规定的寄存器不同。返回方式和_stdcall相当。

_thiscall 是为了解决类成员调用中this指针传递而规定的。_thiscall要求把this指针放在特定寄存器中,该寄存器由编译器决定。VC使用ecx,Borland的C++编译器使用eax。返回方式和_stdcall相当。

_fastcall 和 _thiscall涉及的寄存器由编译器决定,因此不能用作跨编译器的接口。所以Windows上的COM对象接口都定义为_stdcall调用方式。

C中不加说明默认函数为_cdecl方式(C中也只能用这种方式),C++也一样,但是默认的调用方式可以在IDE环境中设置。


相关文章
|
存储 C语言
C语言学习记录——动态内存函数介绍(malloc、free、calloc、realloc)
C语言学习记录——动态内存函数介绍(malloc、free、calloc、realloc)
1992 1
|
存储 前端开发 安全
现货量化合约跟单交易所系统开发逻辑策略及源码示例
现货量化合约跟单交易所系统的开发涉及需求分析、技术选型、数据获取、策略设计、风险管理、交易接口、系统架构、安全合规、测试优化等多个环节。本文档详细介绍了开发策略指南及Python源码示例,涵盖从连接交易所API获取市场数据到系统部署和优化的全过程。
|
SQL 数据格式
在 SQL Server 中使用 STR 函数
【8月更文挑战第5天】
1141 3
在 SQL Server 中使用 STR 函数
|
Windows
windows 如何查看端口占用情况?
原文来自:http://www.iteye.com/topic/1117270   开始--运行--cmd 进入命令提示符 输入netstat -ano 即可看到所有连接的PID 之后在任务管理器中找到这个PID所对应的程序如果任务管理器中没有PID这一项,可以在任务管理器中选"查看"-"选择列...
24658 0
|
计算机视觉
OpenCV下载、环境变量配置
OpenCV下载、环境变量配置
215 2
|
API
【Qt 学习笔记】QWidget的windowOpacity属性 | cursor属性 | font属性
【Qt 学习笔记】QWidget的windowOpacity属性 | cursor属性 | font属性
874 0
|
文字识别 监控 机器人
百度飞桨(PaddlePaddle) - PP-OCRv3 文字检测识别系统 预测部署简介与总览
百度飞桨(PaddlePaddle) - PP-OCRv3 文字检测识别系统 预测部署简介与总览
575 0
|
SQL 前端开发 Java
五邑大学餐厅网络点餐系统设计与实现(包含完整源码详细开发过程)
五邑大学餐厅网络点餐系统设计与实现(包含完整源码详细开发过程)
TU^
|
存储 C语言
C语言浮点数在内存中的存储
在C语言中,浮点数类型用float和double表示。float类型使用4个字节(32位),而double类型使用8个字节(64位)。浮点数表示的范围:float.h中定义
TU^
1367 0
|
前端开发 JavaScript 数据处理
前端知识(十一)———js判断上传的文件是GBK编码还是UTF-8
前端知识(十一)———js判断上传的文件是GBK编码还是UTF-8
515 0