トップ回答者
コンパイルエラー「error C3861: 'AtlLoadSystemLibraryUsingFullPath': 識別子が見つかりませんでした」が発生する

質問
-
Microsoft Visual C++ 2010 でコンパイルすると、上記エラーが発生します。
エラーはどのプロジェクトでも発生しており、旧プロジェクトもリビルドを行うと同じエラーが発生します。
"AtlLoadSystemLibraryUsingFullPath"をVCのフォルダ検索してもヒットはありません。
Visual Studioの評価版の環境で検索を行ったところ”C:\Program Files\Microsoft Visual Studio 10.0\VC\atlmfc\include”の”atlcore.h”でヒットがありました。
昨日までは問題ありませんでした。
関係は不明ですが今朝OSの更新を行いました。
Visual Studio 2010 のバージョン情報
Microsoft Visual Studio 2010
Version 10.0.30319.1 RTMRel
Microsoft .NET Framework
Version 4.0.30319 RTMRelインストールされているバージョン: Professional
Microsoft Visual C++ 2010 01018-532-2002181-70888
Microsoft Visual C++ 2010対処法を教授願います。
回答
-
しかし、もしそうなら、ATLのSource Codeはそのままにしておいて、
AtlLoadSystemLibraryUsingFullPathを自分のSource Code内に記述したほうが良いでしょう。
そうしないと今後のUpdateでATLのSource Codeが上書きされ、また無くなってしまう可能性がありますよ。
(復活する可能性もありますけど、原因が分からないためなんとも言えません)ちょっと待ってください。
見つからないからという理由だけで、自分のコードに書き写すという解決をすべきではありません。
コード片とはいえ、安易なコピーは問題を生みかねません。(著作権・ライセンスなど)なお、4/13(今日)のセキュリティ更新プログラムの公開とその関連でダウンロードが提供されていますが、ATL/MFC の脆弱性修正が行われています。
以前から話題にあった、安全でないパスから DLL を読み込む可能性を修正するもので、関数名からすると今回の修正目的で加えられたものと推測できます。
(更新プログラムを適用すると、AtlLoadSystemLibraryUsingFullPath を含む atlcore.h が展開されました)http://www.microsoft.com/japan/technet/security/bulletin/MS11-025.mspx
なぜ、AtlLoadSystemLibraryUsingFullPath が要求されているのにヘッダーにないのかは不明ですが、更新プログラムの適用が不十分な可能性、インクルードパスがおかしい、ビルド結果の中間ファイルがおかしいなどの可能性がありますが、第三者に特定は難しいでしょう。
必要に応じて、一度更新プログラムをアンインストールして、入れ直してみてください。# この更新プログラムは開発環境を更新します。
# チーム・組織で開発されている場合、メンバー全員が一斉に更新するべきです。
質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなりま- 回答としてマーク kkata 2011年4月15日 6:54
すべての返信
-
返信ありがとうございます。
評価版とのファイル比較を行ったところ
「VC\atlmfc\include」の「atlcore.h」の内容に差がありました。
具体的な差異は以下の有無でした。コンパイルエラーが発生する環境では以下の部分が存在しません。
このファイルのみ評価版の環境からコピーしたところコンパイルが通るようになりました。
とりあえずコンパイルはできるようになりましたが原因がわかりません。
/////////////////////////////////////////////////////////////////////////////
// DLL Load Helperinline HMODULE AtlLoadSystemLibraryUsingFullPath(_In_z_ const WCHAR *pszLibrary)
{
WCHAR wszLoadPath[MAX_PATH+1];
if (::GetSystemDirectoryW(wszLoadPath, _countof(wszLoadPath)) == 0)
{
return NULL;
}if (wszLoadPath[wcslen(wszLoadPath)-1] != L'\\')
{
if (wcscat_s(wszLoadPath, _countof(wszLoadPath), L"\\") != 0)
{
return NULL;
}
}if (wcscat_s(wszLoadPath, _countof(wszLoadPath), pszLibrary) != 0)
{
return NULL;
}return(::LoadLibraryW(wszLoadPath));
} -
Compile Errorが出る箇所は、自分で書いたCode内ですか?
>"AtlLoadSystemLibraryUsingFullPath"をVCのフォルダ検索してもヒットはありません。
ヒットしないということは、少なくともATL内部からは使われてはいないようですね。
AtlLoadSystemLibraryUsingFullPathを利用した自分で記述したCodeがあったが、
今のATLでは無くなってしまったため、Errorになっている可能性はありませんか?
(何故なくなったかは分かりません。)しかし、もしそうなら、ATLのSource Codeはそのままにしておいて、
AtlLoadSystemLibraryUsingFullPathを自分のSource Code内に記述したほうが良いでしょう。
そうしないと今後のUpdateでATLのSource Codeが上書きされ、また無くなってしまう可能性がありますよ。
(復活する可能性もありますけど、原因が分からないためなんとも言えません) -
しかし、もしそうなら、ATLのSource Codeはそのままにしておいて、
AtlLoadSystemLibraryUsingFullPathを自分のSource Code内に記述したほうが良いでしょう。
そうしないと今後のUpdateでATLのSource Codeが上書きされ、また無くなってしまう可能性がありますよ。
(復活する可能性もありますけど、原因が分からないためなんとも言えません)ちょっと待ってください。
見つからないからという理由だけで、自分のコードに書き写すという解決をすべきではありません。
コード片とはいえ、安易なコピーは問題を生みかねません。(著作権・ライセンスなど)なお、4/13(今日)のセキュリティ更新プログラムの公開とその関連でダウンロードが提供されていますが、ATL/MFC の脆弱性修正が行われています。
以前から話題にあった、安全でないパスから DLL を読み込む可能性を修正するもので、関数名からすると今回の修正目的で加えられたものと推測できます。
(更新プログラムを適用すると、AtlLoadSystemLibraryUsingFullPath を含む atlcore.h が展開されました)http://www.microsoft.com/japan/technet/security/bulletin/MS11-025.mspx
なぜ、AtlLoadSystemLibraryUsingFullPath が要求されているのにヘッダーにないのかは不明ですが、更新プログラムの適用が不十分な可能性、インクルードパスがおかしい、ビルド結果の中間ファイルがおかしいなどの可能性がありますが、第三者に特定は難しいでしょう。
必要に応じて、一度更新プログラムをアンインストールして、入れ直してみてください。# この更新プログラムは開発環境を更新します。
# チーム・組織で開発されている場合、メンバー全員が一斉に更新するべきです。
質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなりま- 回答としてマーク kkata 2011年4月15日 6:54