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

C# Discussion :

appeler en c# une fonction contenu la bibiotheque Dll developper en Delphi


Sujet :

C#

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2023
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2023
    Messages : 3
    Points : 1
    Points
    1
    Par défaut appeler en c# une fonction contenu la bibiotheque Dll developper en Delphi
    Bonjour
    Je suis entrain de developper une application d'édition de carte.
    J'ai déjà obtenu du fournisseur les fichiers Dll contenant les fonctions. Mais seulement lorsque j'appelle n'importe quelle fonction je reçois le message d'erreur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.BadImageFormatException: 'Tentative de chargement d’un programme de format incorrect. (0x8007000B)'
    Voici la definition d'une fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int __stdcall	TP_ReadGuestCard(char *card_snr,char *room_no, char *checkin_time, char *checkout_time);
    Voici comment j'appelle la fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
            [DllImport("madll.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Auto)]
            public static extern int ReadCard(string card_snr, string room_no, string checkin_time, string checkout_time);
            private void button1_Click(object sender, EventArgs e)
            {
                string card_snr;
                string room_no;
                string checkin_time;
                string checkout_time;
                string result;
                result = TP_ReadGuestCard(card_snr, room_no, checkin_time, checkout_time).ToString();
           }
    Je voudrais préciser que les dll on été developpé en Delphi.

    Merci pour pour votre aide.

  2. #2
    Expert confirmé
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7
    Par défaut
    Bonjour ,

    As tu essayé d ajouter le champ Entrypoint="NOM_DE_LA_FONCTION" dans ton dllimportAttribute ??

    Le nom de la fonction (entrypoint) pourrait être :
    TP_ReadGuestCard

    Ou

    ReadGuestCard


    Ou autre chose....


    Tu pourrais aussi vérifier que ton programme cible l architecture processeur x86 ?
    On ne sait pas si la dll (en delphi) a été compilée pour du x64 ou du x86.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2023
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2023
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Bonsoir et merci vraiment pour votre réponse
    Après avoir ajouté Entrypoint j'ai toujours la même erreur.
    Et aussi l'application démo du fournisseur fonctionne sous x64 donc je pense que le fichier peut être utilisé.
    Cordialement

  4. #4
    Expert confirmé
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7
    Par défaut
    Bonjour,

    Je me posais une autre question le type char* dans les arguments de la fonction en delphi ne doit il pas être typé en Stringbuilder en C# plutôt que String ???
    En plus de cette modification il faudrait modifier le charset de AUTO en ANSI dans les champs de ton dllimportAttribute.

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2023
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2023
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Merci encore pour vos réponses
    J'ai modifié le Charset en ANSI et converti toutes les variables de la fonction en StringBuilder et après les avoir initialisées, je reçois encore la même erreur.

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    995
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 995
    Points : 1 449
    Points
    1 449
    Par défaut
    Sinon la fonction renvoie un entier et pas une chaine, donc Result devrait un entier, non ?
    et pourquoi ne pas utiliser des tableaux de char pour les paramètres, c'est, il me semble, ce qui se rapprocherait le plus des char* ?

    Sinon EntryPoint dot être suivi du vrai nom de la fonction (dans la dll) mais quand tu l'appelles dans le code, il faut utiliser le nom que tu lui as donné.

    Remet le dernier code testé pour voir comment les modifications ont été apportées.

  7. #7
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 753
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 753
    Points : 10 687
    Points
    10 687
    Billets dans le blog
    21
    Par défaut
    Bonjour,

    Je pense que le problème pour l'instant n'est pas la définition du point d'entrée (qui aurait plutôt tendance à provoquer un crash pur et dur, et pas une exception).

    Les points à vérifier :
    - en fonction de l'architecture de la DLL (32 ou 64 bits), il faut forcer la compilation de ton projet pour utiliser la même architecture.
    - es-tu sous Windows ? Le chargement des DLL ne fonctionne que sous Windows. Sous linux, c'est des .so (même si on précise .dll dans les attributs !!)
    - la DLL est-elle bien intègre ? Un checksum pour la vérifier éventuellement ?

    Je commencerai par vérifier le premier point, qui est la cause majeure de ce genre d'erreur.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

Discussions similaires

  1. [POO] appeler une fonction contenue dans une autre fenetre
    Par pepper18 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 06/09/2008, 03h27
  2. appel d'une fonction contenu dans un fichier js
    Par geoman dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 24/08/2007, 08h51
  3. Appel automatique d'une fonction au lancement
    Par greg2 dans le forum C++
    Réponses: 3
    Dernier message: 10/07/2007, 10h04
  4. Réponses: 8
    Dernier message: 02/02/2006, 19h13
  5. Réponses: 4
    Dernier message: 01/07/2004, 20h15

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