2011-07-13 3 views
0

J'ai une API tierce. Il suffit de diffuser le média sur le port ip donné (lire le média depuis un périphérique de capture). Lorsque j'utilise cette API dans une application Windows Form, cela fonctionne. Mais quand j'appelle cette API dans une console ou un service Windows, cela ne donne pas d'erreur mais ne fonctionne pas [ne stream pas]: Il semble que cela ne prenne pas de données de flux depuis le périphérique. La seule différence entre une application est Windows Form Application, l'autre ne l'est pas .. Il n'y a vraiment aucune différence autre que celle-ci.Comportement étrange dans l'appel d'API de bibliothèque (NET et C++)

Quel genre de dépendance peut causer une telle chose? Une idée ?

PS: L'API est écrite en C++. J'utilise cette API dans NET (C++/CLI)

Exemple:

// 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(); 
} 

mais ....

// 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"); 

Répondre

0

Dans le cas d'une application d'interface utilisateur, il y a toujours une file d'attente de messages. Dans une application console, le n'est pas. Le logiciel tiers peut envoyer des messages à la file d'attente de messages qui n'est pas présente dans l'application console. Cela pourrait entraîner un comportement imprévisible du programme. Essayez d'appeler GetMessage() à partir de l'api de victoire avant le début de la communication.

+0

Existe-t-il un moyen simple de simuler l'émission de cette file d'attente de messages dans une console ou une application de service Windows? – Novalis

+0

Si l'API tierce fournit un point d'entrée de service que vous pouvez appeler lorsqu'un message est reçu, oui. Si la tierce partie crée une fenêtre cachée pour recevoir les messages, encore une fois: oui. Si l'API tierce fournit une fonction qui exécute une boucle de message avec fonction de rappel: oui. Voir la discussion sur la fonction Get api GetMessage() sur MSDN. –

+0

Merci. Va vérifier GetMessage() – Novalis

1

L'API tiers dépend probablement en interne sur l'envoi des événements Windows, ce qu'une application de console ne fera pas (par défaut, je crois que vous pouvez configurer la distribution d'événements dans une application de console).

+1

+1. En outre, si vous utilisez un service, vous avez des droits entièrement différents et vous exécutez dans une session utilisateur différente (session 0, en fait). Vous pouvez configurer des services à exécuter dans un contexte utilisateur spécifique pour résoudre la plupart de ces problèmes via le Panneau de configuration/Outils/Services d'administration. –

+0

@antlersoft Merci ... Il est peut-être .. Comment configurer la gestion des événements dans une application de console? Ou cela devrait être demandé comme une question différente? – Novalis

+0

@AresAvatar Merci. Mais mes services Windows sont OK. Il n'y a pas de problèmes de privilèges. – Novalis