doc/view in COM
От: dz_sas Россия  
Дата: 22.11.04 03:30
Оценка:
Привет всем
Нужна помощь, или направление к действию в таком вопросе.
Встал вопрос создания единого интерфейса для задач. Их сейчас порядка
30. В ближайшем будующем ожидается еще порядка 20. В 90% этих задач,
интерфейс одинаковый. Поэтому хотелось создать COM сервер с doc/view
технологией. В этом сервере хотелось хранить классы CMainFrame,
CChildFrame и CDocument. А CFormView хотелось вынести в клиенты,
которые в свою очередь будут также com серверами как plug-in. Пробовал
сделать таким образом:
MIDL:
...
interface IOGTMain : IUnknown{
  [helpstring("method CreateDocTempl")] HRESULT CreateDocTempl([in, out] VARIANT** pView, [in, out] VARIANT** DocTempl);
  [propget, helpstring("property Environment")] HRESULT Environment([out, retval] VARIANT* pVal);
  [propget, helpstring("property Connection")] HRESULT Connection([out, retval] VARIANT* pVal);
};
coclass OGTMain {
  [default] interface IOGTMain;
}
...

В сервере COM:
*.h
...
DECLARE_OLECREATE(COGTMain)
BEGIN_INTERFACE_PART(OGTMain, IOGTMain)
  STDMETHOD(CreateDocTempl)(VARIANT** pView, VARIANT** pDocTempl);
  STDMETHOD(get_Environment)(VARIANT* pVal);
  STDMETHOD(get_Connection)(VARIANT* pVal);
END_INTERFACE_PART(OGTMain)
...

*.cpp
...
STDMETHODIMP COGTMain::XOGTMain::CreateDocTempl(VARIANT** pView, VARIANT** pDocTempl)
{
  METHOD_PROLOGUE(COGTMain, OGTMain)
  if(pThis->m_pDocTempl == NULL) {
    pThis->m_pDocTempl = new CMultiDocTemplate(IDR_MAINFRAME,
      RUNTIME_CLASS(COGTDoc),
      RUNTIME_CLASS(CMainFrame),
      (CRuntimeClass*)pView);
  }
  *pDocTempl = reinterpret_cast<VARIANT*>(pThis->m_pDocTempl);
  return S_OK;
}
...

В реализации клиента:
*.cpp
...
BOOL COGTApp::InitInstance()
{
...
  HRESULT hr = CoCreateInstance(CLSID_OGTMain, NULL, CLSCTX_INPROC_SERVER, IID_IOGTMain, (void **)&pOGTMain);
  if (hr != S_OK) {
    TRACE0("Ошибка создания COM сервера.");
    return FALSE;
  }
  CMultiDocTemplate* pDocTemplate = NULL;
  pOGTMain->CreateDocTempl(reinterpret_cast<VARIANT**>(RUNTIME_CLASS(COGTView)), reinterpret_cast<VARIANT**>(&pDocTemplate));
  this->AddDocTemplate(pDocTemplate);
...
  if (!ProcessShellCommand(cmdInfo))
     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Здесь выходит ошибка создания окна
...
}
...

Ну вот вроде основные куски программы. Где и что я сделал не
правильно, не пойму. Буду благодарен за любую помощь.
Заранее спасибо!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.