Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 应返回ComObject的ComServer_C++_Com_C++builder - Fatal编程技术网

C++ 应返回ComObject的ComServer

C++ 应返回ComObject的ComServer,c++,com,c++builder,C++,Com,C++builder,我要做的是将在服务器端创建的对象传输到客户端。我在服务器和客户端使用C++时都能很好地工作,但是我不能让我的服务器与其他语言(如.NET)一起工作,它可能不喜欢指针。p> 这个服务器端代码看起来正确吗 服务器窗体: h .cpp 服务器TestComServerImpl: .cpp GetMyObject()方法不正确,它返回指向局部变量的指针。这只是偶然发生的,对于任何包装COM的语言都不会起作用。修复(减去错误处理): 不确定Builder中是否有可用的u_uidof(),请使用您所能获得的

我要做的是将在服务器端创建的对象传输到客户端。我在服务器和客户端使用C++时都能很好地工作,但是我不能让我的服务器与其他语言(如.NET)一起工作,它可能不喜欢指针。p> 这个服务器端代码看起来正确吗

服务器窗体: h

.cpp

服务器TestComServerImpl: .cpp

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


不确定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);
}