2

私は VB.NET Windows サービスを開発しています。これは、BMS データベースで新しいアラームを頻繁にチェックし、オペレーターにリモートで警告するために電話をかけます。現在、.NET TAPI ラッパーと SAPI 5.3 相互運用アセンブリを使用しています。電話で話す手順は次のとおりです。

  1. TAPI インターフェイスを初期化します。
  2. オペレーターの番号に電話をかけます。
  3. 音声モデムの waveOut デバイス ID を取得します
  4. 音声出力をそのデバイス ID に設定します。
  5. SAPI に魔法をかけましょう。

コードを Windows コンソールまたはフォーム アプリケーションとしてコンパイルすると、これはすべて正常に機能しますが、Windows サービスとしてコンパイルして実行するとすぐに、ステップ 5 は発生しません。数字の監視も含め、他のすべてが機能します。Windows サービスはデスクトップと対話することになっていないことがわかったので、UI 要素やサウンドの再生などは禁止されていますが、Wave API を使用せずに開発できる代替手段を見つけるのに苦労しています合理的な時間枠で。何か案は?

4

2 に答える 2

0

通常、SAPI は何らかのメッセージ ポンプとウィンドウ ハンドルを必要としますが、Windows サービスには通常ありません。メッセージのみのウィンドウを作成して、メッセージをより安全な方法で処理することができます (サービス内の hwnd は粉砕攻撃にさらされることに注意してください。 SYSTEM または LocalMachine を使用して、攻撃対象領域を減らします)。また、( Application .Run または Application.DoEvents などを介して) メッセージを送り込む必要もあります。

于 2010-06-21T16:11:48.747 に答える
0

Windows サービス プロジェクトで Windows フォーム プロジェクトを参照し、OnStart サブでフォームを作成することになりました。

Protected Overrides Sub OnStart(ByVal args() As String)
        HelperThread = New Threading.Thread(AddressOf CreateMOWindow)
        HelperThread.TrySetApartmentState(Threading.ApartmentState.STA)
        HelperThread.Start()
End Sub 

Private Sub CreateMOWindow()
        Dim frm As New AlarmVoiceTest.AlarmVoiceTest
        Windows.Forms.Application.Run(frm)
End Sub

もちろん、フォームは表示されません (ただし、表示する必要はありません)。SAPI は期待どおりに機能しています。これはそれを達成するための最もクリーンな方法ではないと思いますが、ちょっと時間がありません:)

于 2010-06-25T10:36:23.427 に答える