2011-07-13 37 views
0

我有一個pary API。它只是將媒體流式傳輸到給定的IP端口(從捕獲設備讀取媒體)。Library API調用中的奇怪行爲(NET和C++)

當我在Windows窗體應用程序中使用該API時,它可以工作。但是,當我在控制檯或Windows服務中調用此API時,它不會給出任何錯誤,但不起作用[不流]:它似乎不會從設備接收流數據。

唯一的區別是One Applications是Windows窗體應用程序,另一個不是.. 除此之外確實沒有什麼區別。

什麼樣的依賴可能會導致這樣的事情?任何想法 ?

PS:API是用C++編寫的。我用網,API(C++/CLI)

例如:

// Works in Windows Form Application 

System::Void startButton_Click(System::Object^ sender, System::EventArgs^ e) 
{ 

    MyAPI->Start(); 
} 
System::Void stopButton_Click(System::Object^ sender, System::EventArgs^ e) 
{ 
    MyAPI->Stop(); 
} 

但是....

// Not Work In Console or Windows Service 

MyAPI->Start(); 

Console::WriteLine("Streaming started.Press enter to exit"); 
Console::Read(); 

MyAPI->Stop(); 

Console::WriteLine("Streaming stopped"); 

回答

0

如果是UI應用程序,總會有一個消息隊列。在控制檯應用程序中,不是。第三方軟件可能會將消息發佈到控制檯應用程序中不存在的消息隊列中。這樣做可能會導致不可預知的程序行爲。嘗試在通信開始之前從win api調用GetMessage()。

+0

有沒有簡單的方法來模擬 - 將消息隊列發送到控制檯或Windows服務應用程序? – Novalis

+0

如果第三方api提供一個服務入口點,您可以在收到消息時進行調用,是的。如果第三方創建一個隱藏窗口來接收消息,那麼:是的。如果第三方API提供了一個運行帶回調設施的消息循環的函數:是的。查看MSDN上關於GetMessage()win api函數的謬誤。 –

+0

謝謝。將檢查GetMessage() – Novalis

1

第三方API可能內部取決於Windows事件調度,控制檯應用程序不會這樣做(默認情況下,我相信您可以在控制檯應用程序中設置事件分派)。

+1

+1。此外,如果您作爲服務運行,則您擁有完全不同的權限,並且運行在不同的用戶會話中(實際上是會話0)。您可以將服務設置爲在特定用戶環境下運行,以通過控制面板/管理工具/服務修復大部分這些問題。 –

+0

@antlersoft謝謝......它可能是..如何在控制檯應用程序中設置事件分派?或者這應該作爲一個不同的問題被問到? – Novalis

+0

@AresAvatar謝謝。但我的Windows服務是確定的。沒有特權問題。 – Novalis