共用方式為


平台叫用技術範例

更新: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 撰寫的原始程式碼

如需使用這些範例的詳細資訊,請參閱下列主題:

Download sample

若要使用命令提示字元建置範例

  1. 開啟命令提示字元視窗,並巡覽至其中一個語言特定的子目錄。

  2. 在命令列中輸入 msbuild [檔案名稱].sln。

    注意事項:

    「自訂」平台叫用範例只能使用 Visual Studio 建置。

若要使用 Visual Studio 建置範例

  1. 開啟 [Windows 檔案總管],並巡覽至其中一個語言特定的子目錄。

  2. 按兩下 [檔案名稱].sln 的圖示,在 Visual Studio 中開啟該檔案。

  3. 在 [建置] 功能表中,選取 [建置方案]。

若要執行範例

  1. 巡覽至已建立的可執行檔所在的其中一個語言特定目錄,它可能位於 WinAPIs 或 Custom 目錄之下。

  2. 在命令列中輸入可執行檔的名稱。

    注意事項:

    這個範例會建置主控台應用程式。您必須使用命令提示字元分別啟動這些應用程式,才能檢視其輸出。

需求

這些範例需要 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

檢視原始程式碼檔案中的註解,以查看平台叫用的相關資訊。

請參閱

概念

使用 Unmanaged DLL 函式

平台叫用範例

參考

CharSet

DllImportAttribute

LayoutKind

Marshal

MarshalAsAttribute

StructLayoutAttribute

其他資源

預設的封送處理行為

使用平台叫用封送處理資料