[DllImport("dllname", EntryPoint="Functionname")] [DllImport("dllname", EntryPoint="#123")] 值得注意的是,你必須在數字序號前加“#” 下面是一個用MsgBox替換MessageBox名字的例子: [C#] using System.Runtime.InteropServices;
public class Win32 { [DllImport("user32.dll", EntryPoint="MessageBox")] public static extern int MsgBox(int hWnd, String text, String caption, uint type); } 許多受管轄的動態鏈接庫函數期望你能夠傳遞一個復雜的參數類型給函數,譬如一個用戶定義的結構類型成員或者受管轄代碼定義的一個類成員,這時你必須提供額外的信息格式化這個類型,以保持參數原有的布局和對齊。
布局選項 描述 LayoutKind.Automatic 為了提高效率允許運行態對類型成員重新排序。 注意:永遠不要使用這個選項來調用不受管轄的動態鏈接庫函數。 LayoutKind.Explicit 對每個域按照FIEldOffset屬性對類型成員排序 LayoutKind.Sequential 對出現在受管轄類型定義地方的不受管轄內存中的類型成員進行排序。 傳遞結構成員 下面的例子說明如何在受管轄代碼中定義一個點和矩形類型,並作為一個參數傳遞給User32.dll庫中的PtInRect函數, 函數的不受管轄原型聲明如下: BOOL PtInRect(const RECT *lprc, POINT pt); 注意你必須通過引用傳遞Rect結構參數,因為函數需要一個Rect的結構指針。 [C#] using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential)] public struct Point { public int x; public int y; }
[StructLayout(LayoutKind.Explicit] public struct Rect { [FIEldOffset(0)] public int left; [FIEldOffset(4)] public int top; [FIEldOffset(8)] public int right; [FIEldOffset(12)] public int bottom; }
class Win32API { [DllImport("User32.dll")] public static extern Bool PtInRect(ref Rect r, Point p); } 類似你可以調用GetSystemInfo函數獲得系統信息: ? using System.Runtime.InteropServices; [StructLayout(LayoutKind.Sequential)] public struct SYSTEM_INFO { public uint dwOemId; public uint dwPageSize; public uint lpMinimumApplicationAddress; public uint lpMaximumApplicationAddress; public uint dwActiveProcessorMask; public uint dwNumberOfProcessors; public uint dwProcessorType; public uint dwAllocationGranularity; public uint dwProcessorLevel; public uint dwProcessorRevision; }
void GetSystemTime(SYSTEMTIME* SystemTime); 不像傳值類型,類總是通過引用傳遞參數. [C#] [StructLayout(LayoutKind.Sequential)] public class MySystemTime { public ushort wYear; public ushort wMonth; public ushort wDayOfWeek; public ushort wDay; public ushort wHour; public ushort wMinute; public ushort wSecond; public ushort wMilliseconds; } class Win32API { [DllImport("User32.dll")] public static extern void GetSystemTime(MySystemTime st); } 回調函數的傳遞: 從受管轄的代碼中調用大多數動態鏈接庫函數,你只需創建一個受管轄的函數定義,然後調用它即可,這個過程非常直接。 如果一個動態鏈接庫函數需要一個函數指針作為參數,你還需要做以下幾步: 首先,你必須參考有關這個函數的文檔,確定這個函數是否需要一個回調;第二,你必須在受管轄代碼中創建一個回調函數;最後,你可以把指向這個函數的指針作為一個參數創遞給DLL函數,.
回調函數及其實現: 回調函數經常用在任務需要重復執行的場合,譬如用於枚舉函數,譬如Win32 API 中的EnumFontFamilIEs(字體枚舉), EnumPrinters(打印機), EnumWindows (窗口枚舉)函數. 下面以窗口枚舉為例,談談如何通過調用EnumWindow 函數遍歷系統中存在的所有窗口