程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 通過VB結構數組輸入數據VC編寫DLL實現圖形文件

通過VB結構數組輸入數據VC編寫DLL實現圖形文件

編輯:關於VC++

前言

太多的例子講如何如何實現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?)

第一部分寫到這裡吧,剩下的東西還是等各位朋友自己慢慢去摸索,倉促難免有疏漏之處,請各位諒解。

本文配套源碼

  1. 上一頁:
  2. 下一頁:
欄目導航
Copyright © 程式師世界 All Rights Reserved