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

API, COM et SDKs Delphi Discussion :

Erreur lors d'appel fonction DLL


Sujet :

API, COM et SDKs Delphi

  1. #1
    Candidat au Club
    Homme Profil pro
    Responsable sécurité
    Inscrit en
    Septembre 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Responsable sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2014
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Erreur lors d'appel fonction DLL
    Bonjour,

    J'ai besoin d'utiliser une DLL écrite en C++.

    Voici la fonction comme déclarée en c++
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //Get version
    	void Version(char *version,int len);
    Mon appel de fonction en Delphi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    procedure TForm1.Appel_fonction_dllClick(Sender: TObject);
    var HandleDLL : THandle;
        Version : procedure (var Version_TXT : pAnsiChar;longueur : integer); stdcall;
        Version_TXT : pAnsiChar;
        longueur : integer;
    begin
      Version := nil;
      HandleDLL := LoadLibrary(pWideChar('D:\BAPSI source BOSCH\BAPSI\BAPSI\components\4.01.012\dll\BAPSIDLL.dll'));
      if HandleDLL = 0 Then Exit;
      Version := GetProcAddress (HandleDLL, pAnsiChar('?Version@CBAPSIDLL@@QAEXPADH@Z'));
      if Assigned(Version) then
        begin
        ShowMessage('Fonctionne');
        Version(Version_TXT,longueur);
        Edit4.Text := Version_TXT;
        end;
    end;
    L'assignation semble fonctionner comme l’atteste le message 'fonctionne' mais j'ai ensuite lors de l'utilisation de la fonction un message d'erreur eAccessViolation.

    J'ai essayé de l'appeler avec la convention stdcall avec le même résultat.

    Merci de votre aide.

  2. #2
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 288
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 288
    Points : 1 936
    Points
    1 936
    Par défaut
    Version_TXT n'est pas initialisé. (avec un StrAlloc(50); par exemple)
    Delphi 7/XE2/XE3
    C#
    Oracle 9i à 12c
    SQL Server 2008 à 2014

  3. #3
    Candidat au Club
    Homme Profil pro
    Responsable sécurité
    Inscrit en
    Septembre 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Responsable sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2014
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    En effet je n'ai plus de message d'erreur.

    Malheureusement je n'ai pas non plus de retour escompté.

    Cette fonction doit me renvoyer la version de la DLL et là chaine est vide et la longueur à 0.

    J'ai le même problème de eAccessViolation sur des procédure utilisant des integer.

    Il faut aussi les réserver en mémoire ? Si oui comment ?

  4. #4
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 664
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 664
    Points : 6 961
    Points
    6 961
    Par défaut
    Citation Envoyé par Sjeuil Voir le message
    Version := GetProcAddress (HandleDLL, pAnsiChar('?Version@CBAPSIDLL@@QAEXPADH@Z'));
    Je ne comprend pas cette syntaxe : '?Version@CBAPSIDLL@@QAEXPADH@Z'
    Je n'ai jamais utilisé ça. Ça veut dire quoi ?
    Moi, d'habitude, je mets juste la nom de la procédure / fonction.
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.1 Entreprise
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.4)

  5. #5
    Candidat au Club
    Homme Profil pro
    Responsable sécurité
    Inscrit en
    Septembre 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Responsable sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2014
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    C'est le nom 'habillé' par le compilateur C et qui ressort lorsque l'on fait un tdump -ee sur la DLL.

  6. #6
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 683
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 683
    Points : 13 092
    Points
    13 092
    Par défaut
    Le nom de la procédure est Version et rien d'autre.
    Longueur doit certainement être initialisé à la longueur de la chaîne allouée.
    A voir ensuite si cette fonction renvoie de l'ANSI ou de l'Unicode.

  7. #7
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    char *version -> var PAnsiChar
    je crois qu'il y a une erreur à ce niveau, il me semble que ca devrait plutot etre un PAnsiChar pas en var
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Version : procedure (Version_TXT : pAnsiChar;longueur : integer); stdcall;

  8. #8
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 385
    Points : 2 999
    Points
    2 999
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    ...
    Longueur doit certainement être initialisé à la longueur de la chaîne allouée.
    ...
    Je n'ai aucune notion de C mais si l'* devant le premier paramètre correspond au var de Delphi, il semble évidemment que ça vienne de là.

  9. #9
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void Version(char *version,int len);
    procédure "Version" premier paramètre un pointer sur un char (PChar), second paramètre en entier (Integer).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    procedure Version(version: PChar; len: Integer);
    il est fort à parier que version doit être alloué et len en donne la longueur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    var
      ver: array[0..1023] of Char;
    begin
      Version(ver, SizeOf(ver));
    end;
    reste à savoir la convention d'appel utilisée stdcall ou cdecl par exemple.

    ensuite, ce n'est pas une simple fonction mais le membre d'une classe objet C++ ! Et là c'est pas la même chose !

    Notez au passage que dans le lien, les développeurs C++ eux-mêmes ne trouve pas simple son utilisation ^^
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

Discussions similaires

  1. Erreur Thread sur Appel dans DLL
    Par Danyel dans le forum VB.NET
    Réponses: 10
    Dernier message: 27/10/2008, 23h57
  2. Pb syntaxe appel fonction DLL
    Par kimlee dans le forum C++
    Réponses: 4
    Dernier message: 04/10/2007, 15h05
  3. Réponses: 6
    Dernier message: 28/06/2006, 15h01
  4. Appels fonctions DLL
    Par Micka91 dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 17/02/2004, 17h32

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