を使用してMSSQLに接続し、のオブジェクトTADOConnection
を使用してクライアントアプリケーションにデータを提供するサービスアプリケーションがあります。このサービスアプリケーションは、MSSQLを実行しているのと同じマシンにインストールされている可能性があり、サービスの前に開始される可能性があります。そのため、イベントでADOに接続できません。の場合にADOに接続しようとしましたが、別のスレッドで実行されているため、「CoInitializeが呼び出されていません」というメッセージが表示されました。次に、これを次のようにメインスレッドと同期させようとしました。Cromis.IPC
TIPCServer
MSSQL
OnServiceStart
OnExecuteRequest
TIPCServer
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以降)に指示する方法があれば、私の問題は解決されます。どんなヒントも本当にありがたいです。