Api函數是構築Windws應用程序的基石
下面以C#為例簡單介紹調用API的基本過程
動態鏈接庫函數的聲明
動態鏈接庫函數使用前必須聲明
動態鏈接庫函數聲明部分一般由下列兩部分組成
譬如
下面是一個調用API函數的例子
[DllImport(
CharSet=CharSet
CallingConvention=CallingConvention
public static extern bool MoveFile(String src
其中入口點EntryPoint標識函數在動態鏈接庫的入口位置
在C#中
[DllImport(
[DllImport(
值得注意的是
下面是一個用MsgBox替換MessageBox名字的例子
[C#]
using System
public class Win
[DllImport(
public static extern int MsgBox(int hWnd
}
許多受管轄的動態鏈接庫函數期望你能夠傳遞一個復雜的參數類型給函數
C#提供了一個StructLayoutAttribute類
布局選項
描述
LayoutKind
為了提高效率允許運行態對類型成員重新排序
注意
LayoutKind
對每個域按照FieldOffset屬性對類型成員排序
LayoutKind
對出現在受管轄類型定義地方的不受管轄內存中的類型成員進行排序
傳遞結構成員
下面的例子說明如何在受管轄代碼中定義一個點和矩形類型
函數的不受管轄原型聲明如下
BOOL PtInRect(const RECT *lprc
注意你必須通過引用傳遞Rect結構參數
[C#]
using System
[StructLayout(LayoutKind
public struct Point {
public int x;
public int y;
}
[StructLayout(LayoutKind
public struct Rect {
[FieldOffset(
[FieldOffset(
[FieldOffset(
[FieldOffset(
}
class Win
[DllImport(
public static extern Bool PtInRect(ref Rect r
}
類似你可以調用GetSystemInfo函數獲得系統信息
? using System
[StructLayout(LayoutKind
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;
}
[DllImport(
static extern void GetSystemInfo(ref SYSTEM_INFO pSI);
SYSTEM_INFO pSI = new SYSTEM_INFO();
GetSystemInfo(ref pSI);
類成員的傳遞
同樣只要類具有一個固定的類成員布局
void GetSystemTime(SYSTEMTIME* SystemTime);
不像傳值類型
[C#]
[StructLayout(LayoutKind
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 Win
[DllImport(
public static extern void GetSystemTime(MySystemTime st);
}
回調函數的傳遞:
從受管轄的代碼中調用大多數動態鏈接庫函數
如果一個動態鏈接庫函數需要一個函數指針作為參數
首先
回調函數及其實現:
回調函數經常用在任務需要重復執行的場合
分下面幾個步驟:
BOOL EnumWindows(WNDENUMPROC lpEnumFunc
顯然這個函數需要一個回調函數地址作為參數
當這個回調函數返回一個非零值時
[C#]
using System;
using System
public delegate bool CallBack(int hwnd
public class EnumReportApp {
[DllImport(
public static extern int EnumWindows(CallBack x
public static void Main()
{
CallBack myCallBack = new CallBack(EnumReportApp
EnumWindows(myCallBack
}
public static bool Report(int hwnd
Console
Console
return true; From:http://tw.wingwit.com/Article/program/net/201311/13429.html