library 指出了程式在連結時需要連結的庫檔案,使用者可以對項目進行設定,也可以使用#pragma comment(lib,"xxx.lib")先行編譯指令實現對該庫檔案的連結。
微軟還對GDI進行了改進,提供了一個基於類實現的應用編程介面GDI。這個介面主要面向C/C++使用者。
1、WindowsAPI 呼叫的注意事項
前面說WindowsAPI 都是通過動態連結程式庫輸出函數實現的,應用程式調用這些函數的時候會按照如下順序尋找動態連結程式庫檔案 應用程式所在的目前的目錄——Windows目錄——Windows系統目錄——系統內容變數指示的目錄,如果這些目錄中找不到,程式就會出現運行異常。因此,使用者最好把這些動態連結程式庫放在程式所在的目錄中。調用API函數最簡單的方法是採用C和C++編碼。
如果在執行過程中產生錯誤,可以調用GetLastError函數來返回錯誤碼。如果使用者需要瞭解錯誤碼對應的描述資訊,則需要使用VisualC++提供的ErrorLookup工具,輸入返回的錯誤碼即可,
DWORD code = GetLastError();if (code ==0) return;...SetLastError(code);
工具——>Error Lookup可以找到以下對話方塊
2、程式的調試資訊輸出
對運行態程式的調試,一種可取方法是採用追蹤記錄檔的方法,把程式啟動並執行中間結果通過字串格式化輸出到一個日誌文字檔中。把這些跟蹤函數封裝到一個公用函數中,在程式需要的時候可以自由調用。如果沒有合適的函數,則WritePrivateProfileString是一個不錯的選擇,這是相對獨立的函數,自身就能完成常值內容的輸出,輸出檔案是INI格式,使用者檢索尋找起來比純文字檔案方便。這個函數比使用註冊表函數方便的多,它的4個參數全部是字串,獨立調用。而註冊表函數需要開啟註冊表、設定註冊鍵項、關閉註冊表,有事還要建立註冊鍵。
WritePrivateProfileString定義如下:
BOOL WritePrivateProfileString(LPCTSTR lpAppName, LPCTSTR lpKeyName, LPCTSTR lpString, LPCTSTR lpFileName);
詳見MSDN。
另外一種記錄中間資訊的方法就是採用調試語句,最關心的是OutputDebugString 函數,聲明如下
void OutputDebugString(LPCTSTR lpOutputString)
在程式啟動並執行時候,可以使用www.sysinternals.com提供的DebugView工具查看調試資訊,這是一個免費的綠色工具,只有一個可執行檔,可以放在任何目錄下直接運行。舉個它跟蹤一個Internet Explorer瀏覽器外掛程式產生的資訊,這個資訊的生產調用了ATLTRACE宏,不過這個宏肯定最終調用了OutputDebugString 函數。
C和C++使用者還可以利用ANSIC或編譯器擴充提供預定義宏來豐富調試資訊的輸出,下面介紹幾個常用的宏。
_FILE_當前源檔案的檔案名稱,這個宏在編譯時間候會擴充成字串,並帶有雙引號標記
_LINE_當前代碼中使用這個宏的行號,這是一個128位無符號長整形整數常量,可以使用#line指令來改變
...
調試函數和預定義宏的使用例子
#include <stdio.h>#include <windows.h>int main(){char szTemp[1024];wsprintf(szTemp, "當前檔案名稱:%s\n",_FILE_);OutputDebugString(szTemp);wsprintf(szTemp, "%d行的內容為 printf(szTemp);\n",_LINE_-1);OutputDebugString(szTemp);wsprintf(szTemp, "編譯時間:%s\n",_DATE_""_TIME_);OutputDebugString(szTemp);wsprintf(szTemp, "最後一次檔案更新時間:%s\n",_TIMESTAMP_);OutputDebugString(szTemp);return 0;}
以上代碼編譯說找不到_FILE_等的定義,應該如何定義呢?
注意:先行編譯宏是在編譯時間利用編譯資訊替換了宏定義,當編譯成機器碼後,這些資訊將被寫入程式碼。其內容不會隨運行環境而改變,除非使用者重新編譯。