私のVS2003プロジェクトをVS2008に変換した後、私の問題が始まりました。ソリューションには3つのプロジェクトが含まれます。プロジェクトはDLLです。たくさんのコンパイルエラーがあり、いくつかのリンカエラーが...まあ、私はそれらと戦った。今すぐ単に動作しません;)なぜ新しいスレッドでCOMが動作しないのですか?
したがって、このDLLの1つは、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上で動作VS2008で、それはそれは、メインスレッドによって呼び出された場合にのみ動作しながら(と別のマシン、私は自分のコンピュータ上でVS2003を持っていません)。新しいスレッドで
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;
}
:デバッグしながらそのPTR 0
を示すIがcomip.hのコードに達し - d_pAppが正しく初期化されていない(WICHがのCoInitializeによって初期化される)新しいスレッドによって呼び出さ GetIID()は両方のスレッドで同じことを返しますが、QueryInterfaceはE_NOINTERFACEを返します。それは私が立ち往生したところです - 私はこの現象を引き起こす原因はありません...
Word版は両方のマシンで同じですか? – Soonts
はい、それはWord 2003です。 – aurel
メインスレッドは十分に長く、CoUninitializeを呼び出さないのですか? MSDNによると、CoInitialize(0)またはCoInitializeEx(COINIT_APARTMENTTHREADED)を呼び出すアプリケーションの最初のスレッドは、CoUninitialize()を呼び出す最後のスレッドである必要があります。呼び出し順序がこの順序でない場合、アプリケーションは機能しません。 – Soonts