I have a MTA COM Service application which is developed using Visual C++ 6. It is derived from CComModule class. This project is converted to VS2008 and it is working fine. The service can be started using SCM as well as CoCreateInstance() call. Everything is working fine.
As per MSDN CComModule is deprecated: So i need to change this service to ATLService. After changing it to ATL service, it can be started using SCM as well as CoCreateInstance() call. But CoCreateInstance call is hanged and it returns CO_E_SERVER_EXEC_FAILURE.
Below is my CoClass
class ATL_NO_VTABLE MyCoClass : public CComObjectRootEx<CComMultiThreadModel>, public CComCoClass<MyCoClass, &CLSID_MyCoClass>, public MyCoClass { public: MyCoClass() { } ~MyCoClass() { } DECLARE_REGISTRY_RESOURCEID(IDR_MYCOCLASS) BEGIN_COM_MAP(MyCoClass) COM_INTERFACE_ENTRY(IMyCoClass) END_COM_MAP() DECLARE_PROTECT_FINAL_CONSTRUCT() public: STDMETHOD(Connect)(/*[in]*/ BSTR data); }; OBJECT_ENTRY_AUTO(__uuidof(IMyCoClass), MyCoClass)
a.rgs
HKCR { NoRemove AppID { '%APPID%' = s 'MyService' 'MyService.EXE' { val AppID = s '%APPID%' } } }
Interface rgs
HKCR { MyService.MyCoClass.1 = s 'MyCoClass Class' { CLSID = s '{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}' } MyService.MyCoClass = s 'MyCoClass Class' { CLSID = s '{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}' CurVer = s 'MyService.MyCoClass.1' } NoRemove CLSID { ForceRemove {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} = s 'MyCoClass Class' { ProgID = s 'MyService.MyCoClass.1' VersionIndependentProgID = s 'MyService.MyCoClass' ForceRemove 'Programmable' LocalServer32 = s '%MODULE%' val AppID = s '%APPID%' 'TypeLib' = s '{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}' } } }
class CMyService : public CAtlServiceModuleT< CMyService, IDS_SERVICENAME > { public : DECLARE_LIBID(LIBID_MYSERVICELib) DECLARE_REGISTRY_APPID_RESOURCEID(IDR_MyService, "{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}") HRESULT InitializeSecurity() throw() { return S_OK; } }; CMyService _AtlModule; // extern "C" int WINAPI _tWinMain(HINSTANCE /*hInstance*/, HINSTANCE /*hPrevInstance*/, LPTSTR /*lpCmdLine*/, int nShowCmd) { return _AtlModule.WinMain( nShowCmd ); }
Thanks, Renjith V R