2011/11/17 10:56:18
昨日は、自分の直したコードがどこか思い出せなくて、あやうく自分が数カ月悩んだ問題をもう一度やらせてしまうところだった。でもあの現象であの原因ってのは罠だよ。
2011/11/17 11:19:33
あの現象=プログラム終了時にCOMが消えずにメモリリークする。というプログラムが1つ見つかった。あの原因=マルチスレッドの場合CoInitialiseを複数回呼んではいけない。シングルスレッドなら問題にならない。2階層くらいライブラリを辿った先でDOMを使うために呼んでた。
2011/11/17 11:23:17
@NakamuraYoichi その現象はよくわかりませんが、CoInitialize は COM を利用する1スレッドにつき1回呼べばよく、また、複数回呼んだとしても、同じ回数だけ CoUninitialize を呼べばよいのでは。 [Windows reimagined]
2011/11/17 11:24:16
@NakamuraYoichi ライブラリの中で COM を使っている場合、そのための CoInitialize の呼び出しは、(ライブラリの中でスレッドを生成しているのでない限り)ライブラリの呼び出し元の責任だと思いますです。 [Windows reimagined]
2011/11/17 12:18:37
@aetos382 まったくその通りです。ライブラリの方を直しました。
2011/11/17 12:20:41
@aetos382 不思議なことに、CoUninitializeを対にしても解決せず、また、シングルスレッドのときは複数回CoInitializeしても大丈夫だったのです。
2011/11/17 12:21:51
@NakamuraYoichi こんなのあった… http://t.co/I0YzalJZ [Windows reimagined]
2011/11/17 12:32:56
@aetos382 ありがとうございます。CoInitializeとCoUninializeを対で呼ぶのは当然として、マルチスレッドでは1回きりでお願いします、ってことですかね。

原文の方が分かりやすいかもしれません。

Microsoft does not recommend that you call CoInitialize and CoUninitialize pairs repeatedly in a multithreaded apartment (MTA). After the multithreaded apartment is created, Microsoft recommends that you keep the multithreaded apartment initialized until you exit the process.
PRB: Problems When You Call CoInitialize and CoUninitialize Repeatedly in Multithreaded Apartment

訳: 「マルチスレッドの場合はCoInitializeとCoUninitializeのペアを繰り返し呼んではならない。最初にCoInitializeしたら、プロセス終了時にCoUninitializeするまで触らないこと。」

これ、間違えやすいのは、例えばXMLDOMDocumentを使うサンプルコードなんかで、CoInitializeとCoUninitializeとで挟んでいたりするんですよね。そういうコードをコピってくると引っかかる。