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

siyunying 2002-10-25 04:20:19
我在类中声明了一个数组变量.
因为在类中,数组不能声明为public,就
private dblA(3,4) as double
但没有办法从外界给他传值。
...全文
138 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++中回调函数并没有退出,反而得到延伸与 扩展,在面向对像中的回调,其实是指面向对像中类对像的事件,事件就是原始的回调函数。面 向对像, 将回调函数定义成事件过程,在程序引用对像时,若指定了对像的过程事件后,那么在 要进行事件触发的地方检查事件过程是否分配,如果分中的就执行事,也就是执行了回调函数。
jsp编程的一些小技巧总结,绝对实用。包括JSP编程中常用的js技术。 1.JSP编程中常用的js技术 2. 在下拉列表框里选择一个值后跳出新窗口? 3. 在JSP中启动execl? 4. 两级下拉列表框联动菜单? 5. java中如何把一个目录下的文件移到另一个指定的目录? 6. 制作表格线? 7. jsp如判别一个字符在A到Z之间? 8. 得到一浮点数小数点后4位,如何写以函数截取为两位 9. 整型转字符? 10. 显示数据库的记录,点击哪个标题栏,就按照哪个标题排序 11. 制作两个按钮 12. 用什么sql语句将数据库中的一条记录,复制为两条? 13. 有兩個按鈕A,B,其中A按下去,A就不可以再按,另外B按下去,A可以再按..請問如何用javascript控制.? 14. jsp中的数据库的连接方式 15. 在jsp中,怎么实现按回车就可提交表单? 16. 在JSP中如何传递数组? 17. 按地址取图片? 18. JSP中如何上传图片到数据库字段? 19. 页面自动刷新? 20. 表单自动提交? 21. 从JSP传数据的到JAVABEAN里? 22. weblogic 数据池连接? 数据源 JNDI名字 mysource 23. 三级下拉列表框联动菜单? 24. 在JSP中如何调用浏览器中的"另存为"功能? 25. 网页全屏显示 26. 求两个日期相隔了多少天:输入时间格式为(yyyy-mm-dd) 27. 上传文件对话框 28. 分页测试 29. 下载文件 30. 简单汉字判断 31. 将JSP的变量或者bean传递给JAVASCRIPT使用? 32. 把一种格式(如yyyy-mm-dd)的日期变量转换成另外一种格式(如dd-mm-yyyy)的日期变量! 33. 实现在页面上添加一行输入对话框 34. 制作验证码图片? 35. 图片缩小放大功能 36. 点击输入框弹出日期选择? 37. 在图片上传前查看自己要上传的图片? 38. 在图片排列的页面上选中一个图片,然后把它删掉? 39. 显示某目录下的所有文件 40. 把复选框中选中的值直接显示在输入文本框中? 41. 选择路径下的文件直接显示文件内容? 42. 制作进度条? 43. 对较长字符省略显示? 44. 制作日历? 45. 点击文本弹出一个选择框,选中值后返回并显示 46. 关闭框架页面回到没框架的页面? 47. 选中多条记录一次性删除? 48. 自动获取页面文件名? 49. 在JSP中调用ActiveX控件? 50. 使用SmartUpload实现文件上传? 51. 使用iReport和Jasperreport开发报表? 52. 使用iText生成PDF? 53. 制作图片水印? 54. 在页面中屏蔽键盘功能键? 55. 禁止用户复制网页内容? 56. 实现不在地址拦中显示当前URL? 57. 获取用户的真实IP地址? 58. 获取用户浏览器信息? 59. 获取当前绝对路径? 60. 将HTML文件转换成XML文件? 61. 结合XML和XSL输出HTML页面? 62. 制作动态树型菜单制作? 63. 制作类似QQ的短消息提示? 64. 用jfreechat制作拄、饼、曲线图型? 65. 文本框怎么只容许输入数字? 66. 打开Word和Execl文件? 67. 生成Word 和 Excel文档? 68. JSP如何读取Word内容? 69. 浏览服务器目录/文件? 70. jsp直接弹出下载框下载文件? 71. 配置数据连接池和数据源(Tomcat)? 72. 点击图1变为图2? 73. JSP中显示图片的方法之一? 74. int转为Integer的方法? 75. 请求jsp页面禁止缓存方法? 76. select选中其中的值自动到一个文本框? 77. JSP连接数据库? 78. JSP两级下拉列表框联动(数据库)? 79. JSP字符编码问题及转换大全? 80. 使用过滤器设置请求编码? 81. JSP或Servlet调用DLL? 82. 在JSP中包含Applet(时钟)? 83. 在Applet中显示一个html页面? 84. 使session强制失效85. iFreme编辑框使用? 86. Applet与Servlet的通讯? 87. JSP表格直接导入EXCEL? 88. 访问类路径上的资源? 89. 操作文件目录? 90. 获取文件的属性? 91.如何开发并部署一个servlet 92.如何取得配置文件中的servlet的参数 93.使servlet成为线程安全的 94.访问标准的CGI变量 95. servlet之间及与jsp间的通讯 96.获取当前绝对路径 97.在servlet中操作cookie 98.使用servlet生成JPE

7,785

社区成员

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

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