- PR -

VC+MSXMLでのCOM初期化エラー

1
投稿者投稿内容
wis
会議室デビュー日: 2006/08/09
投稿数: 2
投稿日時: 2006-08-09 11:09
はじめまして。
早速ですが質問させて頂きます。

現在VC6とMSXML4.0を使用してライブラリを作成しているのですが、
MSXMLを使用するに当たり、CoInitialize関数とCoUninitialize関数を
コールする必要があります。

しかしこのライブラリは様々なProcess,Threadからコールされる可能性のある
機能を提供しており、初期化、解放の整合性の手段として、
情報取得の関数を1つにし関数内でCoInitialize−MSXML使用−CoUninitialize
としました。

しかし、アプリケーションを実行しDLLを使用して、しばらくすると
CoInitialize関数がE_INVALIDARGで失敗するようになります。
MSサポートに以下の記載があったのですが、具体的な対処方法が
いまいち理解できません。
MSHP:http://search.support.microsoft.com/?scid=kb;jp;911359&spid=3221&sid=324

これは単に、CoInitialize関数のコール回数を減らせと書いてあるような
気がするのですが、英語版を翻訳しても自分の語学力ではCoInitialize関数の
呼び出しを無くせと書いてあるように思えます。。。
しかし、CoInitialize関数を無くすというのがどのような意味なのかが
理解できません。。。

何か情報をお持ちの方はご教授お願い致します。

開発環境
WinXPPro
VC++6
WinPlatformSDK

MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2006-08-09 11:23
[mfc 29066] Re: CoInitialize/UnInitializeについて
http://search.acty-net.ne.jp/mfc_search/archive/2001-1/msg01381.html
===============
[OLE] OLE スレッド モデルの概要としくみ
http://support.microsoft.com/default.aspx?scid=%2Fisapi%2Fgomscom.asp%3Ftarget%3D%2Fjapan%2Fsupport%2Fkb%2Farticles%2Fjp150%2F7%2F77.asp&LN=JA
-----------------------------
変な機械翻訳の雰囲気では UnInitializeを一度でもすると、再開できなくなるみたいな。
しかし、COM使用の前提なら、既に見えない箇所で CoInitialize されていたりして。

[ メッセージ編集済み 編集者: MMX 編集日時 2006-08-09 12:25 ]
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2006-08-09 11:42
要するに、CoInitialize関数とCoUninitialize関数はスレッドごと一回だけ呼び出す
ようにすべきだ、ということだと思います。でなければ、CoInitializeExを使って
スレッドモデルを指定し、プロセスの起動・終了時だけ呼び出すか、です。

で、問題の部分はライブラリ、ということですので、これらの呼び出しはDLL側で
コントロールできないことなので、CoInitialize関数とCoUninitialize関数を呼び出す
べきではない、ということを言っています。
wis
会議室デビュー日: 2006/08/09
投稿数: 2
投稿日時: 2006-08-09 12:06
MMXさん、ukさん、返信ありがとうございます。

総合的には、CoInitializeEx (NULL, COINIT_MULTITHREADED)を
プロセスの中で一度だけコールするように変更するれば・・・
っというのが、主な対処方法と考えているのですが。。。
#間違えていればご指摘をお願いします。

COMを使用するのは今回初めてで、まだまだ理解不足のようです。。。
DLLエントリポイントでの初期化、解放はハングアップの原因となると
記載されていたのでやはりDLLからは不可能なようですね。。。
#現状既に、実装がきまってしまっているので、
#打つ手無しのような感じもしますが。。。;

参考になるURLも提示していただき、
本当にありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)