From: "H.Yamamoto" Date: 2004-06-17T19:18:38+09:00 Subject: [ruby-dev:23712] Re: Shell.Application on WIN32OLE 山本です。 arton wrote: (2004/06/16 23:59) >とりあえず、[ruby-dev:23693]の最初のパッチのCoFreeUnusedLibrayの呼び出し >を消すという対処が良いのではないでしょうか。この場合の問題点は不要となっ >たライブラリが開放されないためにプロセスメモリーが大きいままとなることで >すが、それ以外には特にないはずです。 他にも CoFreeUnusedLibraries() を呼んでいるところがあるそうなので、 そちらも削りました。 cvs diff -u -wb -p win32ole.c (in directory E:\ruby-cvs\ruby\ext\win32ole\) Index: win32ole.c =================================================================== RCS file: /var/cvs/src/ruby/ext/win32ole/win32ole.c,v retrieving revision 1.22 diff -u -w -b -p -r1.22 win32ole.c --- win32ole.c 8 May 2004 03:54:51 -0000 1.22 +++ win32ole.c 16 Jun 2004 21:41:09 -0000 @@ -67,7 +67,6 @@ (x) = 0;\ }\ }\ - CoFreeUnusedLibraries();\ } #define OLEData_Get_Struct(obj, pole) {\ @@ -5341,7 +5340,6 @@ ole_event_free(poleev) pcp->lpVtbl->Unadvise(pcp, poleev->pEvent->m_dwCookie); OLE_RELEASE(pcp); } - CoFreeUnusedLibraries(); } } >MULTITHREADEDで、CoInitializeExを呼び出すのは賛成できません。なぜならば、 >Win32OLEの実装が、MTAを意識していないからです。 msdn magagine Sep 2000 no.6 (日本版)の「COMとスレッド」を読んだのですが、 STAクライアントとMTAクライアントの差は、サーバと同じスレッドモデルなら 高速というだけのようでした。(異なるスレッドモデルだと、プロキシとマーシャラが介在する) STAクライアント: スレッドごとにアパートメントが作られ、スレッドはそこに所属 MTAクライアント:プロセスで唯一のアパートメントに複数のスレッドが所属 STAサーバ:一度に一つの要求のみ処理できる MTAサーバ:一度に複数の要求を処理できる 同期などを考慮すべきなのは MTAサーバであって MTAクライアントではないらしいので、 気にしなくてよさそうだったのですが・・・(付け焼刃の知識なので自信がありません)