/* ** Command & Conquer Generals(tm) ** Copyright 2025 Electronic Arts Inc. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program. If not, see . */ //////////////////////////////////////////////////////////////////////////////// // // // (c) 2001-2003 Electronic Arts Inc. // // // //////////////////////////////////////////////////////////////////////////////// // // FEBDispatch class is a template class which, when inherited from, can implement the // IDispatch for a COM object with a type library. // #ifndef _FEBDISPATCH_H__ #define _FEBDISPATCH_H__ #include extern CComModule _Module; #include #include // For _bstr_t. #include "oleauto.h" template class FEBDispatch : public CComObjectRootEx, public CComCoClass, public C { public: BEGIN_COM_MAP(T) COM_INTERFACE_ENTRY(C) COM_INTERFACE_ENTRY_AGGREGATE(IID_IDispatch, m_dispatch) END_COM_MAP() FEBDispatch() { m_ptinfo = NULL; m_dispatch = NULL; ITypeLib *ptlib; HRESULT hr; HRESULT TypeLibraryLoadResult; char filename[256]; GetModuleFileName(NULL, filename, sizeof(filename)); _bstr_t bstr(filename); TypeLibraryLoadResult = LoadTypeLib(bstr, &ptlib); DEBUG_ASSERTCRASH(TypeLibraryLoadResult == 0, ("Can't load type library for Embedded Browser")); if (TypeLibraryLoadResult == S_OK) { hr = ptlib->GetTypeInfoOfGuid(*I, &m_ptinfo); ptlib->Release(); if (hr == S_OK) { hr = CreateStdDispatch(static_cast(this), static_cast(this), m_ptinfo, &m_dispatch); m_dispatch->AddRef(); // Don't release the IUnknown from CreateStdDispatch without calling AddRef. // It looks like CreateStdDispatch doesn't call AddRef on the IUnknown it returns. } } if ( (m_dispatch == NULL) ) { DEBUG_LOG(("Error creating Dispatch for Web interface\n")); } } virtual ~FEBDispatch() { if (m_ptinfo) m_ptinfo->Release(); if (m_dispatch) m_dispatch->Release(); } IUnknown *m_dispatch; private: ITypeInfo *m_ptinfo; }; #endif