VB呼叫VC DLL的引數問題

2021-04-27 10:59:08 字數 918 閱讀 2120

問題示例如下,假設vb中申明乙個dll中的匯出函式為:

public declare function somefunc lib "test.dll" alias "somefunc" (byval name as string) as long

那麼vc做的dll中的匯出函式原型是什麼?

因為vb中的string都是unicode串,本人想當然地認為dll匯出函式應該這樣寫:

extern "c" long __stdcall somefunc(lpcwstr name);

這兩天搞了乙個測試,發現自己錯了,vb呼叫somefunc()時得不到正確的結果,最後終於發現原來想當然的東西是錯誤的,vb在呼叫dll或者系統提供的api時,使用的都是ansi版本的api,也就是說string引數會被自動轉換成ansi串後再作為引數呼叫api,如果某個串作為返回值,也是返回ansi串後被vb轉換成unicode,所以正確答案應該是

extern "c" long __stdcall somefunc(lpcstr name);

這個問題同時引申出另乙個問題,假如某個dll的匯出函式中用的是lpcwstr作為引數,那麼vb使用該函式時該如何申明和使用呢?此時不能再使用string作為引數型別了,應該換一種方式:

public declare function somefunc lib "test.dll" alias "somefunc" (byval name as long) as long

注意這裡申明的引數型別不再是string,而是long,其實代表乙個指標的值。使用的時候也需要一點技巧:

dim name as string = "hello world"

somefunc(strptr(name))

不能直接用name作為引數,而是要用strptr(name)獲取unicode串的指標傳遞給函式。

vb呼叫vc dll檔案

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

C 呼叫VC dll輸出引數

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

Del命令引數 vb呼叫shell

dos下的del命令是用來刪除檔案的,而dos下的rd命令才是用來刪除資料夾的,命令的具體使用方法請看下面的文字 del 命令 刪除乙個或數個檔案。del p f s q a attributes names erase p f s q a attributes names names 指定乙個或數...