1

を使用してMSSQLに接続し、のオブジェクトTADOConnectionを使用してクライアントアプリケーションにデータを提供するサービスアプリケーションがあります。このサービスアプリケーションは、MSSQLを実行しているのと同じマシンにインストールされている可能性があり、サービスの前に開始される可能性があります。そのため、イベントでADOに接続できません。の場合にADOに接続しようとしましたが、別のスレッドで実行されているため、「CoInitializeが呼び出されていません」というメッセージが表示されました。次に、これを次のようにメインスレッドと同期させようとしました。Cromis.IPCTIPCServerMSSQLOnServiceStartOnExecuteRequestTIPCServer

TThread.Synchronize(nil, ConnectDB);

しかし、それは機能しませんでした。私のアプリケーションはそこで応答を停止します。

次に、OnExecuteRequestイベントを変更して、それをパラメーターとして呼び出しているスレッドを渡し、これを試しました。

AThread.Synchronize(AThread, ConnectDB);

しかし、変化はありません。[デバッグDCUの使用]をオンにすると、アプリケーションが次の行で応答しなくなることがわかりました。

function WaitForSyncWaitObj(P: Pointer; Timeout: Cardinal): Integer;
begin
  Result := WaitForSingleObject(THandle(P), Timeout); // <-- I'm stuck here...
end;

私は完全に迷子になっています。何か案は?


PS:質問が乱雑になるのを防ぐためにコードを提供しませんでした。その一部が必要な場合は、お知らせください。


PS 2:この前に、サービスアプリケーションでタイマーを使用して、MSSQLに接続する前に一定期間待機しようとしました。ネットワークドライバがロードされる前であっても、MSSQLはすぐに起動するようです(ネットワークドライバの代わりにMcAfee VSE 8.7をインストールしています)。私のサービスはMSSQLに接続しますが、ネットワークドライバーが読み込まれると、接続が切断されます。ネットワークドライバがロードされた後にサービスを開始するようにWindows(XP以降)に指示する方法があれば、私の問題は解決されます。どんなヒントも本当にありがたいです。

4

1 に答える 1

1

コンストラクタを呼び出し、そのデストラクタを呼び出しCoInitialize(nil);ます。どちらもユニットで宣言されています。スレッド クラスを含むユニットの句に追加する必要がある場合があります。TThreadCoUnitializeComObjuses

データベース接続はスレッド固有であり (つまり、各スレッドには独自の接続が必要です)、ADOCOM が必要です。つまり、スレッドはそれ自体で COM を初期化する必要があり、スレッドの終了時に COM を解放する必要があります。

于 2012-09-09T07:35:28.367 に答える