-
通过VB结构数组输入数据VC编写DLL实现图形文件(1)
前言
太多的例子讲如何如何实现VC编写动态链接库,VB中声明后使用,但没有一个好的文章来深入探讨这个问题,本文负责解决此类问题。
1.一般情况
VB中定义为:
1
2
|
Private Declare Function FuncFoo Lib "MyStDll.DLL" _ (ByVal lParam1 As Long, ByVal lParam2 As Long) As Long |
VC中定义为:
1
|
UINT WINAPI FuncFoo( UINT lParam1, UINT lParam2); |
不用说大家就知道两个long参数,按值传递的
2.实现类型数组:
VB中定义为:
1
2
|
Private Declare Function FuncFoo Lib "MyStDll.DLL" _ (lParam1 As Long, ByVal lParam2 As Long) As Long |
VC中定义为:
1
|
UINT WINAPI FuncFoo( UINT lParam1[DATASIZE], UINT lParam2); |
其中DATASIZE为定义常数ByRef 按地址传参数,当然VB缺省参数形式ByRef,将数组的第一个数据传入,就是这个类型数组的地址了
用法如下:
1
2
3
4
5
6
7
|
... Dim oData(1 to 3) as Long oData(1) = 100 oData(2) = 200 oData(3) = 300 Call FuncFoo(oData(0),3) ... |
3.实现结构数组:
如果此时用上述方法
在VB中来这样写:
1
2
3
4
5
6
7
8
|
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中这样写:
1
2
3
4
5
6
7
8
|
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
1
2
3
4
5
6
7
8
9
|
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中来这样写:
1
2
3
4
5
6
7
8
|
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 |
用法如下:
1
2
3
4
5
6
7
|
... Dim oData(1 to 3) as Long oData(1) = 100 oData(2) = 200 oData(3) = 300 Call FuncFoo(oData(),3) ... |
在VC中这样写:
1
2
3
4
5
6
7
|
typedef struct tagData { UINT Row; UINT Col; BSTR Tips; //注意一般关于字符串最好用 BSTR ,后面解释为什么 double Data; } * LPDATA; UINT WINAPI FuncFoo(LPSAFEARRAY FAR * Param1, UINT lParam2); |
在VC中访问VB传入的结构数据:
1
2
3
4
5
6
7
8
|
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?)
第一部分写到这里吧,剩下的东西还是等各位朋友自己慢慢去摸索,仓促难免有疏漏之处,请各位谅解。
作者信息:
阿鬼 [ http://GhostStudio.yeah.net ]
本文写于:2001/10/26 15:40
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式