繁体   English   中英

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

[英]RegisterClassEx invalid parameter on 64bit (but working on 32 bit)

我建立了一个为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

您的代码将留下未初始化的内存,这可能会导致未定义的行为 ,请确保在继续设置标志/指针之前,将每个指针/数据都清零。

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

甚至更好:

WNDCLASSEX wndClass = { 0 };

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM