为什么 COM 在新线程中不起作用?
Why COM doesn't work in a new thread?
我的问题是在将我的VS2003项目转换为VS2008后开始的。解决方案包含 3 个项目。项目是 DLL 的。有很多编译错误,然后是一些链接器错误......好吧,我击退了他们。现在它根本不起作用;)
因此,支持此DLL之一通过COM与Word进行通信。
Word::_ApplicationPtr d_pApp;
Word::_DocumentPtr d_pDoc;
void MSWord2003::init()
{
free();
HRESULT hr;
CLSID clsid;
CLSIDFromProgID(L"Word.Application", &clsid);
// Get an interface to the running instance, if any..
IUnknown *pUnk;
hr = GetActiveObject(clsid, NULL, (IUnknown**)&pUnk);
if(hr!=S_OK)
throw MSWord::MSWordException("Nie znaleziono działającej aplikacji MSWord.");
IDispatch* d_pDispApp;
hr = pUnk->QueryInterface(IID_IDispatch, (void**)&d_pDispApp);
if(hr!=S_OK)
throw MSWord::MSWordException("Nie udało się połączyć z aplikacją MSWord.");
pUnk->Release();
pUnk = 0;
d_pApp = d_pDispApp;
d_pDoc = d_pApp->ActiveDocument;
d_pDispApp->AddRef();
d_currIdx = -1;
paragraphsCount = d_pDoc->GetParagraphs()->Count;
footnotesCount = d_pDoc->GetFootnotes()->Count;
endnotesCount = d_pDoc->GetEndnotes()->Count;
}
void MSWord2003::free()
{
if(d_pApp!=0)
{
d_pApp->Release();
d_pApp=0;
}
}
此代码适用于VS2003(和不同的机器,我的计算机上没有VS2003),而在VS2008中,它仅在主线程调用时才有效。当由新线程调用时(由 CoInitialize 初始化),d_pApp 未正确初始化 - 其 ptr 显示 0。
调试时,我访问了comip.h中的代码:
template<typename _InterfacePtr> HRESULT _QueryInterface(_InterfacePtr p) throw()
{
HRESULT hr;
// Can't QI NULL
//
if (p != NULL) {
// Query for this interface
//
Interface* pInterface;
hr = p->QueryInterface(GetIID(), reinterpret_cast<void**>(&pInterface));
// Save the interface without AddRef()ing.
//
Attach(SUCCEEDED(hr)? pInterface: NULL);
}
else {
operator=(static_cast<Interface*>(NULL));
hr = E_NOINTERFACE;
}
return hr;
}
在新线程中,QueryInterface 返回 E_NOINTERFACE,尽管 GetIID() 为两个线程返回相同的内容。这就是我陷入困境的地方 - 我不知道是什么导致了这种行为......
IMO 您应该使用 CoInitialize 初始化 COM,而不是使用 CoInitializeEx,指定COINIT_MULTITHREADED。否则,每个线程都有单独的单线程 COM 单元。
相关文章:
- sigwait() 在多线程程序中不起作用
- MS 本机单元测试 - 断言::线程失败不起作用
- 线程之间的通信不起作用 - C++
- Qt信号和插槽如果从QRunnable或其他线程调用,则不起作用
- 谷歌语音识别不起作用,因为冲突线程Qt C++
- 线程函数参数的前向声明不起作用
- 使用 Visual c++ 进行多线程同步不起作用
- 通知所有在多线程C++不起作用.导致死锁
- 多线程 - 彼得森算法不起作用
- 为什么此C 线程示例不起作用
- Eclipse c++11 线程支持不起作用
- C 11线程不起作用
- WinAPI 的睡眠在子线程中不起作用
- 使用CSokcet和CWinThread,来自线程的PostMessage不起作用
- 程序基于用户输入创建多个线程不起作用(cin)
- 线程对象的 WaitForSingleObject 在 DLL 卸载中不起作用
- 由两个线程类共享的 Posix pthread_cond_t不起作用
- 线程清理器的抑制文件不起作用:出了什么问题
- 除非在创建线程后立即使用,否则 QueueUserAPC 不起作用
- Qt - 同步线程不起作用 - 线程停止但实际上不会停止,有时在不应该停止的时候停止