【问题标题】:What makes ::AfxInitRichEdit2 fail and how do I fix it?是什么导致 ::AfxInitRichEdit2 失败,我该如何解决?
【发布时间】:2012-10-25 08:40:16
【问题描述】:

我正在使用 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 运行时中引入的(它在条件 #if NTDDI_VERSION >= NTDDI_WIN8 中)。该应用程序在使用 Visual Studio 2008 构建时运行良好。

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

【问题讨论】:

  • 您是否确认系统上存在RICHED20.DLL?
  • 尝试将WINVER 设置为 0x600 或升级前的任何值。如果你在 VS 2012 中创建了一个新项目,你可能最终会得到一个针对 Windows 8 的项目。更改它我 targetver.h!
  • @Lynn Crumbling 是的,RICHED20.DLL 存在。
  • @l33t 我相信当前形式的项目是用 VS2008 创建的(虽然不是我)。我们没有 targetver.h,但它有一个 #define _WIN32_WINNT _WIN32_WINNT_WINXP

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


【解决方案1】:

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

其中包括 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,请将其放在 &lt;windows.h&gt; 的 #include 之前的任何位置。根据需要调整值。请注意,VS2012 目前不支持 XP,但稍后会支持。

【讨论】:

  • 一个正确的#define _WIN32_WINNT 已经到位,但补丁丢失了。跟进:我怎么会发现我需要这样的补丁(除了询问 Stack Overflow 社区)?
  • 我是通过阅读MFC代码找到的。不适合所有人,但这就是 SO 存在的原因。
  • 为了完整起见,您能否参考一下您在哪里(如果适用,请说明如何)找到和/或推断出它?
  • 找到什么? LoadLibraryEx 的 MSDN 库文章包含知识库文章的链接。
猜你喜欢
  • 2020-04-22
  • 2011-01-28
  • 1970-01-01
  • 1970-01-01
  • 2021-11-23
  • 2019-01-14
相关资源
最近更新 更多