c 的呼叫VC的dll輸出引數的問題

2021-04-21 14:55:58 字數 1391 閱讀 5719

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

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

後來從網上查了些資料,發現char*型別資料作為輸出引數時,在c#中資料型別要寫成stringbuilder

。這樣既解決了傳進去的引數問題,又解決了傳出引數的問題。

以下例子是我呼叫的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);

ps:還有一些要注意的地方

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],如:

VC中呼叫C 的DLL

在工程編譯時同步互操作註冊生成檔案。在vs中c 專案,選擇專案屬性,開啟屬性配置頁,生成頁中選擇 為com互操作註冊 核取方塊,在編譯時會同時生成tlb檔案 匯入webservices 如果類中未用到webservices,該過程可以省略,直接跳到建立c dll處即可 引用 新增服務引用 高階 新增...

Delphi 呼叫VC生成的DLL

1.在vc中新建乙個 dll 工程。寫如 如 extern c int npn int m,int n 編譯生成 dll 檔案。2。在delphi 中申明 function getpplength integer cdecl external dll.dll function npn m integ...

Delphi 呼叫VC生成的DLL

1.在vc中新建乙個 dll 工程。寫如 如 extern c int npn int m,int n 編譯生成 dll 檔案。2。在delphi 中申明 function getpplength integer cdecl external dll.dll function npn m integ...