我是在调用一个视频卡的动态库函数时需要使用一个函数,函数的原型如下所示:
function RegisterStreamDirectReadCallback(StreamDirectReadCallback:TStreamDirectReadCallback;Context:pointer):integer;stdcall;far;其中StreamDirectReadCallBack是一个回调函数,我在是这样声明这个回调函数的:
 type
 TStreamDirectReadCallback=function(var hannelNum:longint;var DataBuf:pointer;var Length:DWORD;var frameType:integer;context:pointer):integer;stdcall;
我看了这个动态库的说明文档上说只要调用了RegisterStreamDirectReadCallback函数那么该函数回返回StreamDirectReadCallBack的中的hannelNum, DataBuf, length ,我现在想问的是我在程序中应该怎么调用这个函数,还有就是我需不需要重写
StreamDirectReadCallBack函数,然后又怎么获取hannelNum,databuf等一些值? 

解决方案 »

  1.   

    该函数的说明文档中是这样写的:函数:int RegisterStreamDirectReadCallBack(STREAM_DIRECT_READ_CALLBACK StreamDirectReadCallBack, void* context)参数 : STREAM_DIRECT_READ_CALLBACK StreamDirectReadCallBack
                   数据流准备好时会调用该函数
           void *Context  调用回调函数提供的上下文      回调函数说明: STREAM_DIRECT_READ_CALLBACK(ULONG channelNumber ,                                void* DataBuf,DWORD Length, int FrameType, void* context)       ULONG channelNumber  通道号
           Void  *DataBuf   缓冲区地址
           DWORD Length   缓冲区长度
           int FrameType 缓冲区帧类型
           void     * context   设备上下文
      
    说明:当启动数据扑获后,StreamDirectReadCallBack 会提供数据流的地址、长度、帧类型     等,用户程序直接处理.
      

  2.   

    就是你提供一个函数,让视频卡的程序调用.lz不明白的话先看看EnumChildWindows这个API的用法.
      

  3.   

    就是把你的函数指针传给视频卡开发包,委托开发包执行你的函数代码,并且可以带一些返回值等。
    开发包执行你的回调函数后,你可以获取到hannelNum(应该是通道channelNum数?)、数据块DataBuf、数据长度Length、桢类型 frameType等值。
      

  4.   

    function MyCallback(var   hannelNum : longint;
                        var   DataBuf   : pointer;
                        var   Length    : DWORD;
                        var   frameType : integer;
                              context   : pointer):integer;stdcall;
    begin
    //这里就可以用那些参数
    end;
    .....var
      pContext: Pointer;
    begin
      ...
      RegisterStreamDirectReadCallBack(MyCallback, pContext);
      ...
    end;
      

  5.   

    用的是海康威视的HC或MD卡哇。你要编写自己的TStreamDirectReadCallback函数,然后把它作为RegisterStreamDirectReadCallback函数的参数。TStreamDirectReadCallback的定义需要修改一下,不需要var修饰符的,Pointer也最好改为PByte或PChar。
    type
      TStreamDirectReadCallback = function(channelNumber: DWORD;  DataBuf: PByte;  Length: DWORD;  FrameType: Integer;  context: PByte): Longint;  stdcall;function MyCallBack(channelNumber: DWORD;  DataBuf: PByte;  Length: DWORD;  FrameType: Integer;  context: PByte): Integer;  stdcall;
    begin
      //这里写你自己的回调处理函数
      ......
    end;//初始化回调
    var 
      pContext: Pointer; 
    begin 
      ... 
      RegisterStreamDirectReadCallBack(MyCallback, pContext); 
      ... 
    end;