如何给ActiveX DLL类中传递一个数组?

siyunying 2002-10-25 04:20:19
我在类中声明了一个数组变量.
因为在类中,数组不能声明为public,就
private dblA(3,4) as double
但没有办法从外界给他传值。
...全文
141 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Zhang_1978 2002-10-26
  • 打赏
  • 举报
回复
其实照说应该用属性

不过我觉得不叫麻烦,所以我在做的时候用的是传字符串,中间有分隔符如(·),到里面或者返回后再分割
zxinlin 2002-10-26
  • 打赏
  • 举报
回复
然后再用IsArray作判断。
zxinlin 2002-10-26
  • 打赏
  • 举报
回复
都可以。
把形参设置成Varian的。
siyunying 2002-10-26
  • 打赏
  • 举报
回复
to myhfit:
是不是,数组根本不可以通过类属性的方式传递???

我写的一个类中,其它参数都是用属性的方式传递,
类中有一个二维数组,如果也用属性的方式传递,那么
数据输入的方式就一致了。
我不想用“类的方法“这种方法来传递数组。

经过我自己的实验,我是发现通过属性的方式传递数组是不行,
但我想可能有一些细节我没有想到。

其它方法是什么?我想洗耳恭听.
非常感谢你的回复!
myhfit 2002-10-26
  • 打赏
  • 举报
回复
不应用Let给数组赋值
应做为函数
Public Function XXX(T1() as double) as long
用时应为
dim a() as double
...
XXX(a())
其实有很多方法

Public Function XXX(T1 as variant) as long
variant是可以传入数组的
dim a as variant
a=array()
...
XXX(a)
也可用传入地址的方法
Public Function XXX(T1 as long,lb as long) as long
中间用函数CopyMemory把T1代表的地址按lb的长度复制到一个数组中
比如
redim tmpXXX(lb) as double
copymemory tmpxxx(0),byval t1,lb*8
'注意Double占8个字节
使用时
dim a() as double
XXX(varptr(a(0)),ubound(a)+1)

其实还有其他办法
wdxing 2002-10-26
  • 打赏
  • 举报
回复
您把参数设置为Collection类型,传递collection很好操作的。
siyunying 2002-10-26
  • 打赏
  • 举报
回复
up
edwardpro 2002-10-26
  • 打赏
  • 举报
回复
编一个函数不就可以了?
public function arb()as long()
arb=target()
end function
或者在主程序中放一个模块定义一个public的数组不也可以?
siyunying 2002-10-26
  • 打赏
  • 举报
回复
To zxinlin
感谢你给出问题的关键,把形参设置为Variant。问题解决。
to zhang_1978
你这种做法,在数据个数不是固定的时候,是一个非常好的作法。
我曾做我一个类。为了方便工具条的图标的更改。我就像你这样传
工具条的按钮的名字。在用split函数解析。感觉非常不错。
siyunying 2002-10-25
  • 打赏
  • 举报
回复
To daviddivad:
Get 是得到属性的值
我这样试过不行
Private dblA(3,4) as double
Public Property Let A(byRef dblTemp() as double)
dblA=dblTemp
End Property
编译DLL时,出现错误,"不能给数组赋值"

我就这样改写,
Public Property Let A(byRef dblTemp() as double)
dim i as integer,j as integer
for i=0 to 3
for j=0 to 4
dblA(i,j)=dblTemp(i,j)
next j
next i
End Property
编译通过,但我通过一个工程测试时,
dim clsCal as new clsDLL
dim bb(3,4) as double
clsCal.A=bb
测试工程编译时,出现不能给数组赋值。

你实际使用过给类传数组吗?


holydiablo 2002-10-25
  • 打赏
  • 举报
回复
按地址传送(通上),这种方法的数据会很快,不过我一向认为接口间传数组实在不是好办法
daviddivad 2002-10-25
  • 打赏
  • 举报
回复
写个属性,通过属性来获取

public property get ArrayDbl(byref dblTemp() as double)
'把DBLA(3,4)的内容复制到DBLTEMP中去,就行了
end property
Delphi中制作DLL •一 Dll的制作一般分为以下几步: 1 在一个DLL工程里写一个过程或函数 2 写一个Exports关键字,在其下写过程的名称。不用写参数和调用后缀。 二参数传递 1 参数类型最好与window C++的参数类型一致。不要用DELPHI的数据类型。 2 最好有返回值[即使是一个过程],来报出调用成功或失败,或状态。成功或失败的返回值最好为1[成功]或0[失败].一句话,与windows c++兼容。 3 用stdcall声明后缀。 4 最好大小写敏感。 5 无须用far调用后缀,那只是为了与windows 16位程序兼容。 三 DLL的初始化和退出清理[如果需要初始化和退出清理] 1 DLLProc[SysUtils单元的一个Pointer]是DLL的入口。在此你可用你的函数替换了它的入口。但你的函数必须符合以下要求[其实就是一个回调函数]。如下: procedure DllEnterPoint(dwReason: DWORD);far;stdcall; dwReason参数有四种类型: DLL_PROCESS_ATTACH:进程进入时 DLL_PROCESS_DETACH进程退出时 DLL_THREAD_ATTACH 线程进入时 DLL_THREAD_DETACH 线程退出时 在初始化部分写: DLLProc := @DLLEnterPoint; DllEnterPoint(DLL_PROCESS_ATTACH); 2 如Form上有TdcomConnection组件,就Uses Activex,在初始化时写一句CoInitialize (nil); 3 在退出时一定保证DcomConnection.Connected := False,并且数据集已关闭。否则报地址错。 四全局变量的使用 在widnows 32位程序中,两个应用程序的地址空间是相互没有联系的。虽然DLL在内存中是一份, 但变量是在各进程的地址空间中,因此你不能借助dll的全局变量来达到两个应用程序间的数据 传递,除非你用内存映像文件。 五、其他:调用方式按照标准的Windows调用方式. 六、关于参数传递 •Delphi程序之间调用DLL,如果要用String类型的话,要在引用的单元加上ShareMem 单元。 •如果Delphi写的DLL供其他开发工具使用的话,不要使用String类型,用PAnsiChar类型。 尽量使用标准DLL接口。指的是传递的参数类型及函数返回类型不能是Delphi特有的, 比如string(AnsiString),以及动态数组和含有这些类型成员的复合类型(如记录),也不 能是包含有这些类型成员数据成员的对象类型,以避免可能的错误。如果使用了string类型或 动态数组类型,且调用方不是Delphi程序,则基本上会报错。如果调用方是Delphi但调用方或 被调用方没有在工程文件的第一包含单元不是ShareMem,也可能会出错。 七、关于回调Funciton 你可以把Callback函数看作是一种特殊的消息响应函数,一般来说我们不会自己调用这种函数, 而是有某些系统函数调用,而且不需要向后传递消息。 只要象C/C++这样支持函数指针的语言都 有回调函数的概念,它实际上是向被调用函数传一个你的函数地址,然后被调用函数向通过你传 入的函数地址来调用你的函数 。 以上是结构化回调,到高级语言Object Pascal、C++中回调函数并没有退出,反而得到延伸与 扩展,在面向对像中的回调,其实是指面向对像中类对像的事件,事件就是原始的回调函数。面 向对像, 将回调函数定义成事件过程,在程序引用对像时,若指定了对像的过程事件后,那么在 要进行事件触发的地方检查事件过程是否分配,如果分中的就执行事,也就是执行了回调函数。

7,785

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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