作為初學者來說,在c#中使用api確是一件令人頭疼的問題。在使用api之間你必須知道如何在c#中使用結構、類型轉換、安全/不安全代碼,可控/不可控代碼等許多知識。
一切從簡單開始,復雜的大家一時不能接受。我們就從實現一個簡單的messagebox開始。首先打開vs.net ,創建一個新的c#工程,并添加一個button按鈕。當這個按鈕被點擊,則顯示一個messagebox對話框。
即然我們需要引用外來庫,所以必須導入一個namespace:
using system.runtime.interopservices;
接著添加下面的代碼來聲明一個api:
[dllimport("user32.dll")]
public static extern int messagebox(int h, string m, string c, int type);
此處dllimport屬性被用來從不可控代碼中調用一方法?!眜ser32.dll”則設定了類庫名。dllimport屬性指定dll的位置,這個dll中包括調用的外部方法。static修飾符則聲明一個靜態元素,而這個元素屬于類型本身而不是上面指定的對象。extern則表示這個方法將在工程外部執行,使用dllimport導入的方法必須使用extern修飾符。
messagebox 則是函數名,擁有4個參數,其返回值為數字。
大多數的api都能傳遞并返回值。
添中click點擊事件代碼:
protected void button1_click(object sender, system.eventargs e)
{
messagebox (0,"api message box","api demo",0);
}
編譯并運行這個程序,當你點擊按鈕后,你將會看到對話框,這便是你使用的api函數。
使用結構體
操作帶有結構體的api比使用簡單的api要復雜的多。但是一旦你掌握了api的過程,那個整個api世界將在你的掌握之中。
下面的例子中我們將使用getsysteminfo api 來獲取整個系統的信息。
第一步還是打開c#建立一個form工程,同樣的添中一個button按鈕,在代碼窗中輸入下面的代碼,導入namespace:
using system.runtime.interopservices;
聲明一個結構體,它將做為getsysteminfo的一個參數:
[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;
}
聲明api函數:
[dllimport("kernel32")]
static extern void getsysteminfo(ref system_info psi);
添加下面的代碼至按鈕的點擊事件處理中:
首先創建一個system_info結構體,并將其傳遞給getsysteminfo函數。
protected void button1_click (object sender, system.eventargs e)
{
try
{
system_info psi = new system_info();
getsysteminfo(ref psi);
//
//
//
一旦你接收到返回的結構體,那么就可以以返回的參數來執行操作了。
e.g.listbox1.insertitem (0,psi.dwactiveprocessormask.tostring());:
//
//
//
}
catch(exception er)
{
messagebox.show (er.message);
}
}
//created by ajit mungale
//程序補充 飛刀
namespace usingapi
{
using system;
using system.drawing;
using system.collections;
using system.componentmodel;
using system.winforms;
using system.data;
using system.runtime.interopservices;
//struct 收集系統信息
[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;
}
//struct 收集內存情況
[structlayout(layoutkind.sequential)]
public struct memorystatus
{
public uint dwlength;
public uint dwmemoryload;
public uint dwtotalphys;
public uint dwavailphys;
public uint dwtotalpagefile;
public uint dwavailpagefile;
public uint dwtotalvirtual;
public uint dwavailvirtual;
}
public class form1 : system.winforms.form
{
private system.componentmodel.container components;
private system.winforms.menuitem menuabout;
private system.winforms.mainmenu mainmenu1;
private system.winforms.listbox listbox1;
private system.winforms.button button1;
//獲取系統信息
[dllimport("kernel32")]
static extern void getsysteminfo(ref system_info psi);
//獲取內存信息
[dllimport("kernel32")]
static extern void globalmemorystatus(ref memorystatus buf);
//處理器類型
public const int processor_intel_386 = 386;
public const int processor_intel_486 = 486;
public const int processor_intel_pentium = 586;
public const int processor_mips_r4000 = 4000;
public const int processor_alpha_21064 = 21064;
public form1()
{
initializecomponent();
}
public override void dispose()
{
base.dispose();
components.dispose();
}
private void initializecomponent()
{
this.components = new system.componentmodel.container ();
this.mainmenu1 = new system.winforms.mainmenu ();
this.button1 = new system.winforms.button ();
this.listbox1 = new system.winforms.listbox ();
this.menuabout = new system.winforms.menuitem ();
mainmenu1.menuitems.all = new system.winforms.menuitem[1] {this.menuabout};
button1.location = new system.drawing.point (148, 168);
button1.size = new system.drawing.size (112, 32);
button1.tabindex = 0;
button1.text = "&get info";
button1.click += new system.eventhandler (this.button1_click);
listbox1.location = new system.drawing.point (20, 8);
listbox1.size = new system.drawing.size (368, 147);
listbox1.tabindex = 1;
menuabout.text = "&about";
menuabout.index = 0;
menuabout.click += new system.eventhandler (this.menuabout_click);
this.text = "system information - using api";
this.maximizebox = false;
this.autoscalebasesize = new system.drawing.size (5, 13);
this.minimizebox = false;
this.menu = this.mainmenu1;
this.clientsize = new system.drawing.size (408, 213);
this.controls.add (this.listbox1);
this.controls.add (this.button1);
}
protected void menuabout_click (object sender, system.eventargs e)
{
form abt=new about() ;
abt.showdialog();
}
protected void button1_click (object sender, system.eventargs e)
{
try
{
system_info psi = new system_info();
getsysteminfo(ref psi);
string cputype;
switch (psi.dwprocessortype)
{
case processor_intel_386 :
cputype= "intel 386";
break;
case processor_intel_486 :
cputype = "intel 486" ;
break;
case processor_intel_pentium :
cputype = "intel pentium";
break;
case processor_mips_r4000 :
cputype = "mips r4000";
break;
case processor_alpha_21064 :
cputype = "dec alpha 21064";
break;
default :
cputype = "(unknown)";
}
listbox1.insertitem (0,"active processor mask :"+psi.dwactiveprocessormask.tostring());
listbox1.insertitem (1,"allocation granularity :"+psi.dwallocationgranularity.tostring());
listbox1.insertitem (2,"number of processors :"+psi.dwnumberofprocessors.tostring());
listbox1.insertitem (3,"oem id :"+psi.dwoemid.tostring());
listbox1.insertitem (4,"page size:"+psi.dwpagesize.tostring());
listbox1.insertitem (5,"processor level value:"+psi.dwprocessorlevel.tostring());
listbox1.insertitem (6,"processor revision:"+ psi.dwprocessorrevision.tostring());
listbox1.insertitem (7,"cpu type:"+cputype);
listbox1.insertitem (8,"maximum application address: "+psi.lpmaximumapplicationaddress.tostring());
listbox1.insertitem (9,"minimum application address:" +psi.lpminimumapplicationaddress.tostring());
/************** 從 globalmemorystatus 獲取返回值****************/
memorystatus memst = new memorystatus ();
globalmemorystatus (ref memst);
listbox1.insertitem(10,"available page file :"+ (memst.dwavailpagefile/1024).tostring ());
listbox1.insertitem(11,"available physical memory : " + (memst.dwavailphys/1024).tostring());
listbox1.insertitem(12,"available virtual memory:" + (memst.dwavailvirtual/1024).tostring ());
listbox1.insertitem(13,"size of structur :" + memst.dwlength.tostring());
listbox1.insertitem(14,"memory in use :"+ memst.dwmemoryload.tostring());
listbox1.insertitem(15,"total page size :"+ (memst.dwtotalpagefile/1024).tostring ());
listbox1.insertitem(16,"total physical memory :" + (memst.dwtotalphys/1024).tostring());
listbox1.insertitem(17,"total virtual memory :" + (memst.dwtotalvirtual/1024).tostring ());
}
catch(exception er)
{
messagebox.show (er.message);
}
}
public static void main(string[] args)
{
try
{
application.run(new form1());
}
catch(exception er)
{
messagebox.show (er.message );
}
}
}
}
新聞熱點
疑難解答