前言
太多的例子講如何如何實現VC編寫動態鏈接庫,VB中聲明後使用,但沒有一個好的文章來深入探討這個問題,本文負責解決此類問題。
1.一般情況
VB中定義為:
Private Declare Function FuncFoo Lib "MyStDll.DLL" _
(ByVal lParam1 As Long, ByVal lParam2 As Long) As Long
VC中定義為:
UINT WINAPI FuncFoo(UINT lParam1, UINT lParam2);
不用說大家就知道兩個long參數,按值傳遞的
2.實現類型數組:
VB中定義為:
Private Declare Function FuncFoo Lib "MyStDll.DLL" _
(lParam1 As Long, ByVal lParam2 As Long) As Long
VC中定義為:
UINT WINAPI FuncFoo(UINT lParam1[DATASIZE], UINT lParam2);
其中DATASIZE為定義常數
ByRef 按地址傳參數,當然VB缺省參數形式ByRef,將數組的第一個數據傳入,就是這個類型數組的地址了
用法如下:
...
Dim oData(1 to 3) as Long
oData(1) = 100
oData(2) = 200
oData(3) = 300
Call FuncFoo(oData(0),3)
...
3.實現結構數組:
如果此時用上述方法
在VB中來這樣寫:
Private Type LPDATA
Row as Long
Col as Long
Tips as String
Data as double
End Type
Private Declare Function FuncFoo Lib "MyStDll.DLL" _
(lParam1 As LPDATA, ByVal lParam2 As Long) As Long
在VC中這樣寫:
typedef struct tagData {
UINT Row;
UINT Col;
BSTR Tips; //注意一般關於字符串最好用 BSTR ,後面解釋為什麼
double Data;
} * LPDATA;
UINT WINAPI FuncFoo(LPDATA lParam1[DATASIZE] ,UINT lParam2);或
UINT WINAPI FuncFoo(LPDATA *lParam1 ,UINT lParam2);
這樣的結果大家不妨試一試,數據亂的毫無規律,我也很不解,搞不懂,網上SOS,HELP me,目前最流行的方式,我也用上了,國內外知名的,被遺忘的角落,等等,大家沒人理我,可能看到了不解,個中高手過著深入簡出的生活,沒有回答,沒人解答,我從MSDN終於搞到一個東西他就是SAFEARRARY
typedef struct FARSTRUCT tagSAFEARRAY {
unsigned short cDims;
unsigned short fFeatures;
unsigned short cbElements;
unsigned short cLocks;
unsigned long handle;
void HUGEP *pvData ;
SAFEARRAYBOUND rgsabound[1];
} SAFEARRAY;
下次我再單獨寫篇稿子討論這個東西,解決問題先. 應該這麼做
在VB中來這樣寫:
Private Type LPDATA
Row as Long
Col as Long
Tips as String
Data as double
End Type
Private Declare Function FuncFoo Lib "MyStDll.DLL" _
(lParam1() As LPDATA, ByVal lParam2 As Long) As Long
用法如下:
...
Dim oData(1 to 3) as Long
oData(1) = 100
oData(2) = 200
oData(3) = 300
Call FuncFoo(oData(),3)
...
在VC中這樣寫:
typedef struct tagData {
UINT Row;
UINT Col;
BSTR Tips; //注意一般關於字符串最好用 BSTR ,後面解釋為什麼
double Data;
} * LPDATA;
UINT WINAPI FuncFoo(LPSAFEARRAY FAR * Param1,UINT lParam2);
在VC中訪問VB傳入的結構數據:
LPDATA lparDataSet;
lparDataSet = (LPDATA)((*Param1)->pvData);
for (UINT u=0;u<((*Param1)->rgsabound->cElements);u++,lparDataSet++)
{
UINT aa = lparDataSet->Row;
CString bb = lparDataSet->Tips;
double cc = lparDataSet->Data;
}
注意:為什麼用BSTR不用什麼LPCTSTR xxx,TCHAR xxx[mmm],char xxx[mmm],我舉個例子大家試一試就知道了
1. VB送入字符 "個大12"
2. 正常VC顯示數據為 B8 F6 B4 F3 31 32
3. VC結構傳入顯示為 2A 4E 27 59 31 00 32 00 (unicode?)
第一部分寫到這裡吧,剩下的東西還是等各位朋友自己慢慢去摸索,倉促難免有疏漏之處,請各位諒解。
本文配套源碼