Windows 資料類型

Windows API函數、資料結構等都是採用Windows 資料類型。
比如入口參數、返回值等都是
因此學習Windows API程式設計必須要了解Windows資料類型

在Visual Stdio中可以查看資料類型的定義
在資料類型的類型名上按右鍵,可以選擇"定義"
可以從SDK的標頭檔中看到各類型的定義
LPSTR的定義為:
typedef _Null_terminated_ CHAR *NPSTR, *LPSTR, *PSTR;


Windows 資料類型的命名都有規律
基底資料型別包括BYTE、CHAR、WORD、SHORT、DOWRD、INT等
指標類型的命令方式一般是在其指向的資料類型前加"LP"或是"P"
控制碼類型一般都是加"H",比如點陣圖(BITMAP)對應的控制碼類行為"HBITMAP",選單(MENU)為"HMENU",視窗(WINDOW)則是"HWND"

其實所有的Windows 資料類型都是由C資料類型經過類型重定義得到的,如DWORD實質上就是unsigned long資料類型,32位元的無符號整數型

#include <Windows.h>
#include <stdio.h>
int WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
)
{
//定義字串
LPSTR szString = "Windows data type, string.";
//定義字元陣列
CHAR lpString[120];
//定義DWORD類型資料
DWORD dwMax = 0xffffffff;
DWORD dwOne = 0x1;
//定義INT類型資料
INT iMax = 0xffffffff;
INT iOne = 0x1;

//顯示字串
MessageBox(NULL, szString, "LPSTR", MB_OK);
//複製記憶體,將字串複製到陣列中(包括NULL)
CopyMemory(lpString, szString, lstrlen(szString) + 1);
//顯示複製的字串
MessageBox(NULL, lpString, "CHAR[]", MB_OK);

//比較DWORD並顯示結果
if (dwMax > dwOne)
{
MessageBox(NULL, "DWORD類型的資料""DWORD 0xFFFFFFFF > 0x1","DWORD", MB_OK);
}
//比較INT並顯示結果
if (iMax < iOne)
{
MessageBox(NULL, "INT類型的資料 0xFFFFFFFF < 0x1", "INT", MB_OK);
}
return 0;
}

WinMain是程式的入口點,相當於C語言的main函數
定義為:
int WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
)
第一個參數hinstance,資料類型是HINSTANCE,此參數表示應用程式本次執行實例的控制碼
第二個參數hPrevInstance,資料類型是HINSTANCE,表示應用程式之前執行實例的控制碼,但是在實際應用中,此參數始終為NULL
第三個參數lpCmdLine是執行時參數。如在cmd命令列中執行"start.exe Command Arguments",那麼lpCmdLine就指向字串"Command Arguments",作用與C語言中的main函數的參數作用類似。資料類型LPSTR是Windows API中常用的字串類型
最後一個參數是nCmdShow,資料類型是int,表示應用程式視窗(如果有)的顯示狀態
WinMain函數的返回類型是int。

MessageBox函數原型:
int MessageBox(HWND hWnd , LPCTSTR lpText , LPCTSTR lpCaption , UINT uType);

第一個參數hWnd是訊息方塊所屬的視窗的控制碼,可以設定為NULL
第二個參數lpText是字串,表示訊息方塊所顯示的訊息
第三個參數lpCaption是字串,表示訊息方塊的標題
第四個參數uType是訊息方塊的類型,這裡設定為"MB_OK",表示訊息方塊包含一個"確定"按鈕

上面算是一個小範例
但是在執行的時候卻發現一個問題
為什麼會有這個問題呢?

重點在於編碼方式

lPTSTR,LPTSTR,PCTSTR,LPCTSTR
在ANSI編譯方式下,PTSTR和LPTSTR等價於LPSTR,在Unicode下等價於LPWSTR。
在ANSI編譯方式下,PCTSTR和LPCTSTR等價於LPCSTR,在Unicode下等價於LPCWSTR。

我的解決方法是
把原本的Unicode字元集改成多位元的字元集
就可以成功執行了

總共會出現4個對話方塊

沒有留言:

張貼留言

About

努力在程式的大海
用力的揮動雙手
找出屬於自己的航線

Blog Archive

Traffic