C 寫的DLL,傳結構給VB用

2021-04-01 22:24:53 字數 1425 閱讀 6485

由於某些情況下,我們需要用cb或是vc寫乙個dll,而呼叫它的確實vb。

這裡特別強調一下使用標準資料型別的問題,就是說用c++寫的東西,匯出的函式最好使用標準的int,char,long,double...標準型別以及他們的指標。

很多人都強調過這個問題。但是我最近遇到乙個需要vb傳結構給cb做的dll,然後資料返回到結構的情況。

typedef struct xtest

*px;

__declspec(dllexport) void __stdcall test  (*px,char *x,char *y);

void __stdcall test  (*px,char *x,char *y)

在vb裡你要寫乙個同樣的結構

public type xtest

a as string*100

b as string*100

end type

public declare funciton test lib"你的dll名字" (byref px as xtest,byval x,byval y)

這樣才可以成功,如果使用了不定長的字串,那麼很可能你的系統要崩潰,我在我這裡是這樣。如果有問題,請大家指正。

另外,vb宣告dll裡的函式,需要dll的名字放在 lib後面,但是這個名字在執行時,你必須要寫全路徑或是放在system32目錄,即使放在vb程式所在的目錄,也需要全路徑。但是編譯過的vb程式,可以識別放在同目錄下在宣告裡沒有寫全路徑的dll。

這樣的結構,看起來是很不錯的做法,但是對於cb/delphi,我認為用string型別就好。當我們需要傳出非標型別的時候,把需要傳入/傳出的資料,用結構封裝起來,這樣就可以避免寫引數n多的函式,只要定義乙個機構就可以了。然後在結構裡,我們使用乙個型別標誌來確定我們需要提取的引數。

public type xtest

para as string

a as string

b as string

...end type

function test(v as xtest)

if para="100" then

你的操作

end if

if para="200" then

...end if

end function

這樣的方式可以讓我們在乙個函式裡處理n多的事情。只要根據不同的標誌就可以確定我們做的操作。

很明顯這種做法,就是我們通常所謂的協議實現。無論是銀聯的8583,還是rs232c,都是一種約定和規範。我們在程式設計的時候,適當的制定一些簡單的規範,對我們批量處理是非常有好處的。而且最後的風狀效果也是很不錯的。

使用類做這樣的事情當然是很不錯的事情,但我們通常不建議直接使用匯出類。而是使用介面,以免出現某些資料安全性方面的問題,因為你一但匯出乙個類,那麼通過指標的簡單操作,很容易從類的例項當中獲取資料。所以,介面程式設計就比較重要了。

C 箴言 用傳引用給const取代傳值

預設情況下,c 以傳值方式將物件傳入或傳出函式 這是乙個從 c 繼承來的特性 除非你特別指定其它方式,否則函式的引數就會以實際引數 actual argument 的拷貝進行初始化,而函式的呼叫者會收到函式返回值的乙個拷貝。這個拷貝由物件的拷貝建構函式生成。這就使得傳值 pass by value ...

C 呼叫C 寫的DLL

方法有不少,這裡記錄其中的乙個方法。編譯 呼叫通過了的。期間遇到的問題是c 呼叫時傳遞string型別的引數和返回值會報錯。targetinvocationexception異常,值不在範圍內,記憶體不可訪問等等。解決方法是 在c 的dll中將string型別的引數返回值改為lptstr型別。在c ...

C 呼叫Delphi寫的DLL

在c 中可以這樣呼叫 呼叫 這裡需要注意的是要外傳的pchar型別引數,在c 中對應使用stringbuilder,如果使用string沒有任何資訊傳出,如果使用ref string形式,則會出現記憶體錯誤。在c 中可以這樣呼叫 呼叫 經過測試 delphi中integer的引數使用c 中的int即...