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 };
相关文章:
- 在机器字大小等于 32 位的计算机上int64_t如何工作?
- 一个32位版本的应用程序,建立在CentOS 6 x64上,当在较新的Linux上启动时,在"dl_itera
- 我把我的编译器从32位转换为64位,但我仍然不能使用超过2GB:(为什么
- Clang++的InterlockedExchange的32位调用约定错误,但MSVC可以
- 在node-gip binding.gyp文件中,如何根据系统结构(32位、64位)包含不同的库文件
- 如果在创建对象时创建了 VPTR,那么为什么具有虚拟功能的类的大小在 32 位系统上为 4,在 64 位机器上为 8
- 为什么我不能使用在 Visual C++ 32 位中实现运算符无符号 int() 作为数组索引的类?
- 在QtMultimedia的QAudioFormat中为24位,32位和64位音频选择哪种样本类型(而不是大小)?
- C/C++ 在 32 位和 64 位计算机上可执行
- 在 64 位 Linux armv8 计算机上编译 32 位二进制文件时遇到问题
- sizeof() 在 32 位和 64 位进程之间的行为不同
- 无符号 int 与无符号长 两者都是 32 位,但我无法在不转换的情况下混合它们......为什么?
- VS COM项目以32位编译,但在尝试编译64位时引发错误C2259
- RegisterClassEx在64位上的参数无效(但在32位上工作)
- c++ Mex文件在64位linux上崩溃matlab,但不是32位windows,但程序在matlab外运行良好
- 链接64位应用程序与32位库在centos 5.6 64位
- 32位指针(在32位计算机上)如何搜索1tb硬盘中的数据
- 使用 MinGW-Build 在 64 位系统上编译 32 位 exe -- 编译 32 位 exe,但链接到 64 位
- 在32位win7中运行msi导致“模块注册失败”,但在64位win7中工作
- c++应用程序在64位windows上崩溃,但在32位windows上运行良好