同标题,该类是DirectShow中的一个示例,求如何将其转化成Delphi代码,万分感谢!!
// 类声明
class CErrReporter : public IAMErrorLog
{
protected:
    long    m_lRef; // Reference count.public:
    CErrReporter() { m_lRef = 0; }    // IUnknown
    STDMETHOD(QueryInterface(REFIID, void**));
    STDMETHOD_(ULONG, AddRef());
    STDMETHOD_(ULONG, Release());    // IAMErrorLog
    STDMETHOD(LogError(LONG, BSTR, LONG, HRESULT, VARIANT*));
};// 部分实现
STDMETHODIMP CErrReporter::QueryInterface(REFIID riid, void **ppv)
{
    if (ppv == NULL) return E_POINTER;    *ppv = NULL;
    if (riid == IID_IUnknown)
        *ppv = static_cast<IUnknown*>(this);
    else if (riid == IID_IAMErrorLog)
        *ppv = static_cast<IAMErrorLog*>(this);
        
    else 
    return E_NOINTERFACE;    AddRef();
    return S_OK;
}STDMETHODIMP_(ULONG) CErrReporter::AddRef()
{
    return InterlockedIncrement(&m_lRef);
}STDMETHODIMP_(ULONG) CErrReporter::Release()
{
    // Store the decremented count in a temporary
    // variable. 
    ULONG uCount = InterlockedDecrement(&m_lRef);
    if (uCount == 0)
    {
        delete this;
    }
    // Return the temporary variable, not the member
    // variable, for thread safety.
    return uCount;
}

解决方案 »

  1.   

    1、必须提供IAMErrorLog的接口说明。否则,写了也没法用。
    2、没看见STDMETHOD(LogError(LONG, BSTR, LONG, HRESULT, VARIANT*))方法的c++实现代码,怎么写?
    至于Delphi类可以是下面的说明:type
      TErrReporter = class(TInterfacedObject, IAMErrorLog)
      public
        function LogError(p1: LongInt; p2: PChar; p3: LongInt,
          hRes: HResult, var v: Variant): Integer; stdcall;
      end;
      

  2.   

    形参之间应该用分号的:
    type 
      TErrReporter = class(TInterfacedObject, IAMErrorLog) 
      public 
        function LogError(p1: LongInt; p2: PChar; p3: LongInt; 
          hRes: HResult; var v: Variant): Integer; stdcall; 
      end; 
      

  3.   

    STDMETHOD(LogError(LONG, BSTR, LONG, HRESULT, VARIANT*))为执行具体操作的函数,内容可以很简单, 一句 OutputDebugString 既可,当然也可以写得复杂一些IAMErrorLog的C++实现   IAMErrorLog : public IUnknown
        {
        public:
            virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE LogError( 
                long Severity,
                BSTR pErrorString,
                long ErrorCode,
                long hresult,
                /* [in] */ VARIANT *pExtraInfo) = 0;
            
        };
    IAMErrorLog 的Delphi实现  IAMErrorLog = interface(IUnknown)
        ['{E43E73A2-0EFA-11D3-9601-00A0C9441E20}']
        (*** IAMErrorLog methods ***)
        function LogError(Severity: longint; const pErrorString: WideString; ErrorCode: longint;
                           HResult: longint; var pExtraInfo: OleVariant): HResult; stdcall;
      end;
      

  4.   

    IAMErrorLog的C++实现代码漏写了一句:    MIDL_INTERFACE("E43E73A2-0EFA-11d3-9601-00A0C9441E20")
        IAMErrorLog : public IUnknown
        {
        public:
            virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE LogError( 
                long Severity,
                BSTR pErrorString,
                long ErrorCode,
                long hresult,
                /* [in] */ VARIANT *pExtraInfo) = 0;
            
        };
     
      

  5.   

    那你直接按下面的定义实现LogError方法就可以了,其它的TInterfacedObject已经实现了,不用再写了:
     
     TErrReporter = class(TInterfacedObject, IAMErrorLog) 
      public 
        function LogError(Severity: longint; const pErrorString: WideString;
          ErrorCode: longint; HResult: longint; var pExtraInfo: OleVariant): HResult; stdcall;  end; 
      

  6.   

    谢谢 maozefa 的回复,明天试下