c 如何呼叫非託管函式2 傳遞結構和類

2022-01-23 12:29:41 字數 1429 閱讀 4018

以系統函式 getsystemtime 為例,以下分別演示了如何傳遞結構和類。

一 傳遞結構

參考msdn可以知道他的定義為:

void winapi getsystemtime(__outlpsystemtimelpsystemtime);

其中lpsystemtime就是乙個結構體:

c++-code:

typedef struct _systemtime  systemtime,   *psystemtime;

根據原始定義我們可以把它轉成c#的形式(word型別相當於c#中的ushort)

c#-code:

[structlayout(layoutkind.sequential)] public struct systemtime 

由於該結構是作為out引數傳遞的,因此在c#中我們必須通過引用來傳遞:

c#-code:

[dllimport("kernel32.dll")] public static extern void getsystemtime(ref systemtime st);

以下是完整**:

c#-code:

public class kernel32  

[dllimport("kernel32.dll")]     public static extern void getsystemtime(ref systemtime st); }

呼叫起來也比較簡單:

c#-code:

private void btngetsystime_click(object sender, eventargs e) -- ::",         systime.wyear,         systime.wmonth,         systime.wday,         systime.whour,         systime.wminute,         systime.wsecond)); }

二 傳遞類

對於以上的例子,我們也可以把結構改成類傳遞給非託管函式,因為類是引用型別,所以我們不再需要ref宣告:

c#-code:

public class kernel32  

[dllimport("kernel32.dll")]     public static extern void getsystemtime(systemtime st); }

注意這裡只是乙個特例,並不是所有的情況既可以定義成結構型別也可以定義成類型別,通常我們應遵循以下原則:

參考:

C 呼叫非託管DLL函式

demo region c 捕獲當前螢幕的例子 using system using system.drawing using system.collections using system.componentmodel using system.windows.forms using system...

託管函式和非託管函式如何互相傳遞ansi字串?

先來介紹兩個預處理指令 pragma unmanaged pragma managed 這兩個預處理指令,控制函式編譯成託管函式,還是非託管函式。是函式級別的預控制指令。1.託管函式傳送字串給非託管函式 分三步走 a.先呼叫stringtohglobalansi將string轉換成intptr型別變...

託管函式和非託管函式如何互相傳遞ansi字串?

先來介紹兩個預處理指令 pragma unmanaged pragma managed 這兩個預處理指令,控制函式編譯成託管函式,還是非託管函式。是函式級別的預控制指令。1.託管函式傳送字串給非託管函式 分三步走 a.先呼叫stringtohglobalansi將string轉換成intptr型別變...