- - PR -
VC+MSXMLでのCOM初期化エラー
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 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 |
|
投稿日時: 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 ] |
|
投稿日時: 2006-08-09 11:42
要するに、CoInitialize関数とCoUninitialize関数はスレッドごと一回だけ呼び出す
ようにすべきだ、ということだと思います。でなければ、CoInitializeExを使って スレッドモデルを指定し、プロセスの起動・終了時だけ呼び出すか、です。 で、問題の部分はライブラリ、ということですので、これらの呼び出しはDLL側で コントロールできないことなので、CoInitialize関数とCoUninitialize関数を呼び出す べきではない、ということを言っています。 |
|
投稿日時: 2006-08-09 12:06
MMXさん、ukさん、返信ありがとうございます。
総合的には、CoInitializeEx (NULL, COINIT_MULTITHREADED)を プロセスの中で一度だけコールするように変更するれば・・・ っというのが、主な対処方法と考えているのですが。。。 #間違えていればご指摘をお願いします。 COMを使用するのは今回初めてで、まだまだ理解不足のようです。。。 DLLエントリポイントでの初期化、解放はハングアップの原因となると 記載されていたのでやはりDLLからは不可能なようですね。。。 #現状既に、実装がきまってしまっているので、 #打つ手無しのような感じもしますが。。。; 参考になるURLも提示していただき、 本当にありがとうございました。 |
1