我的本机C ++ / MFC程序在使用VS2005编译时运行并在32位Windows XP上运行。使用Visual Studio 2013 - Windows XP(v120_xp)平台工具集*,使用VS2013编译的相同代码在64位Windows 7下运行,但在32位Windows XP上运行失败。我正在使用MBCS MFC库。这两个版本都是调试版本。
失败的代码是事件的信号:
// At global scope
CEvent interpHasWork(FALSE/* bInitiallyOwn*/,FALSE/*bManualReset*/,"InterpHasWork");
// In function A
interpHasWork.SetEvent(); // signal
// and in function B
interpHasWork.Lock(); // wait for signal
在构建它的VS2013机器(64位Windows 7)上运行时,在功能A中发出事件信号后,功能B退出锁定状态(继续执行下一行),如预期的那样。 / p>
当在Windows XP计算机上运行相同的可执行文件时,在函数A中发出事件信号后,函数B永远不会退出锁定状态。
所以,问题是,如何构建程序以使可执行程序与两种操作系统兼容?
编辑:结果是答案是,包含函数B的线程从未启动过,因为AfxBeginThread出错了(我的pgm没有检查[BAD pgm])。确定它出错的确切原因是棘手的,因为没有AfxBeginThread的错误返回文档,并且AfxBeginThread最终调用创建线程的CreateThread被记录为使用GetLastError。但GetLastError(我的帮助文件中也未记录)返回0 =成功。然而,errno返回12(内存不足)。
由于堆栈保留设置为~500 MB,并且AfxBeginThread使用了默认堆栈大小,因此它还请求了大约500 MB的保留。当使用VS2005构建pgm时,所有这些都有效,所以我假设VS2013产生了更大的可执行文件。我将工作线程的堆栈大小减少到1MB,但仍然出现错误,因此VS2005版本必须几乎不适合XP的2 GB用户空间。
*如果我使用默认的v120工具集,程序会给出"不是有效的Win32程序"启动时的消息。