Ok, z tego co wyczytałam w Internecie, prawdopodobne jest, że mój błąd jest spowodowany przez fakt, że wywołuję wątek w STA, podczas gdy wątek główny jest w MTA. Nie jestem do tego 100% przekonana, bo akurat w miejscach gdzie się wywala, wcale nie ma takiej potrzeby, by nowy wątek komunikował się z innymi wątkami tego procesu. Fakt, że ma się komunikować z Wordem...
*
Nie, to powyższe to jakaś papka. Nie rozumiem problemu dobrze :/ To proces, któremu robimy QueryInterface powinien być w tym samym apartamencie (tak po polsku się mówi?) co ten, z którego wywołujemy. Nie powinno to dotyczyć obiektów OLE, bo one mają własny, wbudowany marshalling....
Fakty są takie - wątek główny może komunikować się z Wordem. Nowy wątek, niezależnie od tego, czy użyję CoInitialize, czy CoInitializeEx(NULL, COINIT_MULTITHREADED) - nie znajduje interfejsu.
*
Zamieniłam w funkcji wątku CoInitialize na CoInitializeEx(NULL, COINIT_MULTITHREADED) - ale nie zmieniło to nic.
Porównałam właściwości projektu w wersji nowej (nie działającej) i starej pod VS2003. Jest jedna być może znacząca różnica - w VS2003 projekt ma Runtime Library Multi-threaded Debug DLL, w VS2008 Multi-threaded Debug. Projekt jest dllką. Kiedy mu zmienię pod VS2008 na Multi-threaded Debug DLL przestanie się kompilować, ponieważ jest w solucji jeden projekt, który kompiluje się tylko z ustawieniem Multi-threaded Debug.
Nie potrafię powiedzieć, czy to ma wpływ na obecny problem. Nie miałam jeszcze takich dzikich problemów z wątkami, ale może to dlatego, że nie pracowałam z nimi na cudzym, starym kodzie...
*
STA - All OLE controls by necessity must live in a STA. STA means that your COM-object must be always manipulated on the UI thread and cannot be passed to other threads (much like any UI element in MFC). However, your program can still have many threads.
i jeszcze jeden edit:
Doprowadziłam projekt do kompilacji w Multi-threaded Debug DLL, mimo to nic się nie zmieniło. Pod VS2003 (i innej maszynie) obie wersje działają prawidłowo.