c++ - RegisterClassEx 在 64 位上参数无效(但在 32 位上工作)

标签 c++ winapi

我已经构建了一个针对 32 位和 64 位编译的 DLL。以下代码片段适用于 32 位,但不适用于 64 位(错误代码 87 - 无效参数)

const CHAR g_szClassName[] = "MyFancyDll";
...
WNDCLASSEX wndClass;
    wndClass.cbSize = sizeof(WNDCLASSEX);
    wndClass.style = CS_OWNDC | CS_HREDRAW | CS_VREDRAW;
    wndClass.lpfnWndProc = (WNDPROC) WinProcCallback;
    wndClass.cbClsExtra = 0;
    wndClass.cbWndExtra = 0;
    wndClass.hIcon = NULL;
    wndClass.hbrBackground = NULL;
    wndClass.lpszMenuName = NULL;
    wndClass.lpszClassName = g_szClassName;
    wndClass.hIconSm = NULL;
    if (!RegisterClassEx(&wndClass)) {
        DWORD error = GetLastError();
        printf("Error registering class: %d", error);
    }

代码是使用MinGW编译的。

那么为什么这不适用于 64 位呢?

32 位的命令行是(从我的 makefile 宏中提取的,对于任何拼写错误深表歉意):

...
gcc -m32 -g3 -c -static-libgcc -static-libstdc++ file.c -o file32.o
gcc -m64 -g3 -c -static-libgcc -static-libstdc++ file.c -o file64.o

g++ -m32 -shared --enable-stdcall-fixup -static-libstdc++ file32.o -o mydll32.dll
g++ -m64 -shared --enable-stdcall-fixup -static-libstdc++ file64.o -o mydll64.dll

最佳答案

您的代码留下了未初始化的内存,这可能会导致 undefined behavior ,在继续设置标志/指针之前,请确保每个指针/数据都已清零:

WNDCLASSEX wndClass;
memset(&wndClass, 0, sizeof(WNDCLASSEX));

或者更好:

WNDCLASSEX wndClass = { 0 };

关于c++ - RegisterClassEx 在 64 位上参数无效(但在 32 位上工作),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26627534/

相关文章:

c - 在 GDI 中绘制文本并使其适合矩形?

c# - 使用参数从 C# 调用 void 函数(在 win32 中)

c++ - 如何在 OpenGL 中使用框选择有效地选择对象

c++ - Qt/C++ 从 QPolygonF 继承为 QList 项

c++ - tensorflow内核代码修改

c - Win32 匿名管道在首次读取后损坏

c++ - Win32、MFC : Ending threads

c++ - IMMDevice::Activate() 与 IBaseFilter 返回 REGDB_E_CLASSNOTREG 类未注册

c++ - 为什么函数指针都具有相同的值?

c++ - 为什么 "n&1 == 0"总是返回false?