1)注释“#define _CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA”
2)CreateMenuBar、AtlCreateMenuBar 无法使用,需使用SHCreateMenuBar
HWND CCWSmartClientDialog::CreateCECommandBar( HWND hWnd )
{
SHMENUBARINFO mbi;
memset(&mbi, 0, sizeof(SHMENUBARINFO));
mbi.cbSize = sizeof(SHMENUBARINFO);
mbi.hwndParent = hWnd;
mbi.nToolBarId = ID_TOOLBAR1;
mbi.hInstRes = _Module.GetModuleInstance();
mbi.nBmpId = 0;
mbi.cBmpImages = 0;
if (!SHCreateMenuBar(&mbi))
return NULL;
return mbi.hwndMB;
}
3)LoadImage函数装载图标无效。
实例句柄得用_tWinMain传递过来的,不用使用_Module.GetModuleInstance来获取,这两者得到的实例句柄不一样,原因我还没弄明白。
尝试解决办法:
1)我怀疑是因为我改了atlapp.h中关于
RegisterClassObjects部分导致的,但将另外一个
RegisterClassObjects定义屏蔽掉结果也是一样的,估计跟这个没有关系。
2)我跟踪了CComModule::m_hInst产生过程,但在CComModule::Init过程就跟不下去了,不知道ATL是怎么传递WinMain的hInstance到CAtlBaseModule类去的。
3)临时解决办法:在-tWinMain函数中,_Module.AppRun之前,将hInstance赋值给CComModule的资源句柄,这样在程序其它地方就可以将它当作实例句柄了。
_Module.SetResourceInstance(hInstance);
4)COM模块编译时会报错,提示UpdateRegistry不是xx的成员:
1>d:\日程\today\wince projects\atltest\ATLCls.h(65) : error C2039: “UpdateRegistry”: 不是“CATLCls”的成员
1> d:\日程\today\wince projects\atltest\ATLCls.h(28) : 参见“CATLCls”的声明
1>d:\日程\today\wince projects\atltest\ATLCls.h(65) : error C2065: “UpdateRegistry”: 未声明的标识符
解决办法:
在COM类的头文件中找到#ifndef _CE_DCOM语句,
#ifndef _CE_DCOM
DECLARE_REGISTRY_RESOURCEID(IDR_xxxxx)
#endif
改为
#ifdef _CE_DCOM //由#ifndef->#ifdef
DECLARE_REGISTRY_RESOURCEID(IDR_xxxxx)
#endif
5)RegisterClassObjects和RevokeClassObjects重定义
1>C:\WTL81\Include\atlapp.h(154) : error C2084: 函数“HRESULT ATL::CComModule::RegisterClassObjects(DWORD,DWORD) throw()”已有主体
1> F:\Xp ProgramFiles\Microsoft Visual Studio 9.0\VC\ce\atlmfc\include\atlbase.h(4471) : 参见“RegisterClassObjects”的前一个定义
1>C:\WTL81\Include\atlapp.h(156) : error C2084: 函数“HRESULT ATL::CComModule::RevokeClassObjects(void) throw()”已有主体
1> F:\Xp ProgramFiles\Microsoft Visual Studio 9.0\VC\ce\atlmfc\include\atlbase.h(4472) : 参见“RevokeClassObjects”的前一个定义
解决办法:
修改atlapp.h,找到下列语句:
namespace ATL
{
inline HRESULT CComModule::RegisterClassObjects(DWORD /*dwClsContext*/, DWORD /*dwFlags*/) throw()
{ return E_NOTIMPL; }
inline HRESULT CComModule::RevokeClassObjects() throw()
{ return E_NOTIMPL; }
}; // namespace ATL
加上宏开关
#ifndef _WIN32_WCE
namespace ATL
{
inline HRESULT CComModule::RegisterClassObjects(DWORD /*dwClsContext*/, DWORD /*dwFlags*/) throw()
{ return E_NOTIMPL; }
inline HRESULT CComModule::RevokeClassObjects() throw()
{ return E_NOTIMPL; }
}; // namespace ATL
#endif