ComServer, который должен возвращать ComObject - PullRequest
0 голосов
/ 04 февраля 2010

Я пытаюсь передать клиенту объект, созданный на стороне сервера. У меня это работает хорошо, когда я использую 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;
}

Server TestComServerImpl: .cpp

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

Ответы [ 2 ]

1 голос
/ 07 февраля 2010

Помощь от 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);
}

Server TestComServerImpl: .cpp

STDMETHODIMP STDMETHODCALLTYPE 
TServerDidleComTestImpl::GetMyObject(IDummyComObj** outObj)
{
    return Form2->Getformdummy(outObj);
}
1 голос
/ 04 февраля 2010

Ваш метод GetMyObject () неверный, он возвращает указатель на локальную переменную.Это будет работать только случайно, никогда для любого языка, который обернет COM.Исправление (минус обработка ошибок):

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

Не уверен, что __uuidof () доступен в Builder, используйте все, что у вас есть, чтобы получить IID интерфейса.

...