我正在使用Visual Studio 2012构建现有的MFC应用程序。该应用程序使用"RichEdit20A"
控件和继承CRichEditCtrl
的自定义控件。
在InitInstance()
期间,应用程序调用{{1}},调用::AfxInitRichEdit2()
,调用AtlLoadSystemLibraryUsingFullPath(L"RICHED20.DLL")
。后一个调用失败并返回LoadLibraryExW(pszLibrary, NULL, LOAD_LIBRARY_SEARCH_SYSTEM32)
。 NULL
返回87(参数不正确。)。这在Win7 x64和Win8 x64上都会发生。
失败的调用似乎已在Visual Studio 2012运行时中引入(它位于条件GetLastError()
内)。使用Visual Studio 2008构建时,该应用程序运行正常。
有谁知道为什么会发生这种情况以及如何解决(或解决)这个问题?或者,有没有办法“恢复”运行时使用旧的加载行为?
答案 0 :(得分:6)
选择正确的目标Windows版本非常重要。就在这里,如果你没有自己明确地设置它,那么Visual Studio假定你将定位最新和最好的。哪个是Windows 8 for VS2012。
其中包括LoadLibraryEx()的新选项,LOAD_LIBRARY_SEARCH_SYSTEM32选项。在Windows 8上可用,但如果您在Windows Vista,7或2008上使用它,则需要安装security patch。这是非常关键的一个,显然您没有安装它。
如果您希望程序与旧版本或未修补的Windows版本兼容,则需要更改目标。这通常由targetver.h
头文件完成,假设您的MFC项目是由相对较新的向导生成的。像这样修改它:
#pragma once
// Including SDKDDKVer.h defines the highest available Windows platform.
// If you wish to build your application for a previous Windows platform, include WinSDKVer.h and
// set the _WIN32_WINNT macro to the platform you wish to support before including SDKDDKVer.h.
#define _WIN32_WINNT _WIN32_WINNT_WINXP // NOTE: added
#include <SDKDDKVer.h>
如果你没有targetver.h,那么把它放在<windows.h>
的#include之前的任何地方。根据需要调整值。请注意,VS2012目前不支持XP,但稍后会支持。