[ad_1]
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
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.
[ad_2]
コメント