2

我正在使用 Visual Studio 2012 构建现有的 MFC 应用程序。该应用程序使用"RichEdit20A"控件和自定义控件,它们继承了CRichEditCtrl.

应用期间InitInstance()调用::AfxInitRichEdit2(),调用AtlLoadSystemLibraryUsingFullPath(L"RICHED20.DLL"),调用LoadLibraryExW(pszLibrary, NULL, LOAD_LIBRARY_SEARCH_SYSTEM32)。后一个调用失败并返回NULLGetLastError()返回 87(参数不正确)。这发生在 Win7 x64 和 Win8 x64 上。

失败的调用似乎是在 Visual Studio 2012 运行时中引入的(它在 conditional 内#if NTDDI_VERSION >= NTDDI_WIN8)。该应用程序在使用 Visual Studio 2008 构建时运行良好。

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

4

1 回答 1

6

选择合适的目标 Windows 版本可能非常重要。就在这里,如果您没有自己明确设置它,那么 Visual Studio 会假定您将针对最新和最好的。这是 VS2012 的 Windows 8。

其中包括 LoadLibraryEx() 的新选项 LOAD_LIBRARY_SEARCH_SYSTEM32 选项。在 Windows 8 上可用,但如果您在 Windows Vista、7 或 2008 上使用它,则需要安装安全补丁。这是一个非常关键的补丁,显然您没有安装它。

如果您希望您的程序与旧的或未打补丁的 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,请将其放在 #include for 之前的任何位置<windows.h>。根据需要调整值。请注意,VS2012 目前不支持 XP,但稍后会支持。

于 2012-11-05T14:09:33.670 回答