• 通过VB结构数组输入数据VC编写DLL




    前言
    太多的例子讲如何如何实现VC编写动态链接库,VB中声明后使用,但没有一个好的文章来深入探讨这个问题,本文负责解决此类问题。

    下载本文示例源代码 大小:125K

    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?)

    第一部分写到这里吧,剩下的东西还是等各位朋友自己慢慢去摸索,仓促难免有疏漏之处,请各位谅解。

     

    from: http://www.vckbase.com/document/viewdoc/?id=274


  • 相关阅读:
    Java——static
    Java——package与import
    Java——方法重写
    Java——super
    Java——类的继承、访问控制
    Java——API文档
    Java——对象转型
    Java——动态绑定和多态
    Java——抽象类
    redis在linux上的安装和配置
  • 原文地址:https://www.cnblogs.com/no7dw/p/2023311.html
Copyright © 2020-2023  润新知