vba调用c++的dll时,参数是指针数组,无法匹配.求助!

illfar 2009-08-18 11:17:07
c++代码:long functionA (class a, struct1 *IDINFO, struct2 * NameINFO)
{
...
a->add(IDINFO,NameINFO);
...
}
IDINF是入力的,NameINFO是出力的,主要问题是NameINFO这个结构体里有数组指针
struce NameINFO
{
wchar * STR[11]
long num
}


VBA代码:
Private Declare Function functionA Lib "functionA.dll" (ByVal objptr As Long, ByRef ID As IDINFO, ByRef Name As NameINFO) As Long

在vba中定义了这个结构体
Private Type NameINFO
str(1 To 11) As String
num As Long
End Type

然后用vba调用这个函数后,原来在c++里时,STR[1]到[11]里面是放的字符串,如

STR[1]是"我们"

STR[1]是"agd"
....
可是vba出来后,值感觉都只有2个字符了
STR[1]是"w."
STR[1]是"a."
....

感觉应该是vba接口这个函数时,结构体定义时的类型和c++的不匹配吧
但不知道则么改
请教高手,急!!
...全文
274 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
dengyl01 2009-09-07
  • 打赏
  • 举报
回复
用CopyMemory将指针转换为字符串可还是不行
Saingel 2009-08-21
  • 打赏
  • 举报
回复
class a不是引用,也不是指针,vb应该不能调,
除非用vC再包一层去掉第一个参数。。。。
bdzwj 2009-08-20
  • 打赏
  • 举报
回复
http://hi.baidu.com/kyky6/blog/item/095626974e0bf36854fb9632.html
threenewbee 2009-08-19
  • 打赏
  • 举报
回复
Private Type NameINFO
str As String * 11
num As Long
End Type
illfar 2009-08-19
  • 打赏
  • 举报
回复
还是不行呀
出来的是数字2089552
bdzwj 2009-08-19
  • 打赏
  • 举报
回复
Private Type NameINFO
str(1 To 11) As long
num As Long
End Type

dim s1 as string
dim info as nameinfo
s1 = "adb"

info.str(1) = strptr(s1)
illfar 2009-08-19
  • 打赏
  • 举报
回复
试过的
不行
字符串不对的,有“.”的乱码
我字符串因该有中文字的
而且这样改了,后面的num值也不对了
illfar 2009-08-19
  • 打赏
  • 举报
回复
vb里则么转换阿
bdzwj 2009-08-19
  • 打赏
  • 举报
回复
晕, NameINFO结构中的str声明的是长整型,那只是保存了一个指针, 如果你想显示字符串,那需要将指针转换为字符串
illfar 2009-08-19
  • 打赏
  • 举报
回复
7楼出来答案
str都是long型的一串数字
illfar 2009-08-19
  • 打赏
  • 举报
回复
按照3楼的做法
dim s1 as string
dim info as nameinfo
s1 = "adb"
info.str(1) = strptr(s1)

functionA(Long, IDINFO, info)

info是输出的
可是这样,里面的str(1)等的值还不对,像被截了都只有2位
bdzwj 2009-08-19
  • 打赏
  • 举报
回复
那试试下面的代码

Private Type NameINFO
str(1 To 11) As long
num As Long
End Type

dim s1 as string
dim s() as byte
dim info as nameinfo
s1 = "adb"

s = s1
info.str(1) = varptr(s(0))
illfar 2009-08-19
  • 打赏
  • 举报
回复
还是不行啊
感觉出来是被截取的字符串
是不是和wchar 有关阿
bigriverhorse 2009-08-19
  • 打赏
  • 举报
回复
3楼的应该没有错误,

我倒是觉得是楼主的DLL代码存储时用错了,

