CopyMemory在IDE环境不会出错,编译成exe程序后运行后出错?

茂一茂 2010-04-23 06:34:04

这是我使用到的代码:


CopyMemory ByVal lAddrImage, m_scanInfo.Buffer, m_scanInfo.Width * m_scanInfo.Height + 514



为什么在IDE环境可以正常运行,但编译成.exe后就会出错呢?
编译成p代码也是会出错。


---------------------------
工程1: 工程1.exe - 应用程序错误
---------------------------
"0x7c922caf" 指令引用的 "0x00408000" 内存。该内存不能为 "read"。


要终止程序,请单击“确定”。
要调试程序,请单击“取消”。
---------------------------
确定 取消
---------------------------
...全文
164 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
嗷嗷叫的老马 2010-04-29
  • 打赏
  • 举报
回复
向WS的PctGL学习.......
yangzn76 2010-04-29
  • 打赏
  • 举报
回复
byval 传直接地址最好,用vb自带的byref传参时,大多数情况基本满足我们的需求 , 但应特别要注意自已的变量到底是什么类型,自已到底要传什。如果这个变量是一个结构,而结构里有string时,vb也会“自作聪明” 的作特殊处理。
舉杯邀明月 2010-04-29
  • 打赏
  • 举报
回复
Ding 老马。
PctGL 2010-04-29
  • 打赏
  • 举报
回复
马子居然这么聪明了
嗷嗷叫的老马 2010-04-29
  • 打赏
  • 举报
回复
Dim lAddrImage As Long

CopyMemory ByVal lAddrImage, m_scanInfo.Buffer......

如果copymemory第二个参数是声明为byref的,那就凭这个参数的传递方式,多半就死定了.

m_scanInfo.Buffer里面的值是一个指针,但在BYREF声明的情况下,你这种语法传入的是这个变量的地址,那最多只能复制4字节(假如Buffer是LONG的话).

再多复制,后面的内存天知道是否可读......

IDE里没挂,是你运气好,或IDE作了处理,不能把偶然当必然.
射天狼 2010-04-29
  • 打赏
  • 举报
回复

'将
CopyMemory ByVal lAddrImage, m_scanInfo.Buffer, m_scanInfo.Width * m_scanInfo.Height + 514
'改为
CopyMemory ByVal VarPtr (lAddrImage), VarPtr (m_scanInfo.Buffer), m_scanInfo.Width * m_scanInfo.Height + 514
'或者
CopyMemory ByVal VarPtr (lAddrImage), ByVal VarPtr (m_scanInfo.Buffer), m_scanInfo.Width * m_scanInfo.Height + 514
贝隆 2010-04-24
  • 打赏
  • 举报
回复
可能是你的函数声明和你的参数引用不相符吧?
i1u0i1u0 2010-04-23
  • 打赏
  • 举报
回复
我也遇到过这个问题,没办法解决,最后只好改用其他办法了.
估计是windowsXP的内存保护机制问题,在IDE中由于在VB的调试框架下运行,内存的使用受制于VB,编译后在XP下就产生了兼容性问题了
茂一茂 2010-04-23
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 clear_zero 的回复:]

m_scanInfo.Width * m_scanInfo.Height + 512
这个是不是超过了长度限制,你试试看比512小的数
[/Quote]
我试过了,将512去年,还能采集,但编译成独立的.exe就不行,在ide可以
clear_zero 2010-04-23
  • 打赏
  • 举报
回复
m_scanInfo.Width * m_scanInfo.Height + 512
这个是不是超过了长度限制,你试试看比512小的数
茂一茂 2010-04-23
  • 打赏
  • 举报
回复
将倒数第二行改成:
CopyMemory ByVal lAddrImage, m_scanInfo.Buffer, m_scanInfo.Width * m_scanInfo.Height + 512
也不行,在IDE里可以执行,而编译成独立的exe,就会出错
茂一茂 2010-04-23
  • 打赏
  • 举报
回复
不是,因为最关键在那一句,下面是全部的代码:


m_scanInfo.Width = 640
m_scanInfo.Height = 480
nRawDataSize = m_scanInfo.Width * m_scanInfo.Height + 512
dim m_pRawData(nRawDataSize)

Dim lAddrImage As Long

FvxImage1.GetImageAdrs lAddrImage '获取图像容器的地址

m_scanInfo.Buffer = VarPtr(m_pRawData(0)) 'buffer的首地址

MV_Usb2StartCapture hCurDvc, True '开始采集图像

MV_Usb2GetRawData hCurDvc, m_scanInfo '采集到m_scanInfo.Buffer

CopyMemory ByVal lAddrImage, m_scanInfo.Buffer, m_scanInfo.Width * m_scanInfo.Height + 514 '从buffer拷到图像容器中

FvxDisplayEx1.DrawImage FvxImage1 '显示容器中的图像内容
a1875566250 2010-04-23
  • 打赏
  • 举报
回复
LZ你这样发没人知道你为什么错。。。要问就不要吝啬,代码贴全点。
按照你“这一行”代码,我估计你应该这样写试试。。。
CopyMemory ByVal VarPtr(lAddrImage), m_scanInfo.Buffer, m_scanInfo.Width * m_scanInfo.Height + 514

1,486

社区成员

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

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