vb.net 如何调用摄像头或数码相机保存照片

想飞的狼 2009-05-30 10:44:11
请高手帮忙,小弟有些问题一直不解,如何用摄像头和数码相机获取照片,不同牌子不同型号的摄像头或相机是否可以在一个程序下通用?我在网上找段代码但会出错,不知道是不是因为我的摄像头型号的问题?我用的代码是
Public Class Cam

Private Const WM_USER As Integer = &H400
Private Const WS_CHILD As Integer = &H40000000
Private Const WS_VISIBLE As Integer = &H10000000
Private Const WM_CAP_START As Integer = WM_USER
Private Const WM_CAP_STOP As Integer = WM_CAP_START + 68
Private Const WM_CAP_DRIVER_CONNECT As Integer = WM_CAP_START + 10
Private Const WM_CAP_DRIVER_DISCONNECT As Integer = WM_CAP_START + 11
Private Const WM_CAP_SAVEDIB As Integer = WM_CAP_START + 25
Private Const WM_CAP_GRAB_FRAME As Integer = WM_CAP_START + 60
Private Const WM_CAP_SEQUENCE As Integer = WM_CAP_START + 62
Private Const WM_CAP_FILE_SET_CAPTURE_FILEA As Integer = WM_CAP_START + 20
略...
提示错误代码"对 PInvoke 函数“tv!tv.Cam::SendMessage”的调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配。"
...全文
472 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
gene_huang 2012-05-01
  • 打赏
  • 举报
回复
我在VB.Net2005中实现没有提示粗问题.
http://hi.baidu.com/zyf_d/blog/item/8a3aee1f760fc50a314e1540.html中的代码好像是2003版的,我将界面设计的代码剪切到Form1.disigner.vb中就OK了
lee38mm 2011-07-21
  • 打赏
  • 举报
回复
顶!顶!顶!
fanGogh 2010-12-23
  • 打赏
  • 举报
回复
你要SendMessage定义的数据类型改为Integer就可以了,我的做法和8楼的一样。
想飞的狼 2009-05-30
  • 打赏
  • 举报
回复
http://hi.baidu.com/zyf_d/blog/item/8a3aee1f760fc50a314e1540.html
Qim 2009-05-30
  • 打赏
  • 举报
回复
[Quote=引用楼主 yjqmaster 的帖子:]
原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配。
[/Quote]
把你那段代码的出处给个连接看看
ymx1121 2009-05-30
  • 打赏
  • 举报
回复
帮顶.
想飞的狼 2009-05-30
  • 打赏
  • 举报
回复
我是按网上的例子做的,能不能是我的摄像头型号不对呢?期待回复,给点意见,有代码更好!
fcxxfcxx 2009-05-30
  • 打赏
  • 举报
回复
学习
Qim 2009-05-30
  • 打赏
  • 举报
回复
一般情况通用摄像头都是同的windows自带的驱动。如果这样,你写的程序是可以通用的。
也有很多摄像头自己有驱动,但好像也可以用那个系统的通用驱动,只是画质等有所影响,需要测试。
我以前做了一个,也是从网上搜了一段代码,貌似和你得差不多。
你自己在调一下,可能API的参数类型等有问题。
good luck !
Qim 2009-05-30
  • 打赏
  • 举报
回复
沙发啊,多年没做了。
wuhuwy 2009-05-30
  • 打赏
  • 举报
回复
学习
ai_li7758521 2009-05-30
  • 打赏
  • 举报
回复
关注
古今多少事 2009-05-30
  • 打赏
  • 举报
回复
[Quote=引用楼主 yjqmaster 的帖子:]
"对 PInvoke 函数“tv!tv.Cam::SendMessage”的调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配。"
[/Quote]

这个错误提示我也遇到过,当时是在.NET中调用.dll(这个dll可能是旧版本或其他的工具做的)出现的错误提示,弄不懂就没弄了。哈哈!
想飞的狼 2009-05-30
  • 打赏
  • 举报
回复
找到问题出在哪了在.NET2.0中加入了MDA(managed debugging assistant), 在平台调用时后会检查栈的指针, 如果发现不平衡, 就会抛出PInvokeStackImbalance异常; 而在.NET1.1中不会检查, 所以不会捕获到异常, 但在运行时会导致不稳定.将最后一个”long lParam” 改为 “int wParam”, 因为C#中int是32位的. 并且将之后有涉及到SendMessage函数的参数适当地转成int型就可以了.谢谢大家帮忙,分照给

16,554

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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