要确定这个问题,就要看看楼主用C++时,是怎么调用DLL的呢,贴出来看看?
因文件超过20M不能上传,所以拆分为两个文件分次上传 第1章 COM背景知识 1.1 COM的起源 1.1.1 软件业面临的挑战 1.1.2 传统解决方案 1.1.3 面向对象程序设计方法 1.1.4 最终解决方案:组件软件 1.1.5 面向对象的组件模型——COM 1.2 COM的发展历程 1.2.1 COM以前的对象技术:DDE、OLE 1、VBX控件 1.2.2 COM首次亮相:OLE2 1.2.3 Microsoft拥抱Internet:ActiveX 1.2.4 更多的新名词:Windows DNA和COM+ 1.2.5 远程对象:ORBs和DCOM 1.2.6 COM的最新版本:COM+ 1.3 COM技术现状 1.3.1 COM与CORBA 1.3.2 COM与Enterprise Java Beans 1.3.3 Windows之外的COM 小结 第2章 从C++到COM 2.1 C++客户重用C++对象——例程DB 2.1.1 C++对象 2.1.2 客户程序 2.2 将C++对象移进DLL中——例程DB_cppdll 2.2.1 成员函数的引出 2.2.2 内存分配 2.2.3 Unicode/ASCII兼容 2.2.4 例程实现 2.2.4.1 修改接口文件 2.2.4.2 修改对象程序 2.2.4.3 修改客户程序 2.3 C++对象使用抽象基类——例程DB_vtbl 2.3.1 问题:私有数据成员被暴露 2.3.2 解决方案:抽象基类 2.3.2.1 什么是抽象基类(Abstract Base Class) 2.3.2.2 实现秘诀:虚函数(Virtual Functions) 2.3.3 使用抽象基类 2.3.4 例程实现 2.3.4.1 修改接口文件 2.3.4.2 修改对象程序 2.3.4.3 修改客户程序 2.4 改由COM库装载C++对象——例程dbalmostcom 2.4.1 COM库 2.4.2 对象创建的标准入口点 2.4.3 标准对象创建API 2.4.4 标准对象注册 2.4.5 例程实现 2.4.5.1 修改接口文件 2.4.5.2 修改对象程序 2.4.5.3 修改客户程序 2.5 将C++对象变成COM对象 2.5.1 引用计数 2.5.2 多接口 2.5.3 IUnknown接口 2.5.4 标准类厂接口:IClassFactory 2.5.5 对象代码的动态卸载 2.5.6 自动注册 2.5.7 例程实现 2.5.7.1 修改接口文件 2.5.7.2 修改对象程序 2.5.7.3 修改客户程序 2.6 为COM对象添加多接口支持 2.6.1 多接口 2.6.2 DEFINE_GUID 2.6.3 例程实现 2.6.3.1 修改接口文件 2.6.3.2 修改对象程序 2.6.3.3 修改客户程序 小结 第3章 COM基础知识 3.1 对象与接口 3.1.1 COM对象 3.1.2 COM接口 3.1.3 IUnknown接口 3.1.3.1 生存期控制:AddRef和Release 3.1.3.2 接口查询:QueryInterface 3.1.4 全球唯一标识符GUID 3.1.5 COM接口定义 3.1.6 接口描述语言IDL 3.2 COM应用模型 3.2.1 客户/服务器模型 3.2.2 进程内组件 3.2.3 进程外组件 3.2.4 COM库 3.2.5 HRESULT返回值 3.2.6 COM与注册表 3.3 COM组件 3.3.1 实现类厂对象 3.3.2 类厂对象的创建 3.3.3 实现自动注册 3.3.4 实现自动卸载 3.4 COM客户 3.4.1 COM对象创建函数 3.4.1.1 CoGetClassObject 3.4.1.2 CoCreateInstance 3.4.1.3 CoCreateInstanceEx 3.4.2 如何调用进程内组件 3.4.3 COM客户调用进程外组件 3.5 进一步认识COM 3.5.1 可重用机制:包容和聚合 3.5.2 进程透明性 3.5.3 安全性机制 小结 第4章 COM扩展技术 4.1 可连接对象机制 4.1.1 客户、接收器与可连接对象 4.1.1.1 接收器 4.1.1.2 可连接对象 4.1.1.3 客户 4.1.2 实现可连接对象 4.1.3 实现接收器 4.1.4 建立接收器与连接点的连接 4.1.5 获得出接口的类型信息 4.2 结构化存储 4.2.1 什么叫结构化存储和复合文件 4.2.2 存储对象和IStorage接口 4.2.2.1 IStorage接口 4.2.2.2 获得IStorage指针 4.2.2.3 释放STATSTG内存 4.2.2.4 枚举存储对象中的元

2,504

社区成员

发帖
与我相关
我的任务
社区描述
VBA(Visual Basic for Applications)是Visual Basic的一种宏语言,是在其桌面应用程序中执行通用的自动化(OLE)任务的编程语言。
社区管理员
  • VBA
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