我构建了一个编译为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
答案 0 :(得分:3)
您的代码正在保留未初始化的内存,这可能会导致undefined behavior,请确保在继续设置标记/指针之前将每个指针/数据清零:
WNDCLASSEX wndClass;
memset(&wndClass, 0, sizeof(WNDCLASSEX));
甚至更好:
WNDCLASSEX wndClass = { 0 };