I faced this problem while migrating one of my COM applications from VS2008 to VS2012.
Problem: COM application crashes when compiled with VS2012 on Windows 2012
- Search for a class like below in your code which inherits from
CAfwAtlExeModuleT<>
.
class CAsset_Tree_Module : public CAfwAtlExeModuleT< CAsset_Tree_Module >
- You might see a method similar to the one below in that class (if yes than there is a trap):
HRESULT RegisterClassObjects(DWORD dwClsContext, DWORD dwFlags) throw()
{
return AtlComModuleRegisterClassObjects(&_AtlComModule, CLSCTX_LOCAL_SERVER, REGCLS_SINGLEUSE);
}
- As per Microsoft, in Visual Studio 2012, this function cannot be used in applications that execute in the Windows Runtime.
http://msdn.microsoft.com/en-us/library/vstudio/hd3ht4xt%28v=vs.100%29.aspx
Just change the version of Visual Studio (2010 to 2012) in the above link to see the difference.
Here is the solution:
Replace this line:
return AtlComModuleRegisterClassObjects(&_AtlComModule, CLSCTX_LOCAL_SERVER, REGCLS_SINGLEUSE);
with this code block:
#if _MSC_VER > 1600
dwFlags &= ~REGCLS_MULTIPLEUSE;
dwFlags |= REGCLS_SINGLEUSE;
return __super::RegisterClassObjects(dwClsContext,dwFlags);
#else
return AtlComModuleRegisterClassObjects(&_AtlComModule,
CLSCTX_LOCAL_SERVER, REGCLS_SINGLEUSE);
#endif