【解決方法】 Windows プラットフォームの #define による MFC コンパイル エラー。 原因を診断するのに苦労しています。

プログラミングQA

[ad_1]

最新の Visual Studio 2022 / C++ / MFC、Windows SDK 10.0、プラットフォーム ツールセット 10.0 (最新のインストール バージョン)、C++ 言語標準 ISO C++ 17 Standard を使用し、64 ビットをビルドしています。

標準の MDI テンプレートから開始し、いくつかの要素 (ISO C++ 17 以上が必要な Scintilla 編集コントロール) を追加し、正常にコンパイルしました。

現在、以前の開発からの既存のソース コードを統合しています (ISO C++ 14 でコンパイルされますが、それはこれから説明する内容の説明ではないかもしれません)。

現在、コンパイルが次のエラーで失敗しています。

Error	C1189	#error:  CTaskDialog is not supported on Windows versions prior to Vista.	Visual SQL Studio	C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.38.33130\atlmfc\include\afxtaskdialog.h	18		

… そして

Error	C2664	'INT getaddrinfo(PCSTR,PCSTR,const ADDRINFOA *,PADDRINFOA *)': cannot convert argument 1 from 'LPCTSTR' to 'PCSTR'	Visual SQL Studio	C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.38.33130\atlmfc\include\atlsocket.h	163		

したがって、私のコードにはありません。 どちらの場合も、Windows バージョンの #define に基づいて条件付きコンパイルが行われます。 たとえば、最初のエラーのコードは次のとおりです。

#if (NTDDI_VERSION < NTDDI_VISTA) // min Windows Vista required
#error CTaskDialog is not supported on Windows versions prior to Vista.
#endif

これについての私の解釈は、コンパイラが NTDDI_VERSION の値が NTDDI_VISTA の値よりも小さいとみなしているため、エラーが発生するということです。

ただし、pch.h、framework.h、targetver.h のプロジェクト テンプレートによって作成されたデフォルトをすべて使用しているだけです。これは、(私の理解が正しければ)

#include <SDKDDKVer.h>

それで、私はこの問題の説明や解決法について頭を悩ませています。 Windows バージョンの #defines を他の場所で再定義することは絶対にありません。 しかし、私は思います

NTDDI_VERSION

この編集 (私が知っているように、冒涜) によりコンパイルが成功するため、バージョン テストが適用されるヘッダー ファイルの時点では実際には未定義です。

#undef NTDDI_VERSION
#define NTDDI_VERSION NTDDI_WIN10

#if (NTDDI_VERSION < NTDDI_VISTA) // min Windows Vista required
#error CTaskDialog is not supported on Windows versions prior to Vista.
#endif

AfxTaskDialog.h を編集することは明らかに許容できる解決策ではありません。そのため、この問題を診断/解決する方法についての提案をいただければ幸いです。

フレームワーク/プラットフォーム定義の概要

pch.h – #最初の行として「framework.h」を含めます。
Framework.h – #最初の行として「targetver.h」を含める
targetver.h – #最初の行として を含めます

私が試したこと:

pch.h および / または Framework.h および / または targetver.h で NTDDI_VERSION を明示的に #define しました。 NTDDI_VERSION をハードコーディングすることで、NTDDI_VERSION が #if (NTDDI_VERSION < NTDDI_VISTA) テストに合格するように強制しました (これは機能しますが、実行可能な解決策ではありません)。

解決策 1

C/C++ 詳細タブのコンパイラ設定で最初の問題を解決するには、「インクルードを表示」を選択すると、ビルド中にインクルード シーケンスが表示されます。この方法で、 NTDDI_VERSION 関心のあるファイルの前に定義されているか、どこかで未定義である可能性があります。 また、SDKDDKVer.h が最初に含まれていることを確認してください。これをプリコンパイル済みヘッダー ファイル (pch.h) の最初に置くようにしてください。
2 番目のエラーは、TCHAR が UNICODE 文字として定義されているにもかかわらず、関数が CHAR を予期しているというエラーです。 設定を UNICODE ではなく MBCS に変更します (プロパティの[全般]タブで[文字セット]値を選択します)。これは、コードではない場合に役立ちます。そうでない場合は、コードで渡されたパラメーターを確認できます。

これがお役に立てば幸いです。

よろしく、
マキシム。

[ad_2]

コメント

タイトルとURLをコピーしました