Question

Je souhaiterais appeler SoX , une application de console open source, à partir d'un autre programme graphique Windows ( naturellement écrit à Delphes). Au lieu de traiter et de masquer la fenêtre de la console, je voudrais simplement convertir l’application en une DLL que je peux appeler à partir de mon application.

Avant de me lancer dans cette voie, je suis curieux de savoir combien de travail je devrais m'attendre à être? S'agit-il d'une entreprise majeure ou existe-t-il une solution simple? Je connais un certain C, mais je ne suis en aucun cas un expert.

Je ne m'attends pas à des détails spécifiques à SoX, mais à la conversion d'une application de console EXE en DLL en général. Si quelqu'un connaît bien SoX, c'est encore mieux.

Était-ce utile?

La solution

Pour le sujet spécifique de la transformation d'un exécutable de console en bibliothèque en modifiant le code source C, cela dépend de la manière dont l'application en ligne de commande est factorisée. Si elle est écrite de telle sorte que les E / S passent par un petit ensemble de fonctions ou même de meilleurs indicateurs de fonction, cela sera évidemment trivial.

Si tout est fait avec printf, scanf et amis, alors vous ferez probablement mieux de rechercher / créer un fichier d'inclusion que tous les fichiers sources incluent et d'ajouter une macro qui redirige les fonctions printf / scanf et amis vers vos propres fonctions. qui sont écrites de manière à pouvoir être implémentées par une DLL. Des éléments tels que printf peuvent être construits à partir de vsnprintf (utilisez la version n pour des raisons de sécurité), vous n'avez donc pas besoin de réimplémenter l'ensemble du sous-système d'E / S C RTL. Cependant, il n'y a pas de vsscanf, mais il existe des implémentations tierces sur le Web.

Si le code utilise fprintf, fscanf, etc. pour activer l'indirection indirecte entre les fichiers et la console, vous n’avez toujours pas de chance. La structure FILE est opaque et, contrairement aux fichiers texte Pascal, un pilote de fichier texte portable ne peut pas être implémenté. Cela pourrait être encore possible si vous spelunk dans votre C RTL spécifique, mais vous feriez mieux de suivre la route des macros et de réimplémenter votre propre type renommé FILE.

Enfin, le "popen ()" Cette approche est possible dans Delphi et plus facile dans Delphi 2009 avec les classes TTextReader et TTextWriter. Combinez ces éléments avec TFileStream enroulé autour des canaux et spécifiez des tubes pour l'entrée standard, la sortie standard et l'erreur standard dans le nouveau processus et STARTF_USESTDHANDLES, etc., et cela fonctionnera. Si vous ne souhaitez pas écrire vous-même, il existe également des équivalents / échantillons tiers sur le Web pour Delphi. En voici un.

Autres conseils

Sous Windows, il vous suffit d'appeler CreateProcess avec la commande SoX ligne. Je ne connais pas les liaisons Delphi pour Win32, mais j’ai fait la même chose à la fois en Win32 et en C #.

Et maintenant que vous savez que CreateProcess est ce que vous souhaitez appeler, une recherche Google sur la façon de le faire à partir de Delphi devrait vous fournir tout le code dont vous avez besoin.

Article de Delphi Corner - Utilisation de CreateProcess pour exécuter des programmes

Appel de CreateProcess () en toute simplicité

Vous n’avez peut-être même pas besoin de DLL, vous pouvez utiliser la fonction popen () pour exécuter une application console et collecter le texte de sortie.

Avertissement: Je ne connais rien à SoX. Il se peut que le code soit structuré de manière à simplifier les choses, ou que ce soit plus difficile. De toute façon, le processus est le même:

Vous souhaitez d’abord rechercher les fonctions dans l’application SoX que vous souhaitez appeler. Il est fort probable que l'application de la console dispose d'un code pour analyser la ligne de commande et appeler les fonctions appropriées. Alors, commencez par trouver les fonctions que vous souhaitez utiliser.

Ensuite, consultez les informations relatives à l’exportation de fonctions dans les DLL à partir de C sur ce site: Création de Utilisation de DLL

Créez ensuite un nouveau fichier de projet Makefile ou Visual Studio dont la cible est une DLL, puis ajoutez les fichiers source du programme SoX que vous avez modifiés pour être exportés.

Exécutez le processus, comme indiqué par Indiv, et capturez le résultat comme le montre Adam.

Toutefois, si vous souhaitez toujours effectuer la conversion de DLL, cela vous permettra de démarrer

  1. Configurez SOX pour Windows et compilez-le
  2. Créez un projet DLL vide à l'aide de votre outil C ++
  3. Ajouter les fichiers SOX au projet
  4. Ajouter une nouvelle fonction appelée DLLMain

    BOOL APIENTRY DllMain (HANDLE hModule,                    DWORD ul_reason_for_call,                    LPVOID) {return TRUE;}

  5. Ajoutez un fichier .DEF (utilisez le nom du projet comme nom de fichier) qui répertorie les exportations dans la DLL - Ajoutez-y le contenu suivant

    LIBRARY      "name.DLL" 
    

    EXPORTATIONS

    CallOldMain PRIVATE

  6. Renommez le principal de SOX en CallOldMain

  7. Ecrivez une fonction CUSTOM pour consigner l'erreur de sortie / retour, etc.

  8. Recherchez tous les printfs / cout dans l'application SOX et remplacez-le par les appels à votre fonction personnalisée ci-dessus

  9. Une fois la DLL compilée, vous pouvez maintenant appeler la fonction CallOldMain avec les mêmes paramètres que les programmes principaux de C attend. Vous pouvez modifier cette signature pour renvoyer les erreurs / la sortie ci-dessus.

Vous ne mentionnez pas votre chaîne d’outils, mais si vous configurez gcc sous Windows, vous pouvez utiliser la configuration normale, make; make install pour compiler simplement sox. Dans le processus, il créera un fichier DLL et l'application de la console. Ou bien, vous pouvez simplement spécifier la cible de fabrication pour créer uniquement la DLL. Ceci compilera une bibliothèque native Windows qui ne dépend que de la DLL d'exécution C, que vous pourrez utiliser dans votre propre application.

Vous pouvez exécuter une application console et capturer sa sortie à l'aide de canaux. Vous utilisez un côté du tuyau comme sortie standard pour CreateProcess et vous lisez de l'autre côté comme un fichier commun.

Vous pouvez voir un exemple de travail écrit en delphi ici: http: // delphi.about.com/cs/adptips2001/a/bltip0201_2.htm

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top