Привет всем
Нужна помощь, или направление к действию в таком вопросе.
Встал вопрос создания единого интерфейса для задач. Их сейчас порядка
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))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Здесь выходит ошибка создания окна
...
}
...
Ну вот вроде основные куски программы. Где и что я сделал не
правильно, не пойму. Буду благодарен за любую помощь.
Заранее спасибо!