2012-12-24 49 views
2

我正在寫一個應用程序修改其他應用程序的數量和使用CoreAudioApi DLL這樣做。以下代碼塊在主線程中完美工作,但在單獨的線程中調用時,將引發InvalidCastException。如果這只是兩個線程嘗試訪問相同資源的問題,我會投入互斥鎖,但似乎並非如此。任何想法可能是什麼問題?我很難成爲一名新的C#程序員。我在其中提到只有主線程才能訪問COM對象(如CoreAudioApi)的其他問題時,我需要向主線程發送某種消息。如果這是正確的,那麼做到這一點的最好方法是什麼?CoreAudioApi與線程 - InvalidCastException的

異常(if語句出現在第一Math.abs):

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. 

回答

2

你的錯誤消息,講述與IMMDevice一些操作過程中鑄造的錯誤。
this規範,IMMDevice只有4種方法:

  • Activate
  • OpenPropertyStore
  • GetId
  • GetState

您所提供的代碼有沒有提到的這些方法,所以無論你誤解你的錯誤發生在哪裏,或者這是內部錯誤引發到您的應用程序。

我覺得這是從您的設備獲取量時發生內部錯誤。

如果此錯誤發生在 sASC.SimpleAudioVolume.MasterVolumedefaultDevice.AudioEndpointVolume.MasterVolumeLevelScalar中,則由於代碼運行到後臺模式而導致此錯誤。否則,請爲您的異常添加一些代碼和堆棧跟蹤。

錯誤代碼爲E_NOINTERFACE可能發生在設備的Activate方法中。因此,您需要將此方法調用到主線程中以激活設備,然後嘗試將其用於背景模式。無法提供任何示例代碼,對不起。

+1

是的,只有在主線程中使用'IMMDevice'固定的問題;謝謝。我最終使用了一個'AutoResetEvent'來確定何時我的衍生線程完成其執行,以便我可以獲取必要的返回值並處理主線程中的所有內容。 – Ben