通过VB结构数组输入数据VC编写DLL实现图形文件
来源:百度文库 编辑:神马文学网 时间:2024/04/29 07:52:00
通过VB结构数组输入数据VC编写DLL实现图形文件(1) (作者: 阿鬼)
cyberghost
C、C++ (2001-10-26 19:09:03)
[前言]
太多的例子讲如何如何实现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?)
第一部分写到这里吧,剩下的东西还是等各位朋友自己慢慢去摸索,仓促难免有疏漏之处,请各位谅解。
cyberghost
C、C++ (2001-10-26 19:09:03)
[前言]
太多的例子讲如何如何实现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?)
第一部分写到这里吧,剩下的东西还是等各位朋友自己慢慢去摸索,仓促难免有疏漏之处,请各位谅解。
通过VB结构数组输入数据VC编写DLL实现图形文件
如何用VC编写dll文件
如何用VC编写DLL动态链接库文件0
通过多选框实现多对多关系的数据输入
轻松编写VB.NET .DLL动态链接库文件_开发平台子站_技巧_IT专家网
如何编写DLL文件(开发环境VS2005)
C++写的DLL,传结构给VB用
VC实现串行通信的动态链接库(DLL)
VC实现串行通信的动态链接库(DLL)A
通过网页实现文件上传
VC提示无法找到MSVCRTD.DLL文件这样解决
在VC++中创建DLL文件并加载
在VC++中创建DLL文件并加载
VB 实现 数据快速导入EXCEL
VB 实现 数据快速导入EXCEL
VB.NET访问INI文件代码实现
vb查找文件:VB中如何实现文本查找功能
用DLL实现把数据库的记录导出到EXCEL中(VB) - 应用程序 - VB教程
通过注册表清除内存内不使用的DLL文件
Visual C++中调用DLL实现数据加密
在c#中使用vc++编写的封装在Dll中的类
在VB应用程序中调用VC环境下开发的DLL
探讨通过VB向EXCEL传输数据的方法--
VC DLL导出类