Kesalahan kompilasi MFC karena platform windows #defines. Berjuang untuk mendiagnosis alasan.

pemrograman


Saya menggunakan Visual Studio 2022/C++/MFC terbaru, Windows SDK 10.0, Platform toolset 10.0 (versi terinstal terbaru), C++ Language Standard ISO C++ 17 Standard dan build 64 bit.

Saya mulai dengan template MDI standar, menambahkan beberapa hal (kontrol edit Scintilla, yang memerlukan >= ISO C++ 17) dan berhasil dikompilasi.

Sekarang saya mengintegrasikan kode sumber yang ada dari pengembangan sebelumnya (yang dikompilasi di bawah ISO C++ 14, tapi itu mungkin bukan penjelasan untuk apa yang akan saya jelaskan).

Kompilasi saya sekarang gagal dengan kesalahan berikut:

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		

… Dan

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		

Jadi, tidak dalam kode saya. Dalam kedua kasus tersebut, ada kompilasi bersyarat berdasarkan versi Windows #defines. Misalnya untuk error pertama, kodenya adalah:

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

Interpretasi saya tentang ini adalah bahwa kompiler melihat nilai NTDDI_VERSION lebih kecil dari nilai NTDDI_VISTA dan oleh karena itu memunculkan kesalahan.

TAPI, saya hanya menggunakan semua default yang dibuat oleh templat proyek untuk pch.h, framework.h dan targetver.h, yang (jika pemahaman saya benar) sama dengan

#include <SDKDDKVer.h>

.

Jadi, saya bingung mencari penjelasan atau pengobatan untuk masalah ini. Saya jelas tidak mendefinisikan ulang versi Windows #defines di tempat lain. Namun menurutku

NTDDI_VERSION

sebenarnya tidak terdefinisi pada titik di file header di mana pengujian versi diterapkan, karena pengeditan ini (saya tahu penistaan) menyebabkan kompilasi berhasil:

#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

Jelas mengedit AfxTaskDialog.h bukanlah solusi yang dapat diterima, jadi saya akan sangat berterima kasih atas saran apa pun tentang cara mendiagnosis/menyelesaikan masalah ini.

Ringkasan definisi kerangka kerja/platform

pch.h – #sertakan “framework.h” sebagai baris pertama.
framework.h – #sertakan “targetver.h” sebagai baris pertama
targetver.h – #include sebagai baris pertama

Apa yang saya coba:

Saya telah secara eksplisit #mendefinisikan NTDDI_VERSION di pch.h dan/atau framework.h dan/atau targetver.h. Saya telah memaksa NTDDI_VERSION untuk lulus tes #if (NTDDI_VERSION < NTDDI_VISTA) dengan pengkodean keras NTDDI_VERSION (yang berfungsi tetapi bukan solusi yang layak).

Solusi 1

Untuk mengetahui masalah pertama di bawah pengaturan kompiler pada tab C/C++ Advanced pilih “show include” dan itu ditampilkan selama pembuatan urutan penyertaan – dengan cara ini Anda dapat menemukannya NTDDI_VERSION didefinisikan sama sekali sebelum file yang Anda minati, atau mungkin tidak terdefinisi di suatu tempat. Pastikan juga SDKDDKVer.h disertakan terlebih dahulu – coba letakkan terlebih dahulu di file header Anda yang telah dikompilasi (pch.h)
Kesalahan kedua muncul karena TCHAR didefinisikan sebagai karakter UNICODE tetapi fungsinya mengharapkan CHAR. Ubah pengaturan ke MBCS alih-alih UNICODE (tab Umum di properti dan pilih nilai “Kumpulan Karakter”) – ini mungkin membantu jika itu bukan kode Anda, jika tidak, Anda dapat mengetahui parameter yang diteruskan dalam kode.

Semoga ini bisa membantu.

Salam,
Pepatah.

コメント

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