struct OverlayConfig {
int pos_x, pos_y;
int justify_x, justify_y;
int opacity;
bool bNonPremultAlpha;
bool bNeedInvertAlpha;
int ol_width, ol_height;
PVOID ol_buffer;
};interface IVideoEffectProcessor {
virtual void EffectProcess(PBYTE src, PBYTE dst, DWORD width, DWORD height) = 0;
};//回调函数interface IVideoGDIDrawer {
virtual void GDIDraw(HDC hdc, DWORD width, DWORD height) = 0;
};DECLARE_INTERFACE_(IVCamTransConfig, IUnknown)
{
STDMETHOD(AddImageOverlay) (OverlayConfig* pIOC, int whichOne = 0) PURE;
// STDMETHOD(AddImageOverlayEx) (ImageOverlayConfig* pIOC, int whichOne = 0) PURE;
STDMETHOD(AddVideoEffect) (LONG effectType, PLONG effectId, LPTSTR sParamFormat) PURE;
STDMETHOD(SetVideoEffectParams) (LONG effectId, LPCTSTR sParam) PURE;
STDMETHOD(RemoveVideoEffect) (LONG index = 0) PURE;
STDMETHOD(RemoveVideoEffects) () PURE;
STDMETHOD(SetVideoGDIDrawer) (IVideoGDIDrawer* pDrawer) PURE;
STDMETHOD(SetVideoEffectProcessor) (IVideoEffectProcessor* pProcessor) PURE;
// STDMETHOD(SetAdvertisement) (LPCTSTR sAdv) PURE;
};HRESULT CVCamSDKImpl::PlayVideoFile(LPCTSTR fileName)
{
StopPlay();
StopCapture(); // create filter graph
HRESULT hr = CoCreateInstance(CLSID_FilterGraph, NULL, 
CLSCTX_INPROC, IID_IGraphBuilder, (void **)&m_pGraph);

hr = m_pGraph->AddFilter(m_pVCamRenderer, L"Renderer");#if 1
const CLSID CLSID_VCamTrans = {0x9CFB3966,0xB84C,0x4452,{0x9A,0x62,0x33,0xA2,0xC6,0x6E,0xEE,0xB1}};
const IID IID_IVCamTransConfig = {0x799b6eca, 0xbc9f, 0x4bd2, {0x91, 0x80, 0x45, 0x68, 0x46, 0x10, 0x42, 0xcd}}; IBaseFilter* pVCamTrans = NULL;
hr = CoCreateInstance(CLSID_VCamTrans, NULL, CLSCTX_INPROC, IID_IBaseFilter, (void **)&pVCamTrans);
hr = m_pGraph->AddFilter(pVCamTrans, L"VCam Effects Filter");
IVCamTransConfig* pConfig;
hr = pVCamTrans->QueryInterface(IID_IVCamTransConfig, reinterpret_cast< void** >(&pConfig));
LONG id;
TCHAR szParams[] = _T("bright[-255..255]={100}, contrast[0..32]={10}");
hr = pConfig->AddVideoEffect(0, &id, szParams);
#endif----------------------------------------------------
主要是接口的定义部分,我自己翻译后,在访问接口中的方法时提示出错,不可存取的对象,以下是接口的定义.帮忙看下是否有错const
  CLSID_VCamTrans : TGUID = '{9CFB3966-B84C-4452-9A62-33A2C66EEEB1}';
  IID_IVCamTransConfig : TGUID = '{799B6ECA-BC9F-4bd2-9180-4568461042CD}';
type
  IVCamTransConfig = interface;
  IVCamTransConfig = interface(IUnknown)
  ['{799B6ECA-BC9F-4bd2-9180-4568461042CD}']
  function AddImageOverlay(pIOC : POverlayConfig; whichOne : integer = 0) : HRESULT;stdcall;
  function AddVideoEffect(effectType : Longint ; effectId :Plongint; sParamFormat : PChar) : HRESULT;stdcall;
  function SetVideoEffectParams(effectId : longint ; sParam : PChar) : HRESULT;stdcall;
  function RemoveVideoEffect(index : Longint= 0) : HRESULT;stdcall;
  function RemoveVideoEffects : HRESULT ;stdcall;
  function SetVideoGDIDrawer(pDrawer : TSetVideoGDIDrawer) : HRESULT; stdcall;
  function IVideoEffectProcessor(pProcessor : TIVideoEffectProcessor) : HRESULT ;stdcall;
  end;调用
var eid : longint;
    Test : Pchar;
begin
     eid := 0;
    Test := 'bright[-255..255]={100}, contrast[0..32]={10}';
    CoCreateInstance(CLSID_FilterGraph, nil, CLSCTX_INPROC, IID_IGraphBuilder, m_pVideo);
    CoCreateInstance(CLASS_VCamRenderer, nil, CLSCTX_INPROC, IID_IBaseFilter,m_pVCamRenderer);
    CoCreateInstance(CLSID_VCamTrans,nil,CLSCTX_INPROC,IID_IBaseFilter,P_VCamTrans);
    m_pVideo.AddFilter(m_pVCamRenderer,'Renderer');
    m_pVideo.AddFilter(P_VCamTrans,'Trans');
    P_VCamTrans.QueryInterface(IID_IVCamTransConfig, m_pCamTranconfig);
    m_pCamTranconfig.AddVideoEffect(0,@eid,Test); /运行到这里时,鼠标跟踪显示,对象不可存取,请问是哪里出错了?
前面运行一直正常,也就是说,接口对象有创建,访问后也有值...但是访问不了接口中的函数

解决方案 »

  1.   

    怎么没人?在DELPHI中,虚函数和 VC 中的 pure 要怎么定义??
      

  2.   

    interface IVideoGDIDrawer { 
    virtual void GDIDraw(HDC hdc, DWORD width, DWORD height) = 0; 
    }; 
    这里在DELPHI中是怎么定义的?搞错了,不是个函数指针.....
     function SetVideoGDIDrawer(pDrawer : TSetVideoGDIDrawer) : HRESULT; stdcall; 
      

  3.   

    const
      CLSID_VCamTrans : TGUID = '{9CFB3966-B84C-4452-9A62-33A2C66EEEB1}';
      IID_IVCamTransConfig : TGUID = '{799B6ECA-BC9F-4bd2-9180-4568461042CD}';type
      TOverlayConfig = packed record
        pos_x: Integer;
        pos_y: Integer;
        justify_x: Integer;
        justify_y: Integer;
        opacity: Integer;
        bNonPremultAlpha: Boolean;
        bNeedInvertAlpha: Boolean;
        ol_width: Integer;
        ol_height: Integer;
        ol_buffer: Pointer;
      end;  TVideoEffectProcessor = packed record
        EffectProcess: procedure(var src, dst: BYTE; width, height: DWORD);
      end;
      PVideoEffectProcessor = ^TVideoEffectProcessor;  TVideoGDIDrawer = packed record
        GDIDraw: procedure(hdc: HDC; width, height: DWORD);
      end;
      PVideoGDIDrawer = ^TVideoGDIDrawer;  IVCamTransConfig = interface(IUnknown)
        ['{799B6ECA-BC9F-4bd2-9180-4568461042CD}']
        function AddImageOverlay(var pIOC: TOverlayConfig; whichOne: Integer = 0): HRESULT; stdcall;
        function AddVideoEffect(effectType: Longint; var effectId: Longint; sParamFormat: PWideChar): HRESULT; stdcall;
        function SetVideoEffectParams(effectId: Longint; sParam: PWideChar): HRESULT; stdcall;
        function RemoveVideoEffect(index: Longint = 0): HRESULT; stdcall;
        function RemoveVideoEffects: HRESULT; stdcall;
        function SetVideoGDIDrawer(pDrawer: PVideoGDIDrawer): HRESULT; stdcall;
        function SetVideoEffectProcessor(pProcessor: PVideoEffectProcessor): HRESULT; stdcall;
      end;
      

  4.   

    interface IVideoEffectProcessor { 
    virtual void EffectProcess(PBYTE src, PBYTE dst, DWORD width, DWORD height) = 0; 
    };//回调函数 interface IVideoGDIDrawer { 
    virtual void GDIDraw(HDC hdc, DWORD width, DWORD height) = 0; 
    }; 
    ------------------------------------------------------------------
    翻译如下,
    type
      IVideoGDIDrawer = interface
      procedure GDIDraw(hdc : THandle ; width,height :DWORD);
      end;
      TIVideoGDIDrawer = class(TInterfacedObject,IVideoGDIDrawer)
        procedure GDIDraw(hdc : THandle ; width,height :DWORD);
      end;type
      IVideoEffectProcessor = interface
      procedure EffectProcess(hdc : THandle ; width,height :DWORD) ;stdcall;
      end;
      TIVideoEffectProcessor = class(TInterfacedObject,IVideoEffectProcessor)
      public
        procedure EffectProcess(hdc : THandle ; width,height :DWORD) ;stdcall;
      end;
    调用:
    var IVideoGDIDrawerClass  : TIVideoGDIDrawer;
        IVideoGDIDrawerClass := TIVideoGDIDrawer.Create;
        hr := m_pCamTranconfig.SetVideoGDIDrawer(@IVideoGDIDrawerClass);
    上面这句话运行过没错,但整个过程运行完后会抛出异常,不知怎么回事,还有楼上的兄弟.将接口定义为压缩型记录,这样可以吗?
      

  5.   

      TVideoEffectProcessor = packed record
        EffectProcess: procedure(var src, dst: BYTE; width, height: DWORD);
      end;
    那这里面的函数体怎么实现呢?
      

  6.   

    interface这是C语言定义接口的方式,按理说应该第一个参数是this指针的
      

  7.   

    刚好看到
    ///////////////////////////////////////
    //DLL里面,形式很多,不一定是dll的形式
    type
      TCallback = procedure(s: pchar); stdcall; procedure SetCallback(ACallback: TCallback); stdcall;
    begin
      FCallback := ACallback;
    end;
    procedure TcPortOBJ.cPortRChar(Sender: TObject; Count: Integer); //此事件回调主函数里面的已经设置入口的那个函数
    var
      Str: string;
    begin
      CPort.ReadStr(Str, Count);
      if Assigned(FCallback) then FCallback(pchar(Str));
    end;
    ////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////
    //主程序里面type
      TCallback = procedure(s: pchar); stdcall;var
      Form1: TForm1;procedure SetCallback(ACallback: TCallback); stdcall External 'cPort_DLL.dll';
    procedure TForm1.Button4Click(Sender: TObject);
    begin
      SetCallback(@CallbackExample); //设置回调
    end;procedure CallbackExample(s: pchar); stdcall;
    begin
      Form1.Memo1.Text := Form1.Memo1.Text + ' ' + (s);
    end;
      

  8.   

    interface IVideoGDIDrawer {
    virtual void GDIDraw(HDC hdc, DWORD width, DWORD height) = 0;
    };class CDrawer: public IVideoGDIDrawer {
    void GDIDraw(HDC hdc, DWORD width, DWORD height)
    {
    ::LineTo(hdc, 100, 100);
    }
    };
    CDrawer g_Drawer;DECLARE_INTERFACE_(IVCamTransConfig, IUnknown)
    {
    STDMETHOD(AddImageOverlay) (OverlayConfig* pIOC, int whichOne = 0) PURE;
    // STDMETHOD(AddImageOverlayEx) (ImageOverlayConfig* pIOC, int whichOne = 0) PURE;
    STDMETHOD(AddVideoEffect) (LONG effectType, PLONG effectId, LPTSTR sParamFormat) PURE;
    STDMETHOD(SetVideoEffectParams) (LONG effectId, LPCTSTR sParam) PURE;
    STDMETHOD(RemoveVideoEffect) (LONG index = 0) PURE;
    STDMETHOD(RemoveVideoEffects) () PURE;
    STDMETHOD(SetVideoGDIDrawer) (IVideoGDIDrawer* pDrawer) PURE;
    STDMETHOD(SetVideoEffectProcessor) (IVideoEffectProcessor* pProcessor) PURE;
    // STDMETHOD(SetAdvertisement) (LPCTSTR sAdv) PURE;
    };
    hr = pVCamTrans->QueryInterface(IID_IVCamTransConfig, reinterpret_cast< void** >(&pConfig));
    hr = pConfig->SetVideoGDIDrawer(&g_Drawer);
    VC里面就这么简单,它要的参数是一个接口实现类的指针.....
    为什么DELPHI中按照他的思路就是不行呢?