PinvokeStackImbalance使用CallingConvention.Cdecl调用comctl32

时间:2013-03-06 16:38:53

标签: c#-4.0 pinvoke comctl32

我们刚刚将项目从.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);

1 个答案:

答案 0 :(得分:2)

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

在这种情况下,如果您查看DllGetVersion的声明,您会将其定义为:

HRESULT CALLBACK DllGetVersion(DLLVERSIONINFO *pdvi);

CALLBACK is defined as

#define CALLBACK __stdcall

附注:

  

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

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