Sean's Note

2011年11月23日 星期三

[DEBUG] _RPT & _RPTF


Visual C++ 提供了 _RPT 和 _RPTF 巨集來幫助使用者除錯,

其功能類似於 printf,但僅在 Debug 設定下會印出字串,

Release 設定下則會自動刪除。其可印出呼叫該巨集的程式檔案名稱與行數。

例如 :

_CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE);

_CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDOUT);

_RPT0(_CRT_WARN, "Test.\n");

// Output
Test

_RPT1(_CRT_WARN, "Test %d.\n", 1);

// Output
Test 1

_RPTF0(_CRT_WARN, "Test.\n");

// Output
d:\win32\assert\assert\assert.cpp(54) : Test

_RPTF1(_CRT_WARN, "Test %d.\n", 1);

// Output
d:\win32\assert\assert\assert.cpp(54) : Test 1


有無 F 差在要不要印出檔案名稱與行數,而數字代表要代入的參數個數,最多到 4 。


[DEBUG] _ASSERT & _ASSERTE

Visual C++ 提供了 _ASSERT 和 _ASSERTE 巨集來幫助使用者除錯,
其功能類似於 printf,但僅在 Debug 設定下會印出字串,
Release 設定下則會自動刪除。其可印出一布林運算式的結果。
用法例如 :

_ASSERT(3 == 3);
 // Output
d:\win32\assert\assert\assert.cpp(53) :

_ASSERT(3 == 2);
 // Output
d:\win32\assert\assert\assert.cpp(53) : Assertion failed!

_ASSERTE(3 == 3);
 // Output
當條件成立時不印出任何字串

_ASSERTE(3 == 2);
 // Output
d:\win32\assert\assert\assert.cpp(53) : Assertion failed : 3 == 2


記得要先設定為 _CRTDBG_MODE_FILE,才會顯示在 console 上,
否則預設為跳出視窗_CRTDBG_MODE_WNDW )

_CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE);
_CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDOUT);

2011年10月4日 星期二

處理路徑字串的常用函式

PathCombine__out LPTSTR lpszDest, __in_opt LPCTSTR lpszDir, __in LPCTSTR lpszFile )
in: C:
in: One\Two\Three
out: C:\One\Two\Three

PathRemoveExtension( __inout LPTSTR pszPath )
in: C:\TEST\sample.txt
out: C:\TEST\sample


PathFindExtension( __in PTSTR pszPath )
in: C:\TEST\sample.txt
out: .txt


PathRemoveFileSpec( __inout LPTSTR pszPath )
in: C:\TEST\sample.txt
out: C:\TEST

GetSystemDirectory( __out LPTSTR lpBuffer, __in UINT uSize )
out: C:\Windows\System32

PathStripPath(__inout LPTSTR pszPath); 
in: c:\\dir1\\file.txt
out: file.txt

2011年9月15日 星期四

[Win32] 如何修改 Edit Control 和 Static Control 的文字顏色和背景顏色

當 Edit Control (Edit Text) 和 Static Control (Static Text) 要被繪圖的時候,

視窗就會接受到 WM_CTLCOLORSTATIC 的訊息,

當接收到此訊息後,可以利用 wParam 和 lParam 分別取得元件的 hDC 和 handle,

再透過 SetTextColor 和 SetBkColor 函式,並建立背景筆刷 hBRUSH,

即可更改顏色,詳細內容與範例請參考 MSDN

Window Controls 和 .rc 檔

用 Visual Studio 在開發 win32 或 MFC 視窗程式的時候,

我們常常可以用拖拉的方式來建立許多元件 (Controls),

並由旁邊的屬性對話窗 (Properties Dialog),來更改一些屬性,

但並非所有屬性都會列於此,例如元件的長寬等等,

這時就必須透過程式或者 *.rc 資源檔來直接做修改。

而在 MSDN 裡有介紹了各種元件在 rc 檔的格式。

2011年9月13日 星期二

[VC] 用 dumpbin 來看 DLL 檔

在 Visual Studio 裡提供了 dumpbin 工具,可以用來查看
DLL 檔提供了哪些函式,dumpbin.exe 的位置於 :
C:\Program Files\Microsoft Visual Studio 8\VC\bin
如果執行時出現找不到 mspdb80.dll 時,
將 C:\Program Files\Microsoft Visual Studio 8\Common7\IDE 
加到系統環境變數的 Path 裡。

2011年9月8日 星期四

char, wchar_t and TCHAR


在 c 裡常見的 char 代表 1 個 byte,

後來為了引入寬字元, 而有了 2 個 bytes 的 wchar_t,

wchar_t 的定義如下 :

typedef unsigned short wchar_t;

平常我們所用的字串處理函式如下 :

char* str = "hello!"; // 7

len = strlen(str);

當然也有用來處理寬字元字串的函式 :

wchar_t* str = "hello!"; // 14

len = wcslen(str);

為了使程式既能按 ASCII 又能按 Unicode 編譯,而衍伸了通用變數 TCHAR,

在 tchar.h 裡可以看到,當有 #define _UNIOCODE 時

typedef wchar_t TCHAR

反之,

typedef char TCHAR

如此一來,使用通用變數,將會使得程式碼更為一致性。

而通用的字串處理函式如 : l + 函式名稱

len = lstrlen(str);
len = lstrcpy(str);
len = lstrcpyn(str);
len = lstrcat(str);