我们刚刚将我们的项目从.NET 3.5SP1升级到.NET 4.5,现在我们从comctl32调用DllGetVersion得到了PInvokeStackImbalance MDA。我读了一遍,了解到在默认情况下,框架不再能够适应不正确的调用约定。奇怪的是,我们已经指定了CallingConvention.Cdecl,我相信这是正确的。如果我完全删除CallingConvention属性并将其设为默认值(CallingConvention.WinAPI),我们就得不到PInvokeStackImbalance。有没有人能说明这一点?操作系统是Win 7 64位,它是一个32位的应用程序,如果有什么不同的话。我尝试查看DllGetVersion函数的头文件,但我不知道调用约定应该是什么。
[DllImport("Comctl32.dll", EntryPoint = "DllGetVersion", CallingConvention = CallingConvention.Cdecl)]
private static extern int NativeDllGetVersion(ref DLLVERSIONINFO pdvi);发布于 2013-03-07 00:40:18
通常,任何Windows API调用都应该使用CallingConvention.StdCall。
在本例中,如果您查看DllGetVersion的声明,您将看到它被定义为:
HRESULT CALLBACK DllGetVersion(DLLVERSIONINFO *pdvi);CALLBACK is defined as
#define CALLBACK __stdcall带着笔记:
回调、WINAPI和APIENTRY都用于定义符合__stdcall调用约定的函数。Windows API中的大多数函数都是使用WINAPI声明的。您可能希望对您实现的回调函数使用回调,以帮助将该函数标识为回调函数。
在您的情况下,这意味着需要切换到StdCall。
https://stackoverflow.com/questions/15253010
复制相似问题