Chinaunix首页 | 论坛 | 博客
  • 博客访问: 378713
  • 博文数量: 715
  • 博客积分: 40000
  • 博客等级: 大将
  • 技术积分: 5005
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-13 14:46
文章分类

全部博文(715)

文章存档

2011年(1)

2008年(714)

我的朋友

分类:

2008-10-13 16:37:44

前言
太多的例子讲如何如何实现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?)

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

作者信息:
阿鬼 [ ]
本文写于:2001/10/26 15:40


--------------------next---------------------

阅读(137) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~