"Jenis" tersebut selalu menunjukkan kejutan, misalnya ketika Anda melakukannya LPCSTR p, q;dan Anda ingin memilikinya const char *p, *q;. Bisakah Anda menolak menggunakannya?
ott--
9
Kekejian.
Thomas Eding
2
Porting 64 bit dari aplikasi 32-bit membutuhkan pengetahuan tentang terminologi seperti itu
LPCTSTR= L ong P ointer ke C onst
T CHAR STR ing (Jangan khawatir, pointer panjang adalah sama dengan pointer. Ada dua rasa dari pointer di bawah 16-bit jendela.)
Ini tabelnya:
LPSTR = char*
LPCSTR = const char*
LPWSTR = wchar_t*
LPCWSTR = const wchar_t*
LPTSTR= char* or wchar_t*tergantung pada_UNICODE
LPCTSTR= const char* or const wchar_t*tergantung pada_UNICODE
Setiap kali saya melihat nama tipe itu saya merasa ingin ngeri. Ada sesuatu tentang hal itu yang membuat saya tidak nyaman. (+1 BTW)
Donal Fellows
2
Kapan saya harus menggunakan pointer semacam ini?
Florian Margaine
@FlorianMargaine Saat API memberitahu Anda. Cukup gunakan tipe yang 'tepat' sampai saat itu
James
1
diperingatkan, ada banyak peringatan yang harus diperhatikan di sini. wchar_t adalah tipe 16 bit, tetapi dapat digunakan untuk menyimpan karakter unicode yang disandikan ucs2 dan utf-16. utf-16 dapat menggunakan multiple wchar_t untuk mengkodekan satu huruf, ucs2 hanya mendukung subset dari rangkaian kode unicode. Fungsi API mana yang perlu Anda panggil juga bergantung pada penyandian yang digunakan.
Michael Shaw
2
Yang terburuk adalah DWORD, yang dulunya merupakan kata ganda 32 bit, tetapi saat ini adalah kata setengah 32 bit :-)
gnasher729
6
Tidak perlu menggunakan jenis apa pun yang berhubungan dengan TCHAR.
Tipe-tipe itu, semua tipe struktur yang menggunakannya, dan semua fungsi terkait dipetakan pada waktu kompilasi ke versi ANSI atau UNICODE (berdasarkan pada konfigurasi proyek Anda). Versi ANSI biasanya memiliki A yang ditambahkan ke akhir nama, dan versi unicode menambahkan W. Anda dapat menggunakan ini secara eksplisit jika Anda mau. MSDN akan mencatat ini bila perlu, misalnya ia mencantumkan fungsi MessageBoxIndirectA dan MessageBoxIndirectW di sini: http://msdn.microsoft.com/en-us/library/windows/desktop/ms645511(v=vs.85).aspx
Kecuali jika Anda menargetkan Windows 9x, yang tidak memiliki implementasi banyak fungsi unicode, tidak perlu menggunakan versi ANSI. Jika Anda menargetkan Windows 9x, Anda dapat menggunakan TCHAR untuk membangun ansi dan unicode biner dari basis kode yang sama, selama kode Anda tidak membuat asumsi tentang apakah TCHAR adalah char atau wchar.
Jika Anda tidak peduli dengan Windows 9x, saya sarankan mengkonfigurasi proyek Anda sebagai unicode dan memperlakukan TCHAR sebagai identik dengan WCHAR. Anda dapat secara eksplisit menggunakan fungsi dan tipe W jika Anda mau, tetapi selama Anda tidak berencana untuk menjalankan proyek Anda pada Windows 9x, itu tidak terlalu penting.
Saya tahu bahwa pertanyaan ini ditanyakan beberapa waktu yang lalu dan saya tidak mencoba untuk langsung menjawab pertanyaan asli yang sebenarnya, tetapi karena Tanya Jawab khusus ini memiliki peringkat yang layak, saya ingin menambahkan sedikit di sini untuk pembaca masa depan. Ini harus dilakukan lebih khusus dengan Win32APItypedefsdan bagaimana memahaminya.
Jika ada yang pernah melakukan pemrograman Windows selama era mesin 32-bit dari Windows 95 hingga Windows 7-8, mereka mengerti dan tahu bahwa Win32APIitu dimuat dengan typedefsdan bahwa sebagian besar fungsi dan struktur mereka yang harus diisi dan digunakan sangat bergantung pada mereka.
Berikut ini adalah program windows dasar untuk diberikan sebagai demonstrasi.
Ini hampir tidak cukup kode untuk membuat aplikasi windows. Ini adalah pengaturan paling dasar untuk menginisialisasi properti minimal telanjang untuk membuat jendela dasar dan seperti yang Anda lihat itu sudah diambil typedefsdari Win32api.
Mari kita memecahnya dengan melihat WinMaindan InitWindowsAppfungsi: Hal pertama adalah parameter fungsi HINSTANCEdan PSTR:
WinMainmenerima satu HINSTANCEobjek sementara InitWindowsAppmenerima dua HINSTANCEobjek objek PSTR atau typedefstring lain dan int.
Saya akan menggunakan InitWindowsAppfungsi di sini karena akan memberikan deskripsi objek di kedua fungsi.
Yang pertama HINSTANCEdidefinisikan sebagai H andle ke INSTANCE dan ini adalah yang paling umum digunakan untuk aplikasi. Yang kedua adalah yang lain HANDLEdari INSTANCE Sebelumnya yang jarang digunakan lagi. Itu disimpan di sekitar untuk tujuan warisan agar tidak harus mengubah WinMain()tanda tangan fungsi yang akan merusak banyak aplikasi yang sudah ada dalam proses. Parameter ketiga adalah P ointer ke STR .
Jadi kita harus bertanya pada diri kita sendiri apa itu HANDLE? Jika kita melihat pada Win32APIdokumen yang ditemukan di sini: Tipe Data Windows kita dapat dengan mudah mencarinya dan melihat bahwa itu didefinisikan sebagai:
Pegangan ke objek. Jenis ini dideklarasikan di WinNT.h sebagai berikut:
typedef PVOID HANDLE;
Sekarang kita punya yang lain typedef. Apa itu PVOID? Yah itu harus jelas tetapi mari kita lihat di tabel yang sama ...
Pointer untuk jenis apa pun. Ini dinyatakan dalam WinNT.h
typedefvoid*PVOID;
A HANDLEdigunakan untuk mendeklarasikan banyak objek dalam Win32APIhal-hal seperti:
HKEY - Pegangan ke kunci registri. Dinyatakan dalam WinDef.h
typdef HANDLE HKEY;
HKL - Pegangan ke pengenal lokal. Dinyatakan dalam WinDef.h
typdef HANDLE HKL;
HMENU - Pegangan ke menu. Dinyatakan dalam WinDef.h
typdef HANDLE HMENU;
HPEN - Gagang untuk pena. Dinyatakan dalam WinDef.h
typedef HANDLE HPEN;
HWND - Pegangan ke jendela. Dinyatakan dalam WinDef.h
typedef HANDLE HWND;
... dan seterusnya seperti HBRUSH, HCURSOR, HBITMAP, HDC, HDESK, dll
Ini semua typedefsyang dideklarasikan menggunakan a typedefyang merupakan HANDLEdan HANDLEitu sendiri dinyatakan sebagai typedefdari PVOIDyang juga typedefke a void pointer.
Jadi ketika sampai pada LPCTSTRkita dapat menemukannya di dokumen yang sama:
Ini didefinisikan sebagai LPCWSTRjika UNICODEdidefinisikan atau LPCSTRsebaliknya.
Jadi semoga ini akan membantu sebagai panduan bagaimana memahami penggunaan typedefsterutama dengan Jenis Data Windows yang dapat ditemukan di Internet Win32API.
Banyak tipe pegangan yang diketik lebih kuat daripada hanya menjadi HANDLEalias jika Anda mengaktifkan STRICTmakro. Yang merupakan default dalam proyek baru, saya pikir.
Sebastian Redl
@SebastianRedl Bisa jadi; tapi saya tidak mencoba masuk ke kedalaman API dan ketelitian aspek bahasa yang diketik dengan sangat ketat. Itu lebih merupakan gambaran umum dari Win32 API dan Tipe Data dengan menggunakan typedefs ...
LPCSTR p, q;
dan Anda ingin memilikinyaconst char *p, *q;
. Bisakah Anda menolak menggunakannya?Jawaban:
Mengutip Brian Kramer di forum MSDN
sumber
Tidak perlu menggunakan jenis apa pun yang berhubungan dengan TCHAR.
Tipe-tipe itu, semua tipe struktur yang menggunakannya, dan semua fungsi terkait dipetakan pada waktu kompilasi ke versi ANSI atau UNICODE (berdasarkan pada konfigurasi proyek Anda). Versi ANSI biasanya memiliki A yang ditambahkan ke akhir nama, dan versi unicode menambahkan W. Anda dapat menggunakan ini secara eksplisit jika Anda mau. MSDN akan mencatat ini bila perlu, misalnya ia mencantumkan fungsi MessageBoxIndirectA dan MessageBoxIndirectW di sini: http://msdn.microsoft.com/en-us/library/windows/desktop/ms645511(v=vs.85).aspx
Kecuali jika Anda menargetkan Windows 9x, yang tidak memiliki implementasi banyak fungsi unicode, tidak perlu menggunakan versi ANSI. Jika Anda menargetkan Windows 9x, Anda dapat menggunakan TCHAR untuk membangun ansi dan unicode biner dari basis kode yang sama, selama kode Anda tidak membuat asumsi tentang apakah TCHAR adalah char atau wchar.
Jika Anda tidak peduli dengan Windows 9x, saya sarankan mengkonfigurasi proyek Anda sebagai unicode dan memperlakukan TCHAR sebagai identik dengan WCHAR. Anda dapat secara eksplisit menggunakan fungsi dan tipe W jika Anda mau, tetapi selama Anda tidak berencana untuk menjalankan proyek Anda pada Windows 9x, itu tidak terlalu penting.
sumber
Tipe-tipe ini didokumentasikan pada Tipe Data Windows di MSDN:
sumber
Saya tahu bahwa pertanyaan ini ditanyakan beberapa waktu yang lalu dan saya tidak mencoba untuk langsung menjawab pertanyaan asli yang sebenarnya, tetapi karena Tanya Jawab khusus ini memiliki peringkat yang layak, saya ingin menambahkan sedikit di sini untuk pembaca masa depan. Ini harus dilakukan lebih khusus dengan
Win32
API
typedefs
dan bagaimana memahaminya.Jika ada yang pernah melakukan pemrograman Windows selama era mesin 32-bit dari Windows 95 hingga Windows 7-8, mereka mengerti dan tahu bahwa
Win32
API
itu dimuat dengantypedefs
dan bahwa sebagian besar fungsi dan struktur mereka yang harus diisi dan digunakan sangat bergantung pada mereka.Berikut ini adalah program windows dasar untuk diberikan sebagai demonstrasi.
Ini hampir tidak cukup kode untuk membuat aplikasi windows. Ini adalah pengaturan paling dasar untuk menginisialisasi properti minimal telanjang untuk membuat jendela dasar dan seperti yang Anda lihat itu sudah diambil
typedefs
dariWin32
api
.Mari kita memecahnya dengan melihat
WinMain
danInitWindowsApp
fungsi: Hal pertama adalah parameter fungsiHINSTANCE
danPSTR
:WinMain
menerima satuHINSTANCE
objek sementaraInitWindowsApp
menerima duaHINSTANCE
objek objek PSTR atautypedef
string lain dan int.Saya akan menggunakan
InitWindowsApp
fungsi di sini karena akan memberikan deskripsi objek di kedua fungsi.Yang pertama
HINSTANCE
didefinisikan sebagai H andle ke INSTANCE dan ini adalah yang paling umum digunakan untuk aplikasi. Yang kedua adalah yang lainHANDLE
dari INSTANCE Sebelumnya yang jarang digunakan lagi. Itu disimpan di sekitar untuk tujuan warisan agar tidak harus mengubahWinMain()
tanda tangan fungsi yang akan merusak banyak aplikasi yang sudah ada dalam proses. Parameter ketiga adalah P ointer ke STR .Jadi kita harus bertanya pada diri kita sendiri apa itu
HANDLE
? Jika kita melihat padaWin32
API
dokumen yang ditemukan di sini: Tipe Data Windows kita dapat dengan mudah mencarinya dan melihat bahwa itu didefinisikan sebagai:Sekarang kita punya yang lain
typedef
. Apa ituPVOID
? Yah itu harus jelas tetapi mari kita lihat di tabel yang sama ...A
HANDLE
digunakan untuk mendeklarasikan banyak objek dalamWin32
API
hal-hal seperti:HKEY
- Pegangan ke kunci registri. Dinyatakan dalam WinDef.htypdef HANDLE HKEY;
HKL
- Pegangan ke pengenal lokal. Dinyatakan dalam WinDef.htypdef HANDLE HKL;
HMENU
- Pegangan ke menu. Dinyatakan dalam WinDef.htypdef HANDLE HMENU;
HPEN
- Gagang untuk pena. Dinyatakan dalam WinDef.htypedef HANDLE HPEN;
HWND
- Pegangan ke jendela. Dinyatakan dalam WinDef.htypedef HANDLE HWND;
HBRUSH
,HCURSOR
,HBITMAP
,HDC
,HDESK
, dllIni semua
typedefs
yang dideklarasikan menggunakan atypedef
yang merupakanHANDLE
danHANDLE
itu sendiri dinyatakan sebagaitypedef
dariPVOID
yang jugatypedef
ke avoid pointer
.Jadi ketika sampai pada
LPCTSTR
kita dapat menemukannya di dokumen yang sama:Jadi semoga ini akan membantu sebagai panduan bagaimana memahami penggunaan
typedefs
terutama dengan Jenis Data Windows yang dapat ditemukan di InternetWin32
API
.sumber
HANDLE
alias jika Anda mengaktifkanSTRICT
makro. Yang merupakan default dalam proyek baru, saya pikir.