2012-04-18 8 views
1

私の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を返します。それは私が立ち往生したところです - 私はこの現象を引き起こす原因はありません...

+0

Word版は両方のマシンで同じですか? – Soonts

+0

はい、それはWord 2003です。 – aurel

+0

メインスレッドは十分に長く、CoUninitializeを呼び出さないのですか? MSDNによると、CoInitialize(0)またはCoInitializeEx(COINIT_APARTMENTTHREADED)を呼び出すアプリケーションの最初のスレッドは、CoUninitialize()を呼び出す最後のスレッドである必要があります。呼び出し順序がこの順序でない場合、アプリケーションは機能しません。 – Soonts

答えて

2

IMO CoInitializeではなく、COINIT_MULTITHREADEDを指定してCoInitializeExでCOMを初期化する必要があります。それ以外の場合は、すべてのスレッドに対して個別のシングルスレッドCOMアパートメントを使用します。

+1

さて、私はそれを試みましたが、何の違いもありませんでした。 – aurel