如何解决我怎么知道我的MFC应用程序是否使用COM / OLE?
我从Win7到Win10,最近通过打开一个文件而遇到“参数错误错误”。
该错误非常罕见且随机发生。
没有提供进一步的信息或呼叫堆栈信息。我曾经在MFC代码中进行过深入搜索。 DocManager打开文档,然后调用CDocument::SetPathName(..,TRUE)
将当前文件也添加到最近的文件列表中。
似乎此函数现在使用OLE / COM函数。
void CRecentFileList::Add(LPCTSTR lpszPathName,LPCTSTR lpszAppID)
{
:
:
Add(lpszPathName);
HRESULT hr = S_OK;
CComPtr<IShellItem> psi = NULL;
hr = _AfxSHCreateItemFromParsingName(lpszPathName,NULL,IID_IShellItem,reinterpret_cast<void**>(&psi));
ENSURE(SUCCEEDED(hr)); // Remark Tom: This throws an AfxInvalidException()
}
hr错误代码为-2147221008,这意味着CoInitialize
尚未被调用。
我很惊讶,因为我从未使用过COM / OLE Stuff。
要克服此错误,我必须在AfxOleInit()
中添加InitInstance
。
我的问题是,我如何提前知道我的应用程序是否需要使用OLE / COM?
其他问题,如果我在应用程序中使用COM / OLE,是否会有任何缺点? (内存和速度)?
解决方法
我的问题是,我如何提前知道我的应用程序是否需要使用OLE / COM?
MFC应用程序应该总是初始化OLE / COM,尤其是使用STA(单线程单元)的并发模型。这是在向导生成的模板中自动完成的,否则必须在用户代码中显式完成。从CWinApp文档中:
MFC应用程序必须初始化为单线程单元(STA)。
如果您在InitInstance覆盖中调用CoInitializeEx,请指定COINIT_APARTMENTTHREADED(而不是COINIT_MULTITHREADED)。
始终将OLE / COM初始化为STA也可以避免@IInspectable在评论中提到的the curse of the implicit MTA。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。