以系統函式 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型別變...