スレッド中のmsxmlパーサ

XMLベースの通信スクリプトエンジンを書いている。自前のWebサーバーで待ちうけて、OnReceiveでHTTPヘッダを解析し、ヘッダやPOSTデータが揃った時点でスクリプトエンジンを呼び出している。


void CPushPullSocket::OnReceive( int nErrorCode )
{
int nBytes = Receive( m_rbuff, COMBUFFSIZE );

if( nBytes != SOCKET_ERROR ) {
// ヘッダかPOSTデータ読み込み中か
switch( mRcvStat ) {
case IN_HEADER:
ReqHeaderAnalyze( m_rbuff, nBytes );
break;
case IN_ENTITY:
BodyAnalyze( m_rbuff, nBytes );
}

//! スクリプトエンジン呼び出し
if( mRcvStat == OK_SCRIPT ) {
SetScriptName( mObjName.Mid( 1 ) );
mRcvStat = SCRIPT_DONE;
BeginThread( PushPullThread );
// PushPullThread( this );
}
}
AsyncSelect( FD_WRITE | FD_CLOSE | FD_READ );
}

OnReceiveの中でスクリプトエンジンを呼び出すと、スクリプト終了までOnReceiveが終了しないので、その間、誰も動けない。
 それでスレッドを呼び出して、その中でスクリプトエンジンを動かそうと思った。ところが、そうするとmsxmlパーサがメモリエラー起こして止まるのであった。

CPushPullSocket::BeginThread: m_pThread = 01910B68, ID = 00000E34, handle = 00000634
At least one thread was killed while executing inside msxml.dll.
!! msxml.dll is unable to shut down !!
スクリプトエンジンは普通にコンソールアプリにして、CGIからそれぞれ別プロセスを立ち上げるようにするっきゃないか。