c#在訪問win 32 api時需要處理c 結構與c#結構的對映,這在msdn以及許多blog上都可以找到參考的資料。win 32 中有一些定義複雜的struct,這些結構體擁有長度固定的陣列或者一些特殊的結構,比如定義擁有有char name[ulen]、guid、handle等。在mprapi中有乙個名為ras_connection_2這樣的結構體,它描述了遠端連線到伺服器【遠端與路由訪問服務】的連線資訊,是乙個級聯的、複雜的結構體定義。其win 32的定義如下:
typedef struct_ras_connection_2 ras_connection_2, *pras_connection_2;
typedef
struct
_ppp_info_2 ppp_info_2;
typedef
struct
_ppp_ipcp_info2 ppp_ipcp_info2;
上面只只列出了一項層級定義,即ras_connection_2 -> ppp_fino_2 ->ppp_ipcp_info2,其他層級類似。在這樣乙個結構封裝定義中,需要涉及到固定長度陣列的封送(c++到.net)、特殊型別定義(handle & guid)以及結構體包含。在msdn上[2],找到了以下這些.net已經封裝好的用於互動的特殊型別。
特殊值型別
系統值類型別
idl型別
system.datetime
date
system.deimal
decimal
system.guid
guid
system.drawing.color
ole_color
guid對應system.guid。handle不能對應system.activities.handle,該類與互調無關。handle一般對應system.intptr,見下列**第一行。固定長度char陣列(而不是字串指標)的定義見第5、6行。第7行的結構體同樣需要在c#中進行自行定義,除了命名其他無需特別注意。
1[structlayout(layoutkind.sequential,charset = charset.unicode)]
2public
struct
ras_connection_2
3;
對於win 32結構體中的固定長度的char定義,不能使用[marshalas(unmanagedtype.byvalarray, sizeconst = max_port_name)]。字串陣列只能使用unmanagedtype.byvalarray,並指定陣列長度大小,即類似這樣定義unmanagedtype.byvalarray, sizeconst = max_port_name。如果使用bybalarray,將會在執行時報錯。
「system.typeloadexception」型別的異常在 mscorlib.dll 中發生,但未在使用者**中進行處理其他資訊: 無法封送處理型別為「****」的字段「wszportname」: 無效的託管/非託管型別組合(string 型別的字段必須與 lpstr、lpwstr、lptstr、bstr 或 byvaltstr 成對出現)。
在處理字串陣列時,需要明確指定字元的編碼方式。需要明確指明為charset = charset.unicode,否則會出現字串的擷取不正確。比如出現vpn被解析為v情況,這是因為預設的編碼可能為ascii,而將正常的空解析為了結束符。
win32 型別
.net 型別
pbyte
intptr
參考:[1]預設封送處理行為,
[2]可直複製和不可直接複製型別,
[2]陣列的預設封送處理——結構內的陣列,
Win32的時間型別
在win32時間型別有這樣幾種型別filetime systemtime windowstime 先提個問題,如何計算當前時間100天以後的時間,在win32中。1.systemtime systemtime的定義是這樣 typedef struct systemtime systemtime 很大...
Win32的時間型別
在win32時間型別有這樣幾種型別 filetime systemtime windowstime 先提個問題,如何計算當前時間100天以後的時間,在win32中。1.systemtime systemtime的定義是這樣 typedef struct systemtime systemtime 很...
Win32程式設計 SetTimer的使用
settimer函式和wm timer訊息是win32 api中最基本的玩意兒了,任何初學win32 api程式設計的人都應該對此很熟悉吧。在這篇文章中,讓我們來深入了解一下和settimer相關的使用和應用。uint ptr settimer hwnd hwnd,uint ptr nidevent...