C++ 应返回ComObject的ComServer
我要做的是将在服务器端创建的对象传输到客户端。我在服务器和客户端使用C++时都能很好地工作,但是我不能让我的服务器与其他语言(如.NET)一起工作,它可能不喜欢指针。p> 这个服务器端代码看起来正确吗 服务器窗体: h .cpp 服务器TestComServerImpl: .cpp GetMyObject()方法不正确,它返回指向局部变量的指针。这只是偶然发生的,对于任何包装COM的语言都不会起作用。修复(减去错误处理):C++ 应返回ComObject的ComServer,c++,com,c++builder,C++,Com,C++builder,我要做的是将在服务器端创建的对象传输到客户端。我在服务器和客户端使用C++时都能很好地工作,但是我不能让我的服务器与其他语言(如.NET)一起工作,它可能不喜欢指针。p> 这个服务器端代码看起来正确吗 服务器窗体: h .cpp 服务器TestComServerImpl: .cpp GetMyObject()方法不正确,它返回指向局部变量的指针。这只是偶然发生的,对于任何包装COM的语言都不会起作用。修复(减去错误处理): 不确定Builder中是否有可用的u_uidof(),请使用您所能获得的
不确定Builder中是否有可用的u_uidof(),请使用您所能获得的任何信息来获取接口的IID。由于您的原因,无法从TServerDidleComTestImpl::GetMyObject()编译 正在尝试将Dummycombj**分配给Dummycombj*,但您也 完全忽略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);
};
服务器TestComServerImpl:.cpp
STDMETHODIMP STDMETHODCALLTYPE
TServerDidleComTestImpl::GetMyObject(IDummyComObj** outObj)
{
return Form2->Getformdummy(outObj);
}
严格地说,你应该检查QI()是否成功。如果失败,则在返回之前必须释放对象(在C++中删除),否则该对象将被泄漏。嗯,我认为我文章中的“负错误处理”规定不足以阻止评论。从OP的代码片段来看,正确的错误处理应该是什么样子还不是很清楚。但是GetMyObject中的IDummyComObj**outObj参数呢?当我尝试将此typelib导入.Net客户端时,它不识别此错误,也不导入此方法。这是一个完全不同的问题,也许你应该开始另一个话题。接口是否在类型库中声明?使用Oleview.exe,文件+视图类型库。是的,IDUMMMCMOMOBJ在类型库中声明,只有指针作为参数/返回值的方法才不会导入。我将就此提出一个新问题。
STDMETHODIMP STDMETHODCALLTYPE TServerDidleComTestImpl::GetMyObject(IDummyComObj** outObj)
{
DummyComObj *myDum = Form2->Getformdummy();
*outObj = &myDum;
return S_OK;
}
DummyComObj *myDum = Form2->Getformdummy();
return myDum->QueryInterface(__uuidof(IDummyComObj), outObj);
#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);
};
__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);
}
STDMETHODIMP STDMETHODCALLTYPE
TServerDidleComTestImpl::GetMyObject(IDummyComObj** outObj)
{
return Form2->Getformdummy(outObj);
}