c 平台呼叫 傳遞引數

2022-08-18 05:36:18 字數 1478 閱讀 6635

最近做專案用到了dll,網上介紹了很多,但是真要自己實現起來確實也費了不少功夫,這裡有自己基礎不紮實的原因,也有客觀原因,比如平台呼叫中,好多細節問題如果注意不到,就會得到錯誤的答案。下面是些我寫的一些小測試程式:

code

1//str為輸入引數,outstr為輸出引數

2char

*strtest(

char

*str, 

inta, unsigned 

char

*outstr);34

[dllimport(

"facelib.dll

", entrypoint ="

strtest

", charset 

=charset.ansi, callingconvention 

=callingconvention.stdcall)]

5public

static

extern

string

strtest(

string

str,

outint

a,[in,out] 

byte

outstr); 67

呼叫函式為:

8private

void

button1_click(

object

sender, eventargs e)931

strtest(s, 

outa, sb);

32foreach

(int

i in

sb)33

3637

/**/

////stringbuilder sb = new stringbuilder(256);

38messagebox.show(ss);

39}40

41應該注意的問題:

421. c#編碼方式是unicode,而c裡面是ansi。在傳入字串時,要指定charset為ansi格式,否則會出錯。

432. 傳入char

*用string即可,這方面資料很多,傳出用stringbuilder,原因可以參見csdn上的封送字串,和**函式部分的介紹。這裡要說的是,用stringbuilder來傳出引數時,要保證函式執行完儲存在非託管函式引數中的值不被釋放,比如在原函式char

*strtest(

char

*str, 

inta, unsigned 

char

*outstr);中如果我把以字串傳入str,然後儲存到char

*outstr中,要用memcpy()或strcpy()來拷貝,而不能直接outstr

=str,這在原函式中執行是沒問題的,但是執行完畢後,不能返回到c#的託管函式。其中原因就是outstr只是乙個str的copy,或者說outstr和str指向了同一塊記憶體,在非託管函式執行完畢後,outstr就銷毀了,自然也不能返回值。

4445

c 函式呼叫引數傳遞

在c 中,引數傳遞的方式是 實虛結合 按值傳遞 pass by value 位址傳遞 pass by pointer 引用傳遞 pass by reference 按值傳遞的過程為 首先計算出實參表示式的值,接著給對應的形參變數分配乙個儲存空間,該空間的大小等於該形參型別的,然後把以求出的實參表示式...

python 呼叫C 常用引數傳遞

環境ubuntu 16.04 python3 1.pycall.c include include struct test 傳遞數值 int valtest int n 傳遞字串 int strtest char pval 傳遞結構體 int structtest struct test data ...

c 呼叫Matlab的引數傳遞

c 呼叫matlab函式時,需要將c 資料型別轉換成matlab資料型別。此時,需要引用mwarray.dll檔案。該程式集包含了與matlab資料交換的類。其中,mwarray類及每個派生類提供建立和訪問 matlab 資料型別的方法。所有類都派生自抽象的 mwarray 類和每個派生類,對映到 ...