www.pudn.com > lucent_softphone.rar > lucentCti.cpp
// lucentCti.cpp : Implementation of DLL Exports. // Note: Proxy/Stub Information // To build a separate proxy/stub DLL, // run nmake -f lucentCtips.mk in the project directory. #include "stdafx.h" #include "resource.h" #include#include "lucentCti.h" #include "lucentCti_i.c" #include "CTIEvent.h" #include "MichelleCTI.h" #include "DirectoryNumber.h" #include "KVList.h" #include "KVPair.h" CComModule _Module; BEGIN_OBJECT_MAP(ObjectMap) OBJECT_ENTRY(CLSID_CTIEvent, CCTIEvent) OBJECT_ENTRY(CLSID_MichelleCTI, CMichelleCTI) OBJECT_ENTRY(CLSID_DirectoryNumber, CDirectoryNumber) OBJECT_ENTRY(CLSID_KVList, CKVList) OBJECT_ENTRY(CLSID_KVPair, CKVPair) END_OBJECT_MAP() ///////////////////////////////////////////////////////////////////////////// // DLL Entry Point extern BOOL GlobalStartup(HINSTANCE hInstance); extern void GlobalCleanup(); extern "C" BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID /*lpReserved*/) { if (dwReason == DLL_PROCESS_ATTACH) { _Module.Init(ObjectMap, hInstance, &LIBID_CTILib); DisableThreadLibraryCalls(hInstance); if (!GlobalStartup(hInstance)) return FALSE; } else if (dwReason == DLL_PROCESS_DETACH) { GlobalCleanup(); _Module.Term(); } return TRUE; // ok } ///////////////////////////////////////////////////////////////////////////// // Used to determine whether the DLL can be unloaded by OLE STDAPI DllCanUnloadNow(void) { return (_Module.GetLockCount()==0) ? S_OK : S_FALSE; } ///////////////////////////////////////////////////////////////////////////// // Returns a class factory to create an object of the requested type STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv) { return _Module.GetClassObject(rclsid, riid, ppv); } ///////////////////////////////////////////////////////////////////////////// // DllRegisterServer - Adds entries to the system registry STDAPI DllRegisterServer(void) { // registers object, typelib and all interfaces in typelib // DebugBreak(); return _Module.RegisterServer(TRUE); } ///////////////////////////////////////////////////////////////////////////// // DllUnregisterServer - Removes entries from the system registry STDAPI DllUnregisterServer(void) { return _Module.UnregisterServer(TRUE); } static HRESULT InternalCreateInstance(REFCLSID rclsid, REFIID riid, LPVOID *ppv) { LPCLASSFACTORY pFactory; HRESULT hRes = _Module.GetClassObject(rclsid, IID_IClassFactory, (LPVOID *)&pFactory); if(SUCCEEDED(hRes)) { hRes = pFactory->CreateInstance(NULL, riid, ppv); pFactory->Release(); } return(hRes); } #define DEFINE_CASTER(Class, Interface) \ Class *I2C(Interface *pInterface) \ { \ Class *pClass = NULL; \ if(pInterface) \ pClass = dynamic_cast (pInterface); \ return(pClass); \ } #define DEFINE_CREATOR(Class, Interface, rclsid, riid) \ HRESULT CreateClass(Class **ppClass, Interface **ppInterface) \ { \ HRESULT hRes = InternalCreateInstance(rclsid, riid, (LPVOID *)ppInterface); \ if(SUCCEEDED(hRes)) { \ *ppClass = I2C(*ppInterface); \ if(!*ppClass) { \ (*ppInterface)->Release(); \ *ppInterface = NULL; \ hRes = E_FAIL; \ } \ } \ return(hRes); \ } DEFINE_CASTER(CKVPair, IKVPair) DEFINE_CASTER(CKVList, IKVList) DEFINE_CASTER(CCTIEvent, ICTIEvent) DEFINE_CASTER(CDirectoryNumber, IDirectoryNumber) DEFINE_CREATOR(CKVPair, IKVPair, CLSID_KVPair, IID_IKVPair) DEFINE_CREATOR(CKVList, IKVList, CLSID_KVList, IID_IKVList) DEFINE_CREATOR(CCTIEvent, ICTIEvent, CLSID_CTIEvent, IID_ICTIEvent) DEFINE_CREATOR(CDirectoryNumber, IDirectoryNumber, CLSID_DirectoryNumber, IID_IDirectoryNumber)