2

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

1 回答 1

2

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

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

HRESULT CALLBACK DllGetVersion(DLLVERSIONINFO *pdvi);

CALLBACK定义为

#define CALLBACK __stdcall

附注:

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

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

于 2013-03-06T16:40:17.633 回答