C 呼叫VC dll輸出引數

2022-08-26 12:36:11 字數 1347 閱讀 6029

最近做專案需要把以前vc寫的程式整合到vs2005來,用c#寫的,以前vc的動態連線庫寫好了,重寫比較麻煩,讓c#呼叫vc dll就好了。但碰到了乙個問題:vc中作為輸出引數的char*型別的變數應該怎樣申明才能正確輸出資料呢?

一般說來,在vc中一般的輸出引數都為指標或陣列的形式,如果是一般型別的指標如整形等,在c#中用ref加上資料變數則可獲得返回值。所以我試著把vc中char*輸出變數在c#中寫成ref string(因為char*在c#中可以寫成string或char),但發現這樣寫是不行的。

後來從網上查了些資料,發現char*型別資料作為輸出引數時,在c#中資料型別要寫成stringbuilder。這樣既解決了傳進去的引數問題,又解決了傳出引數的問題。

以下例子是我用c#呼叫vc dll中的函式的宣告及使用方法:

using system.runtime.interopservices;//使用dll動態庫和api函式必需

[dllimport("pmacnc.dll", charset = charset.ansi)]

public static extern int getresponse(stringbuilder com_response, system.uint32

maxchar, system.char sendchar);

global.userdll.getresponse(com_response, 100, sendchar1);

c#呼叫vc dll輸出引數的注意事項

1.charset要使用ansi,因為vc預設是ansi的,而c#是unicode,兩者不統一會產生亂碼。還有其他diiimport的其他引數如下,除了entrypoint,其他三個都是非必要的。

entrypoint: 指定要呼叫的 dll 入口點。預設入口點名稱是託管方法的名稱 。

charset: 控制名稱重整和封送 string 引數的方式 (預設是unicode)

callingconvention指示入口點的函式呼叫約定(預設winapi)

setlasterror 指示被呼叫方在從屬性化方法返回之前是否呼叫 setlasterror win32 api 函式 (c#中預設false )

2.結構體的引用傳遞

首先在c#中定義和c++相同的結構體,如果是引用傳遞,在結構體前面加上[in, out],如:

[dllimport(@"test.dll")]

public static extern int test([in, out] slinedata lndt,ref uint32 length);

3.如果遇到char**型別的輸出引數也就是指標的指標,或者二維陣列或其他更複雜的情況。可以參考以下網頁托福答案

關於C 呼叫VC DLL

由於在c 呼叫vc的dll檔案不能直接引用,那麼,我們可以通過以下辦法解決。dll檔案分為託管和非託管,在呼叫託管的很好辦,直接被使用的需要引用,間接使用的需要拷貝到bin目錄下.非託管的處理會比較麻煩,實際上,你拷貝到bin沒有任何幫助,因為clr會把檔案拷貝到乙個臨時目錄下,然後在那執行web,...

VB呼叫VC DLL的引數問題

問題示例如下,假設vb中申明乙個dll中的匯出函式為 public declare function somefunc lib test.dll alias somefunc byval name as string as long 那麼vc做的dll中的匯出函式原型是什麼?因為vb中的string...

vb呼叫vc dll檔案

關於dll的建立與呼叫使用vc 的嚮導即可。具體操作如下 開啟選單 file new 選擇 projects win32 dynamic link library 選擇 a dll project 即可。這時系統會自動生成3個檔案 cpp,stdafx.cpp,stdafx.h。之後將入口函式dll...