// plugin.cpp : Implementation of CPluginApp and DLL registration.
#include "stdafx.h"
#include <initguid.h>
#include "plugin.h"
#include "pluginc.h"
#include "afxpriv.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
CPluginApp NEAR theApp;
const GUID CDECL BASED_CODE _tlid =
{ 0x85df111, 0x10e, 0x11d0, { 0xaa, 0x6b, 0, 0x80, 0x5f, 0xc, 0x92, 0x32 } };
const WORD _wVerMajor = 1;
const WORD _wVerMinor = 0;
////////////////////////////////////////////////////////////////////////////
// CPluginApp::InitInstance - DLL initialization
BOOL CPluginApp::InitInstance()
{
BOOL bInit = COleControlModule::InitInstance();
if (bInit)
{
// TODO: Add your own module initialization code here.
}
return bInit;
}
////////////////////////////////////////////////////////////////////////////
// CPluginApp::ExitInstance - DLL termination
int CPluginApp::ExitInstance()
{
// TODO: Add your own module termination code here.
return COleControlModule::ExitInstance();
}
/////////////////////////////////////////////////////////////////////////////
// DllRegisterServer - Adds entries to the system registry
STDAPI DllRegisterServer(void)
{
AFX_MANAGE_STATE(_afxModuleAddrThis);
if (!AfxOleRegisterTypeLib(AfxGetInstanceHandle(), _tlid))
return ResultFromScode(SELFREG_E_TYPELIB);
if (!COleObjectFactoryEx::UpdateRegistryAll(TRUE))
return ResultFromScode(SELFREG_E_CLASS);
return NOERROR;
}
/////////////////////////////////////////////////////////////////////////////
// DllUnregisterServer - Removes entries from the system registry
STDAPI DllUnregisterServer(void)
{
AFX_MANAGE_STATE(_afxModuleAddrThis);
if (!AfxOleUnregisterTypeLib(_tlid, _wVerMajor, _wVerMinor))
return ResultFromScode(SELFREG_E_TYPELIB);
if (!COleObjectFactoryEx::UpdateRegistryAll(FALSE))
return ResultFromScode(SELFREG_E_CLASS);
return NOERROR;
}
/////////////////////////////////////////////////////////////////////////////
// CPluginObj
IMPLEMENT_DYNCREATE(CPluginObj, CCmdTarget)
CPluginObj::CPluginObj()
{
EnableAutomation();
m_pIMprUIHost = NULL;
// To keep the application running as long as an OLE automation
//object is active, the constructor calls AfxOleLockApp.
AfxOleLockApp();
}
CPluginObj::~CPluginObj()
{
// To terminate the application when all objects created with
// with OLE automation, the destructor calls AfxOleUnlockApp.
AfxOleUnlockApp();
}
void CPluginObj::OnFinalRelease()
{
// When the last reference for an automation object is released
// OnFinalRelease is called. The base class will automatically
// deletes the object. Add additional cleanup required for your
// object before calling the base class.
CCmdTarget::OnFinalRelease();
}
BEGIN_MESSAGE_MAP(CPluginObj, CCmdTarget)
//{{AFX_MSG_MAP(CPluginObj)
// NOTE - the ClassWizard will add and remove mapping macros here.
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
BEGIN_INTERFACE_MAP(CPluginObj, CCmdTarget)
INTERFACE_PART(CPluginObj, IID_IMprUIPlugin, MprUIPlugin)
END_INTERFACE_MAP()
// {085DF11A-010E-11D0-AA6B-00805F0C9232}
IMPLEMENT_OLECREATE(CPluginObj, "PLUGIN.PLUGINOBJ", 0x85df11a, 0x10e, 0x11d0, 0xaa, 0x6b, 0x0, 0x80, 0x5f, 0xc, 0x92, 0x32)
/////////////////////////////////////////////////////////////////////////////
// CPluginObj message handlers
HRESULT CPluginObj::XMprUIPlugin::QueryInterface(REFIID riid, LPVOID FAR* ppvObj)
{
METHOD_PROLOGUE(CPluginObj, MprUIPlugin);
return (HRESULT)pThis->ExternalQueryInterface(&riid, ppvObj);
}
ULONG CPluginObj::XMprUIPlugin::AddRef()
{
METHOD_PROLOGUE(CPluginObj, MprUIPlugin);
return pThis->ExternalAddRef();
}
ULONG CPluginObj::XMprUIPlugin::Release()
{
METHOD_PROLOGUE(CPluginObj, MprUIPlugin);
return pThis->ExternalRelease();
}
HRESULT CPluginObj::XMprUIPlugin::ConnectToRouter
(LPCTSTR pRouterName, IMprUIHost *pIMprUIHost)
{
METHOD_PROLOGUE(CPluginObj, MprUIPlugin);
ASSERT(pRouterName && pIMprUIHost);
pThis->m_pIMprUIHost = pIMprUIHost;
return S_OK;
}
HRESULT CPluginObj::XMprUIPlugin::GetTitle(PWSTR* ppszTitle)
{
METHOD_PROLOGUE(CPluginObj, MprUIPlugin);
ASSERT(ppszTitle);
CString str;
WCHAR *pwc;
VERIFY(str.LoadString(IDS_TITLE));
*ppszTitle = (WCHAR*)::CoTaskMemAlloc((str.GetLength() + 1) * sizeof(WCHAR));
if (*ppszTitle == NULL)
return E_OUTOFMEMORY;
#ifndef _UNICODE
USES_CONVERSION;
pwc = A2W(str);
#else
pwc = (LPTSTR)(LPCTSTR)str;
#endif
wcscpy(*ppszTitle, pwc);
return S_OK;
}
HRESULT CPluginObj::XMprUIPlugin::GetContextMenu(HMENU* phMenu)
{
METHOD_PROLOGUE(CPluginObj, MprUIPlugin);
ASSERT(phMenu);
CMenu menu;
VERIFY(menu.LoadMenu(IDR_PLUGIN));
*phMenu = menu.Detach();
return S_OK;
}
HRESULT CPluginObj::XMprUIPlugin::ProcessCommand
(WPARAM wParam, LPARAM lParam, HWND hWndParent)
{
METHOD_PROLOGUE(CPluginObj, MprUIPlugin);
if (LOWORD(wParam) != ID_CREATEFLOATER)
return E_INVALIDARG;
if (pThis->m_pIMprUIHost == NULL)
return E_FAIL;
CString str;
VERIFY(str.LoadString(IDS_FLOAT));
WCHAR *pwc;
#ifndef _UNICODE
USES_CONVERSION;
pwc = A2W(str);
#else
pwc = (LPTSTR)(LPCTSTR)str;
#endif
HRESULT hr = pThis->m_pIMprUIHost->FloatWindow(
CPluginObj::guid, // CLSID representing the object
CPluginCtrl::guid, // CLSID of Ole Control to create
(IMprUIPlugin*)this, // Plugin in node making request
0x00000001, // constant context passed back to Ole Control
pwc // Title of floating window
);
ASSERT(hr == S_OK);
return hr;
}
HRESULT CPluginObj::XMprUIPlugin::GetCLSID(CLSID** ppClsid)
{
METHOD_PROLOGUE(CPluginObj, MprUIPlugin);
ASSERT(ppClsid);
HRESULT hr = S_OK;
*ppClsid = (CLSID*)CoTaskMemAlloc(sizeof(CLSID));
if (*ppClsid == NULL)
return E_OUTOFMEMORY;
memcpy(*ppClsid, &CPluginCtrl::guid, sizeof(CLSID));
return S_OK;
}