2010-02-04 52 views
0

我想要做的是将已经在服务器端创建的对象转移给客户端。当我在服务器端和客户端都使用C++时,我已经得到了它的正常工作,但是我没有让我的服务器正确地使用.Net等其他语言工作,它可能不喜欢指针!应该返回一个ComObject的ComServer

此Serversidecode外观是否正确?

服务器形式: .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; 
} 

回答

1

Asside从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); 
} 
1

你GetMyObject()方法是坏的,它返回指向局部变量的指针。这只会偶然发生,绝不会用于任何包装COM的语言。修复(减去错误处理):

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

不知道__uuidof()是可以在生成器中,使用任何你得把接口的IID。

+0

严格地说你应该检查QI()是否成功。如果它失败了,AddRef()还没有被调用,你必须在返回之前释放该对象(在C++中删除),否则该对象将被泄漏。 – sharptooth 2010-02-04 13:45:33

+0

Hmya,我认为我的帖子中的“减少错误处理”规定不足以保留评论。从OP的片段看,正确的错误处理应该是什么样的,这完全不清楚。 – 2010-02-04 14:11:55

+0

但是,当我尝试将这个typelib导入到.Net客户端时,GetMyObject的IDummyComObj ** outObj参数怎么办呢?它不能识别这个,也不会导入这个方法。 – Qwark 2010-02-04 15:14:40

相关问题