IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 Delphi Discussion :

Logiciel Delphi lance programme C#


Sujet :

Delphi

  1. #1
    Membre émérite Avatar de shadowmoon
    Homme Profil pro
    Expert technique et fonctionnel .Net
    Inscrit en
    Mai 2005
    Messages
    1 066
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Expert technique et fonctionnel .Net
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 066
    Points : 2 645
    Points
    2 645
    Par défaut Logiciel Delphi lance programme C#
    bonjour

    J'expose mon problème ici car je suis un débutant en Delphi. J'apprends "sur le tas" depuis le mois de septembre.

    Le logiciel Delphi sur lequel je travaille instancie, via "CreateOleObject", une classe C# contenue dans une "solution" Visual Studio 2012.

    A la base, le programme C# (application console) est utilisable seul.

    La classe utilisée par le code Delphi a été créée spécifiquement pour cet usage. C'est un "point d'entrée" pour exécuter les mêmes fonctions que celles du "Main" dans le fichier "Program.cs".

    Le programme C# s’exécute sans erreur depuis Visual Studio ou via un script bat.

    Par contre, avec en le lançant depuis Delphi, j'ai un bug au sein d'une fonction typée "System.Web.Services.Protocols.SoapRpcMethodAttribute" avec des données en retour de type "System.Xml.Serialization.SoapElementAttribute".

    Cette fonction utilise un "this.invoke" pour créer une entité de type "object[]" avec les données, de types "string" et "int", passées en paramètres.

    La donnée renvoyée est au format "(int)object[0]".

    Toute aide pour résoudre ce souci est la bienvenue.

    N'hésitez à me demander si d'autres informations vous sont nécessaires.

    Cordialement
    il n'y a jamais eu qu'un seul chrétien et il est mort sur la croix Friedrich Nietzsche
    L'homme est un apprenti, la douleur est son maitre Alfred de Musset
    C'est avoir tort que d'avoir raison trop tôt Praefectus Praetario Hadrianus

    my best memories ever : 2008 London Circle Line "The Booze Train"

  2. #2
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 674
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 674
    Points : 5 259
    Points
    5 259
    Par défaut
    CreateOleObject est fait pour appeler une lirairie via COM.
    Pour lancer une simple application, un simple ShellExecute suffit.

    D'ailleurs, si ton fichier bat fonctionne, autant le lancer lui.

    Par contre, avec en le lançant depuis Delphi, j'ai un bug au sein d'une fonction typée "System.Web.Services.Protocols.SoapRpcMethodAttribute" avec des données en retour de type "System.Xml.Serialization.SoapElementAttribute".
    .

    Une méthode qui renvoie un attribut ?
    Tu es sûr ?

    La donnée renvoyée est au format "(int)object[0]".
    La donnée est donc de type entier.
    Un entier n'est pas un SoapElementAttribute.

    Tu as le code de cette fameuse méthode qui plante ?

  3. #3
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Comment exécuter une application extérieure ?

    Tu y trouveras des infos sur le ShellExecute mentionné par popo
    Cela correspond à peu de chose près à un lancement via le menu "Exécuter" que l'on trouve dans le menu démarrer, cela correspond à une ligne de commande simple tel que l'on peut la trouver dans un raccourci ou dans un Bat monoligne


    Si tu veux faire de l'Interopérabilité COM avec C# sache que chaque type échangé doivent être compatible COM, c'est à des types simples comme BYTE, SHORT, LONG INT, BSTR ou BSTR*, des Interface* en entrée ou Interface** en sortie ...
    C'est valable pour tout langage non Dot.NET, n'ayant pas accès au Garbage Collector
    Un bon moyen c'est le VBS, un script VB force à être bien cadré pour ses entrées sorties en COM (encore plus qu'en DELPHI)
    Pour ma part, j'ai fait l'inverse, objet COM en DELPHI, exemple écrit en VBS et utilisé en C#, PowerBuilder ... par des développeurs de sociétés tiers
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  4. #4
    Membre émérite Avatar de shadowmoon
    Homme Profil pro
    Expert technique et fonctionnel .Net
    Inscrit en
    Mai 2005
    Messages
    1 066
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Expert technique et fonctionnel .Net
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 066
    Points : 2 645
    Points
    2 645
    Par défaut
    Citation Envoyé par popo Voir le message
    Tu as le code de cette fameuse méthode qui plante ?
    Le voici

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
            [System.Web.Services.Protocols.SoapRpcMethodAttribute("urn:WSDialogIntf-IWSDialog#Name", RequestNamespace="urn:WSDialogIntf-IWSDialog", ResponseNamespace="urn:WSDialogIntf-IWSDialog")]
            [return: System.Xml.Serialization.SoapElementAttribute("return")]
            public int Name(parametres) 
            {
                object[] results = this.Invoke("Name", new object[] {valeurs_parametres});
                return ((int)(results[0]));
            }
    Citation Envoyé par popo Voir le message
    D'ailleurs, si ton fichier bat fonctionne, autant le lancer lui.
    Je l'ai juste créé pour mes tests.

    De ce que j'ai compris, au début le code C# devait être exécuté à part, mais suite aux demandes des clients, finalement, un écran d'interface a été ajouté dans le logiciel Delphi pour paramétrer, lancer ce traitement et afficher les résultats.

    Selon l'état de leurs Windows chez les clients, et le paramétrage effectué, le traitement va plus ou moins loin, mais il est toujours stoppé dès l’exécution de la première fonction similaire à celle mentionnée ci-dessus.

    Citation Envoyé par popo Voir le message
    Pour lancer une simple application, un simple ShellExecute suffit
    Merci pour cette piste, je vais étudier l'utilisation de cet outil.

    Cordialement

    [edit] 20/11 J'ai une petite question complémentaire, le programme C# retourne un booléen vrai/faux selon si le traitement a pu se terminer ou non. Comment puis-je récupérer cette donnée en utilisant ShellExecute ? [/edit]
    il n'y a jamais eu qu'un seul chrétien et il est mort sur la croix Friedrich Nietzsche
    L'homme est un apprenti, la douleur est son maitre Alfred de Musset
    C'est avoir tort que d'avoir raison trop tôt Praefectus Praetario Hadrianus

    my best memories ever : 2008 London Circle Line "The Booze Train"

  5. #5
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Utilise alors un CreateProcess et récupère le ExitCode
    Evidemment, tu dois modifier le programme C# pour qu'il écrit une valeur dedans

    Comme c'est un programme Console, tu peux aussi utiliser les Pipe
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  6. #6
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 674
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 674
    Points : 5 259
    Points
    5 259
    Par défaut
    Au passage, tu parle d'un bug mais tu ne décris ni le comportement attendu, ni le comportement que tu as...

    Merci pour le code.
    En le voyant, on s'aperçoit que la variable passée à la fonction n'est pas utilisée.
    C'est une autre variable (interne à la classe) qui est utilisée.
    Ton problème vient peut être de là.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    [System.Web.Services.Protocols.SoapRpcMethodAttribute("urn:WSDialogIntf-IWSDialog#Name", RequestNamespace="urn:WSDialogIntf-IWSDialog", ResponseNamespace="urn:WSDialogIntf-IWSDialog")]
            [return: System.Xml.Serialization.SoapElementAttribute("return")]
            public int Name(parametres) 
            {
                object[] results = this.Invoke("Name", new object[] {valeurs_parametres});
                return ((int)(results[0]));
            }

  7. #7
    Membre émérite Avatar de shadowmoon
    Homme Profil pro
    Expert technique et fonctionnel .Net
    Inscrit en
    Mai 2005
    Messages
    1 066
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Expert technique et fonctionnel .Net
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 066
    Points : 2 645
    Points
    2 645
    Par défaut
    Citation Envoyé par popo Voir le message
    Au passage, tu parle d'un bug mais tu ne décris ni le comportement attendu, ni le comportement que tu as...
    En fait, c'est le "this.invoke" mentionné précédemment qui plante, mais uniquement quand le programme C# est lancé depuis Delphi.

    Dans une console Windows, Visual Studio ou via un batch aucun souci, le traitement s'effectue dans son intégralité.

    Pour l'instant cette problématique est mise en suspens, j'ai d'autres taches "prioritaires" à traiter avant.
    il n'y a jamais eu qu'un seul chrétien et il est mort sur la croix Friedrich Nietzsche
    L'homme est un apprenti, la douleur est son maitre Alfred de Musset
    C'est avoir tort que d'avoir raison trop tôt Praefectus Praetario Hadrianus

    my best memories ever : 2008 London Circle Line "The Booze Train"

Discussions similaires

  1. [Delphi 7] Programmation événementielle
    Par alainvh dans le forum Delphi
    Réponses: 3
    Dernier message: 09/03/2007, 15h39
  2. Ouvrir un logiciel avec un programme
    Par liverbird dans le forum C++
    Réponses: 10
    Dernier message: 15/06/2006, 16h49
  3. Savoir si un logiciel est lancé
    Par LoicH dans le forum C++Builder
    Réponses: 2
    Dernier message: 17/12/2004, 23h24
  4. Réponses: 3
    Dernier message: 27/08/2003, 21h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo