平台叫用技術範例
更新:2007 年 11 月
在這個範例中,會示範呼叫由 Unmanaged 程式庫所匯出之函式的技巧。範例會顯示如何:
宣告不同的型別
使用有效的屬性修改預設行為
使用 Marshal 型別的方法
判斷記憶體回收和執行緒的哪些層面會影響到結果。
有些範例使用 Windows 程式庫所匯出的函式,而有些使用由自訂程式庫匯出的函式。又有些範例會使用並非所有 Windows 平台都提供的程式庫,或是使用函式的方式,並不是所有 Windows 平台都支援的。然而,這並不會讓您無法了解範例中所使用的特定平台叫用規則。
這些範例含有下列目錄結構:
目錄 |
內容 |
---|---|
WinAPIs |
使用從 Windows 程式庫匯出的函式示範平台叫用 |
WinAPIs\CS |
以 C# 撰寫的原始程式碼 |
WinAPIs\VB |
以 Visual Basic 撰寫的原始程式碼 |
Custom |
使用從自訂型別程式庫匯出的函式示範平台叫用。 |
Custom\CS |
以 C# 撰寫的原始程式碼 |
Custom\LIB |
自訂型別程式庫原始程式碼 |
Custom\VB |
以 VB 撰寫的原始程式碼 |
如需使用這些範例的詳細資訊,請參閱下列主題:
若要使用命令提示字元建置範例
開啟命令提示字元視窗,並巡覽至其中一個語言特定的子目錄。
在命令列中輸入 msbuild [檔案名稱].sln。
注意事項: 「自訂」平台叫用範例只能使用 Visual Studio 建置。
若要使用 Visual Studio 建置範例
開啟 [Windows 檔案總管],並巡覽至其中一個語言特定的子目錄。
按兩下 [檔案名稱].sln 的圖示,在 Visual Studio 中開啟該檔案。
在 [建置] 功能表中,選取 [建置方案]。
若要執行範例
巡覽至已建立的可執行檔所在的其中一個語言特定目錄,它可能位於 WinAPIs 或 Custom 目錄之下。
在命令列中輸入可執行檔的名稱。
注意事項: 這個範例會建置主控台應用程式。您必須使用命令提示字元分別啟動這些應用程式,才能檢視其輸出。
需求
這些範例需要 Windows 標頭,如果您使用 Microsoft Visual Studio 2005 (Visual Studio 2005 命令提示字元),或已安裝並在 Include 路徑中指定 Platform SDK,專案即可使用這些標頭。
備註
下表摘要列出這些範例所示範的主題,並列出與每個主題相關的原始程式檔位置。
如何使用平台叫用屬性
屬性 |
說明 |
範例 |
---|---|---|
EntryPoint |
重新命名函式,以便用於 Managed 程式碼。 |
WinAPIs\CS\MsgBox.cs WinAPIs\VB\MsgBox.vb |
CharSet |
選擇字串的封送處理方式,也會影響函式名稱搜尋準則。 |
WinAPIs\CS\MsgBox.cs WinAPIs\VB\MsgBox.vb |
ExactSpelling |
指出是否需要修改 Unmanaged DLL 中的進入點名稱,以便與 CharSet 值對應。 |
WinAPIs\CS\MsgBox.cs WinAPIs\VB\MsgBox.vb |
CallingConvention |
呼叫具有 vararg 的函式。 |
WinAPIs\CS\Printf.cs WinAPIs\VB\Printf.vb |
PreserveSig |
修改傳回 HRESULT 的函式。 |
WinAPIs\CS\CreateObject.cs WinAPIs\VB\CreateObject.vb |
SetLastError |
確保錯誤碼會在函式呼叫之後儲存。 |
WinAPIs\CS\Errors.cs WinAPIs\VB\Errors.vb |
如何封送處理結構和等位 (Union)
型別 |
說明 |
範例 |
---|---|---|
ByVal 結構 |
將結構當做 In 參數傳遞。 |
Custom\CS\Structs.cs Custom\VB\Structs.vb |
ByRef 結構 |
將結構當做 In/Out 參數傳遞。 |
WinAPIs\CS\OSInfo.cs WinAPIs\VB\OSInfo.vb |
ByVal 類別 |
將只具有整數的類別當做 In/Out 參數傳遞。 |
WinAPIs\CS\SysTime.cs WinAPIs\VB\SysTime.vb |
具有巢狀結構 (扁平式) 的結構 |
產生一個類別,表示結構中的 Unmanaged 的那一側,為巢狀結構。而在 Managed 的那一側,結構壓扁成為一個較大的結構。 |
WinAPIs\CS\FindFile.cs WinAPIs\VB\FindFile.vb |
具有巢狀結構 (非扁平式) 的結構 |
傳遞具有內嵌結構的結構。 |
Custom\CS\Structs.cs Custom\VB\Structs.vb |
含有指向另一個結構指標的結構 |
傳遞含有另一個結構指標的結構做為成員。 |
Custom\CS\Structs.cs Custom\VB\Structs.vb |
只含有整數 ByVal 的結構陣列 |
傳遞結構的陣列,只包含做為 In/Out 參數的整數。 |
Custom\CS\Arrays.cs Custom\VB\Arrays.vb |
含有整數及字串 ByRef 的結構陣列 |
傳遞結構的陣列,包含做為 Out 參數的整數和字串。被呼叫端會配置陣列的記憶體。 |
Custom\CS\OutArrayOfStructs.cs Custom\VB\OutArrayOfStructs.vb |
具有實值型別的等位 |
傳遞具有實值型別 (整數和雙精度浮點數) 的等位。 |
Custom\CS\Unions.cs Custom\VB\Unions.vb |
具有混合型別的等位。 |
傳遞具有混合型別 (整數和字串) 的等位。 |
Custom\CS\Unions.cs Custom\VB\Unions.vb |
如何封送處理陣列
陣列 |
說明 |
範例 |
---|---|---|
整數陣列 ByVal |
將整數的陣列當成 In/Out 參數傳遞。 |
Custom\CS\Arrays.cs Custom\VB\Arrays.vb |
整數陣列 ByRef |
將整數的陣列當成 In/Out 參數傳遞。可以調整陣列大小。 |
Custom\CS\Arrays.cs Custom\VB\Arrays.vb |
2D 整數陣列 ByVal |
將整數的矩陣當成 In 參數傳遞。 |
Custom\CS\Arrays.cs Custom\VB\Arrays.vb |
其他
項目的型別 |
說明 |
範例 |
---|---|---|
HandleRef |
提出一個案例,其中必須使用 HandleRef 來防止記憶體回收。 |
WinAPIs\CS\HandleRef.cs WinAPIs\VB\HandleRef.vb |
函式指標 |
將委派 (Delegate) 傳遞至預期函式指標的 Unmanaged 函式。 |
Custom\CS\Callback.cs Custom\VB\Callback.vb |
void* |
呼叫具有 void* 的函式做為參數。 |
Custom\CS\Void.cs Custom\VB\Void.vb |
LPARAM |
使用 GCHandle 將 Managed 物件傳遞至需要 LPARAM 的 Unmanaged 函式。 |
WinAPIs\CS\GCHandle.cs WinAPIs\VB\GCHandle.vb |
單一執行緒 Apartment (STA)/多執行緒 Apartment (MTA) |
當 Unmanaged 函式呼叫 CoInitialize 時,變更預設的 Apartment 設定值。 |
WinAPIs\CS\ActiveDir.cs WinAPIs\VB\ActiveDir.vb |
檢視原始程式碼檔案中的註解,以查看平台叫用的相關資訊。