2

別のアプリケーションのボリュームを変更するアプリケーションを作成しており、そのためにCoreAudioApidll を使用しています。次のコード ブロックはメイン スレッドで完全に機能しますが、別のスレッドで呼び出されると anInvalidCastExceptionが発生します。これが 2 つのスレッドが同じリソースにアクセスしようとしているだけの問題である場合に備えて、Mutex を投入しましたが、そうではないようです。問題が何であるかについてのアイデアはありますか?私は新しい C# プログラマーとして困惑しています。メインスレッドのみがCoreAudioApiなどのCOMオブジェクトにアクセスできることが示唆されている他の質問を読んだので、メインスレッドに何らかのメッセージを送信する必要があります。これが正しい場合、これを行う最善の方法は何ですか?

例外 (最初の Math.abs if ステートメントで発生):

Unable to cast COM object of type 'System.__ComObject' to interface type 'CoreAudioApi.Interfaces.IMMDevice'. This operation failed because the QueryInterface call on the COM component for the interface with IID '{D666063F-1587-4E43-81F1-B948E807363F}' failed due to the following error: No such interface supported (Exception from HRESULT: 0x80004002 (E_NOINTERFACE)).

コード:

muteSoundMutex.WaitOne();
AudioSessionControl sASC = sInfo.getSAudioSession();
if (Math.Abs(sASC.SimpleAudioVolume.MasterVolume -
      (0.05f / defaultDevice.AudioEndpointVolume.MasterVolumeLevelScalar)) < 0.0001 
    && savedVol > 0)
{
   ... // other code here. all mutexes are released correctly.
4

2 に答える 2

2

エラーメッセージは、 を使用した操作中にキャストエラーが発生したことを示していIMMDeviceます。この仕様に
よると、メソッドは 4 つしかありません。IMMDevice

  • Activate
  • OpenPropertyStore
  • GetId
  • GetState

あなたが提供したコードにはこれらのメソッドについての言及がないため、エラーが発生した場所を誤解しているか、これはアプリケーションに発生した内部エラーです。

これは、デバイスからボリュームを取得する際の内部エラーだと思います。

このエラーがsASC.SimpleAudioVolume.MasterVolumeまたはで発生した場合defaultDevice.AudioEndpointVolume.MasterVolumeLevelScalar、このエラーはコードがバックグラウンド モードで実行されているためです。それ以外の場合は、例外のコードとスタック トレースを追加してください。

デバイスのメソッドE_NOINTERFACE中にエラー コードのエラーが発生する場合があります。Activateしたがって、このメソッドをメイン スレッドで呼び出してデバイスをアクティブにする必要があります。その後、バックグラウンド モードで使用してみてください。サンプル コードを提供できません。申し訳ありません。

于 2012-12-25T10:49:44.520 に答える