【问题标题】:ComServer that should return a ComObject应该返回 ComObject 的 ComServer
【发布时间】:2010-02-04 13:28:43
【问题描述】:

我要做的是将在服务器端创建的对象传输到客户端。当我在服务器端和客户端使用 c++ 时,我已经让它工作得很好,但是我没有让我的服务器在.Net 等其他语言上正常工作,它可能不喜欢指针!

这个服务器端代码看起来正确吗?

服务器形式: .h

class TForm2 : public TForm
{
__published:      // IDE-managed Components
      TMemo *Memo1;
private:      // User declarations
      DummyComObj* formDummy;
public:            // User declarations
      __fastcall TForm2(TComponent* Owner);
      IDummyComObj* Getformdummy();
};

.cpp

__fastcall TForm2::TForm2(TComponent* Owner)
      : TForm(Owner)
{
      CoCreateInstance( CLSID_DummyComObj,NULL,CLSCTX_ALL,IID_IDummyComObj,(void**)&formDummy);
}

DummyComObj* TForm2::Getformdummy()
{
      return formDummy;
}

服务器 TestComServerImpl: .cpp

STDMETHODIMP STDMETHODCALLTYPE TServerDidleComTestImpl::GetMyObject(IDummyComObj** outObj)
{
      DummyComObj *myDum = Form2->Getformdummy();
      *outObj = &myDum;
      return S_OK;
}

【问题讨论】:

    标签: c++ com c++builder


    【解决方案1】:

    除了 TServerDidleComTestImpl::GetMyObject() 因为你没有编译 试图将 DummyComObj ** 分配给 DummyComObj*,但您也在 完全忽略 COM 引用计数规则。

    试试这个:

    服务器形式:.h

    #include <utilcls.h>
    
    class TForm2 : public TForm
    {
    __published: // IDE-managed Components
        TMemo *Memo1;
    private: // User declarations
        TComInterface<IDummyComObj> formDummy;
    public: // User declarations
        __fastcall TForm2(TComponent* Owner);
        void Getformdummy(IDummyComObj** outObj);
    };
    

    服务器表单:.cpp

    __fastcall TForm2::TForm2(TComponent* Owner)
        : TForm(Owner)
    {
        CoCreateInstance( 
    CLSID_DummyComObj,NULL,CLSCTX_ALL,IID_IDummyComObj,(void**)&formDummy);
    }
    
    HRESULT TForm2::Getformdummy(DummyComObj** outObj)
    {
        return formDummy->QueryInterface(IID_IDummyComObj,(void**)outObj);
    }
    

    服务器 TestComServerImpl: .cpp

    STDMETHODIMP STDMETHODCALLTYPE 
    TServerDidleComTestImpl::GetMyObject(IDummyComObj** outObj)
    {
        return Form2->Getformdummy(outObj);
    }
    

    【讨论】:

      【解决方案2】:

      您的 GetMyObject() 方法不好,它返回一个指向局部变量的指针。这只会在偶然的情况下起作用,对任何包装 COM 的语言都不会。修复(减去错误处理):

      DummyComObj *myDum = Form2->Getformdummy();
      return myDum->QueryInterface(__uuidof(IDummyComObj), outObj);
      

      不确定 __uuidof() 是否在 Builder 中可用,使用任何你得到的接口的 IID。

      【讨论】:

      • 严格来说你应该检查 QI() 是否成功。如果失败,则尚未调用 AddRef() 并且您必须在返回之前释放对象(在 C++ 中删除),否则该对象将被泄露。
      • Hmya,我认为我的帖子中的“减去错误处理”规定不足以阻止 cmets。从 OP 的 sn-ps 来看,正确的错误处理应该是什么样子还不清楚。
      • 但是当我尝试将此类型库导入到 .Net 客户端时,GetMyObject 中的 IDummyComObj** outObj 参数呢?它无法识别这一点并且不导入此方法。
      • 这是一个完全不同的问题,也许你应该开始另一个线程。接口是否在类型库中声明?使用 Oleview.exe,文件 + 视图类型库。
      • 是的,IDummmyComObj 是在 typelib 中声明的,只有将指针作为参数/返回值的方法才不会被导入。我将对此提出一个新问题。
      猜你喜欢
      • 1970-01-01
      • 2019-03-29
      • 2014-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多