什么使:: AfxInitRichEdit2失败,我该如何解决?

时间:2012-11-05 13:42:40

标签: visual-c++ mfc visual-studio-2012 cricheditctrl

我正在使用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构建时,该应用程序运行正常。

有谁知道为什么会发生这种情况以及如何解决(或解决)这个问题?或者,有没有办法“恢复”运行时使用旧的加载行为?

1 个答案:

答案 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,但稍后会支持。