首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PinvokeStackImbalance使用CallingConvention.Cdecl调用comctl32

PinvokeStackImbalance使用CallingConvention.Cdecl调用comctl32
EN

Stack Overflow用户
提问于 2013-03-07 00:38:53
回答 1查看 379关注 0票数 2

我们刚刚将我们的项目从.NET 3.5SP1升级到.NET 4.5,现在我们从comctl32调用DllGetVersion得到了PInvokeStackImbalance MDA。我读了一遍,了解到在默认情况下,框架不再能够适应不正确的调用约定。奇怪的是,我们已经指定了CallingConvention.Cdecl,我相信这是正确的。如果我完全删除CallingConvention属性并将其设为默认值(CallingConvention.WinAPI),我们就得不到PInvokeStackImbalance。有没有人能说明这一点?操作系统是Win 7 64位,它是一个32位的应用程序,如果有什么不同的话。我尝试查看DllGetVersion函数的头文件,但我不知道调用约定应该是什么。

代码语言:javascript
复制
    [DllImport("Comctl32.dll", EntryPoint = "DllGetVersion", CallingConvention = CallingConvention.Cdecl)]
    private static extern int NativeDllGetVersion(ref DLLVERSIONINFO pdvi);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-07 00:40:18

通常,任何Windows API调用都应该使用CallingConvention.StdCall

在本例中,如果您查看DllGetVersion的声明,您将看到它被定义为:

代码语言:javascript
复制
HRESULT CALLBACK DllGetVersion(DLLVERSIONINFO *pdvi);

CALLBACK is defined as

代码语言:javascript
复制
#define CALLBACK __stdcall

带着笔记:

回调、WINAPI和APIENTRY都用于定义符合__stdcall调用约定的函数。Windows API中的大多数函数都是使用WINAPI声明的。您可能希望对您实现的回调函数使用回调,以帮助将该函数标识为回调函数。

在您的情况下,这意味着需要切换到StdCall

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15253010

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档