C 使用Win32函式的一些型別轉換

2022-07-13 12:12:09 字數 2044 閱讀 5320

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...