最近在用海康威视的板卡搞开发,他们SDK是C语言的,其中获取原始图像函数部分是这样的:
1 注册回调函数:int __stdcall RegisterImageStreamCallback(IMAGE_STREAM_CALLBACK ImageStreamCallback,void *context)
  参数:IMAGE_STREAM_CALLBACK:原始图像数据流回调函数,Void *context: 设备上下文
2 回调函数:typedef void(*IMAGE_STREAM_CALLBACK)(UNIT channelNumber,void *context)3 开启数据捕获:int __stdcall SetImageStream(HANDLE hChannel,BOOL bStart,UINT fps,UINT width,UINT height,unsigned char *ImageBuffer)
我的函数声明是:Private Declare Function RegisterImageStreamCallback Lib "DS40xxSDK.dll" (ImageStreamCallBack As Long, ByVal Context As Long) As Long
Private Declare Function SetImageStream Lib "DS40xxSDK.dll" (ByVal hChannel As Long, ByVal bStart As Boolean, ByVal fps As Long, ByVal Width As Long, ByVal Height As Long, ImageBuffer As Long) As Long
我的代码是:Public Sub StartVideo()
    Dim Ret As Long, Data() As Long
    ReDim Data(99999)    Ret = RegisterImageStreamCallback(AddressOf ImageStreamCallBack, Form1)
    Debug.Print "callback ret is :" & Ret    Ret = SetImageStream(m_hChannel, True, 0, 704, 576, Data(0))
    Debug.Print "StartVideo ret is :" & Ret
End SubPublic Function ImageStreamCallBack(ByVal ChannelNum As Long, ByVal Context As Long)
    Debug.Print "获取到了图像数据" & ChannelNum
    DoEvents
    Debug.Print Time
    
End Function
目前的问题是程序执行到“Debug.Print "StartVideo ret is :" & Ret“后就非法关闭了,不知道是我函数生命有问题,还是回调函数这里没处理好,请高手帮忙解答。

解决方案 »

  1.   

    补充说明下,我估计是我函数声明的时候没搞懂byval还是应该直接传址,并且SDK例子中*context参数是用的this指针,我用的FORM1.hdc,这样对么?请高手指点
      

  2.   

    我觉得是你的函数声明错了,个人认为是数据类型的问题。
    IMAGE_STREAM_CALLBACK  和这个VB中的声明 Long 完全不同,虽然值得是地址。
      

  3.   

    *context参数指的是设备场景,用form1.hdc是对的,难道没有更详细的文档说明了吗?
      

  4.   


    回调函数的函数指针,其实就是个地址,用long应该没问题的吧。vb的回调函数貌似有很多限制,我看到了06年的一个帖子,大家也讨论的非常火热,可惜最后没有答案,
    不过,似乎是SDK的回调函数声明不是按_Stdcall声明的问题。
    http://topic.csdn.net/t/20060719/16/4891105.html
    那么,我这里的问题也是这个么?另,c++里的this指针,VB里用什么代替?标准模块里
      

  5.   

    VB对指针通常情况下就是使用Addressof
      

  6.   


    我是楼主 ,现在经过测试发现是回调函数执行完毕后IDE崩溃(我看到执行了两个debug.print命令)
    怀疑SDK中回调函数声明不是Stdcall方式,06年的那个帖子也说了,要用汇编打补丁,修正堆栈,大概是这个意思,目前用OllIce跟踪ing,无奈我对汇编还是比较陌生。有人能指点SDK中这样的函数声明,该怎么打补丁么?
      

  7.   

    的确,c++默认调用方式 cdecl
    2 回调函数:typedef void(*IMAGE_STREAM_CALLBACK)(UNIT channelNumber,void *context)
      

  8.   


    问题解决了,确实是堆栈不平衡的问题。把我的程序函数返回那的 retn 8 改成 retn 或者把那个DLL的add esp 18 改成 add esp 10 问题就解决了。看来光学点VB还是不够用的,VB版的高手也都退隐或转其他语言了吧。我能自己解决这个问题很高兴,技术贴成散分贴了哈。
      

  9.   

    有没有VC的DEMO实例,给我一份,[email protected]