2

Visual Studio 2012 を使用して既存の MFC アプリケーションを構築しています。このアプリケーションでは、.NET"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 でビルドした場合、アプリケーションは問題なく動作しました。

この問題が発生する理由と、この問題を修正 (または回避) する方法を知っている人はいますか? または、ランタイムを「元に戻して」古い読み込み動作を使用する方法はありますか?

4

1 に答える 1

6

適切なターゲット Windows バージョンを選択することは非常に重要です。ここにあります。自分で明示的に設定しない場合、Visual Studio は、最新かつ最高のものをターゲットにすると想定します。VS2012のWindows 8です。

これには、LoadLibraryEx() の新しいオプションである LOAD_LIBRARY_SEARCH_SYSTEM32 オプションが含まれます。Windows 8 で利用できますが、Windows Vista、7、または 2008 で使用する場合は、セキュリティ パッチをインストールする必要があります。これは非常に重要なものであり、明らかにインストールしていません。

プログラムを古いバージョンまたはパッチを適用していない Windows バージョンと互換性を持たせたい場合は、ターゲットを変更する必要があります。targetver.hMFC プロジェクトが比較的最近のウィザードによって生成されたと仮定すると、これは通常、ヘッダー ファイルによって行われます。次のように変更します。

#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>ます。必要に応じて値を微調整します。XP は現在 VS2012 ではサポートされていませんが、後でサポートされる予定です。

于 2012-11-05T14:09:33.670 に答える