VB6中的安全数组SafeArray问题??

wzxiaodu 2018-02-17 01:15:49
http://blog.csdn.net/adambear/article/details/13702
看了上面的文章,
测试了上面一小段代码,结果出错,想知道原因??请高手帮忙!!

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal dest As Long, ByVal Source As Long, ByVal bytes As Long)
Private Declare Function VarPtrArray Lib "msvbvm60.dll" Alias "VarPtr" (Var() As Any) As Long

Private Sub Command1_Click()
Dim ppMyArr As Long, pMyArr As Long, nDims As Long
Dim MyArr(1 To 8, 2 To 10) As Long

'先得到一个指向SafeArray结构的指针的指针,原理是什么,我后面说。
ppMyArr = VarPtrArray(MyArr)
'从这个指针的指针得到SafeArray结构的指针
CopyMemory pMyArr, ByVal ppMyArr, 4
'再从这个指针所指地址的头两个字节取出cDims
CopyMemory nDims, ByVal pMyArr, 2
MsgBox "这个数组有" & nDims & "维"
End Sub

上面代码,运行后
程序崩溃了!!!
...全文
4058 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
海鸥软件 2018-02-28
  • 打赏
  • 举报
回复
不像vb中普通函数那样,按值传递的就是值 按址传递的就是地址,copymemory是先取变量地址再取值
海鸥软件 2018-02-28
  • 打赏
  • 举报
回复
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, _ Source As Any, ByVal Length As Long) Private Declare Function VarPtrArray Lib "msvbvm60.dll" Alias "VarPtr" (Var() As Any) As Long Private Sub Command1_Click() Dim MyArr(1 To 8, 2 To 10, 3 To 5) As Long Dim pArray As Long, ppArray As Long, nDims As Long ppArray = VarPtrArray(MyArr) CopyMemory pArray, ByVal ppArray, 4 CopyMemory nDims, ByVal pArray, 2 MsgBox nDims End Sub copymemory函数要分按值和按址传递,那么函数的使用是有区别的,按址想办法传递的是地址值 ,按值传递的是具体内容
脆皮大雪糕 2018-02-22
  • 打赏
  • 举报
回复
问题在你的API函数声明上。 第一行,ByVal dest As Long 改成 ByRef dest As Long 因为这个参数在后面你都是直接传递变量,而不像第二个参数那样都是先取指针再传具体的地址进去。
利用activeX实现matlab和vb的混合编程-vb_matlab_activeX.rar      想要在vb里面直接执行matlab的代码吗?想省去编译dll文件的代码吧?     好的,activeX帮你实现这样的功能.     activeX简介: ActiveX部件是Microsoft公司提供的一种用于模块集成的新的协议,它是Visual Basic工具箱的扩充部分。在程序加入ActiveX后,它将成为开发和运行环境的一部分。Matlab实现了ActiveX自动化服务支持,在Visual Basic下通过ActiveX自动化接口可将Matlab作为Visual Basic语言的一个ActiveX部件调用,实现VB与MATLAB间的无缝集成,该方式比较适合C/S模式,具有自动化程度高、效率高、占用资源少、数据交换能力强等优点,大大缩短了程序开发周期,优化了系统性能。 activeX运用: 使用ActiveX部件,首先必须获得Matlab ActiveX对象在系统注册表定义的名字─Matlab.Application。在VB创建ActiveX对象的代码如下: Dim Matlab as Object. Set Matlab = CreateObject Matlab.Application对象主要有3个函数,具体如下: (1) BSTR Execute([in]BSTR Command)方法 接受单一的字符串(Command), MATLAB将运行命令及结果作为一个字符串返回。用于执行一个合法的MATLAB命令; (2) PutFullMatrix方法 void PutFullMatrix pr, [in] SAFEARRAY pr, [in] SAFEARRAY pi ) 将一个指定变量名的一维或二维数组(mxArray)放入工作空间。 (3) GetFullMatrix方法 void GetFullMatrix pr, [in] SAFEARRAY pr, [in] SAFEARRAY pi ) 通过GetFullMatrix方法,从指定的工作空间检索一个完整的一维或二维的实型或虚型数组(mxArray),其实部和虚部分别存放到两个单独的Double型数组。[2] 通过这三种方法,可以方便地利用Matlab执行命令,从VB向Matlab输送数据或者从Matlab获取数据。 实例举例: 1.程序功能: 给出三个变量:x=0:0.05*pi:10*pi;y=sin;z=cos 并且做出x,y,z的三维图形,并在vb的image窗口显示,             下面是vb程序的界面,只有一个command按钮和image图片框    程序界面.jpg 下面是程序的运行结果: 程序运行结果.jpg 2.代码 Dim Matlab As Object Dim Result1 As String Dim Result2 As String Dim Result3 As String Private Sub Command1_Click() Result1 = Matlab.Execute;z=cos") Result2 = Matlab.Execute") Result3 = Matlab.Execute") Image1.Picture = Clipboard.GetData() Call Matlab.quit '退出Matlab End Sub Private Sub Form_Load() Set Matlab = CreateObject End Sub 3.程序源程序: vb_matlab_activeX.rar

1,486

社区成员

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

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