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

Langage Delphi Discussion :

[D6] Ajouter un paramètre dans une fonction d'une DLL


Sujet :

Langage Delphi

  1. #1
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 669
    Détails du profil
    Informations personnelles :
    Âge : 44
    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 669
    Points : 7 019
    Points
    7 019
    Par défaut [D6] Ajouter un paramètre dans une fonction d'une DLL
    Voici mon problème.

    J'avais une DLL, avec une fonction exporté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
       procedure InitColisageDLL(HandleApp: HWND; pSession: Pointer; const sCodeSociete, sCodeSite, sCodeAtelier, sUtilisateur: PChar; const bAdministrateur: LongBool);   stdcall;
     
    exports
       InitColisageDLL name 'InitColisageDLL';
    Fonction que j'appelais comme ça depuis un exe :
    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
    var
       InitColisageDLL: procedure(HandleApp: HWND; pSession: Pointer; const sCodeSociete, sCodeSite, sCodeAtelier, sUtilisateur: PChar; const bAdministrateur: LongBool);   stdcall;
    ...
          HandleDLLColisage := LoadLibrary('C:\DLL\Colisage.dll');
          if HandleDLLColisage = 0 then
             Application.MessageBox('.Erreur :  ...')
          else
          begin
             try
                @InitColisageDLL := GetProcAddress(HandleDLLColisage, 'InitColisageDLL');
                if @InitColisageDLL = nil then
                   Application.MessageBox(PChar('.Erreur :  ...')
                else
                begin
                   try
                      try
                         InitColisageDLL(Application.Handle, @Session, PChar('HE'), PChar('HM'), PChar('15'), PChar(szUtilisateur), bDroitAdmin);
    Jusque là, tout allait bien.

    Maintenant, je veux rajouter un paramètre.
    Dans ma DLL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    procedure InitColisageDLL(HandleApp: HWND; pSession: Pointer; const sCodeSociete, sCodeSite, sCodeAtelier, sCodeZone, sUtilisateur: PChar; const bAdministrateur: LongBool);   stdcall;
    Dans mon exe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    InitColisageDLL(Application.Handle, @Session, PChar('HE'), PChar('HM'), PChar('15'), PChar('1'), PChar(szUtilisateur), bDroitAdmin);
    Si j'essai de récupérer la valeur de ce nouveau paramètre (sCodeZone), j'ai une splendide erreur (violation d'accès), comme s'il n'existait pas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
          _szCodeSociete := sCodeSociete;
          _szCodeSite := sCodeSite;
          _szCodeAtelier := sCodeAtelier;
          _szCodeZone := sCodeZone;    <-- ERREUR ICI.
    Qu'est ce que j'ai oublié ?

    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)

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 553
    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 553
    Points : 25 133
    Points
    25 133
    Par défaut
    Juste une remarque, tu passes des PChar en const, ... euh cela donne donc un Pointeur sur PChar en réalité ... en fait qui est en const c'est le pointeur, par contre, le contenu de la mémoire doit être modifiable ...

    Tu devrais peut-être pour simplifier l'ajout de champ pour le futur, mettre tes données dans un "record", ...

    PS : Colisage, ah ça me rappelle, un vieux programme avec le doux nom de P5, dans un chaine logistique automatisée, j'étais un apprenti sur un projet vendu à 500KFrs alors que cela en valait bien 2MFrs ... j'aimerais bien en refaire ...
    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

  3. #3
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 669
    Détails du profil
    Informations personnelles :
    Âge : 44
    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 669
    Points : 7 019
    Points
    7 019
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Juste une remarque, tu passes des PChar en const, ... euh cela donne donc un Pointeur sur PChar en réalité ... en fait qui est en const c'est le pointeur, par contre, le contenu de la mémoire doit être modifiable ...
    Ah ok.
    Je mets des const par habitude. Bon, je l'ai enlevé (et l'erreur est toujours là).

    Citation Envoyé par ShaiLeTroll Voir le message
    Tu devrais peut-être pour simplifier l'ajout de champ pour le futur, mettre tes données dans un "record", ...
    Je l'ai déjà fait pour une autre DLL, où il y avait beaucoup de paramètres, mais ça complique pas mal (je trouve) le code.

    Pour un malheureux caractère en plus, j'aimerais bien faire simple.
    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)

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 553
    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 553
    Points : 25 133
    Points
    25 133
    Par défaut
    As-tu fait un "Tout Constuire" dans la DLL et dans l'Exe ?
    Lance-tu la DLL avec la bonne version de l'exe (voir répertoire de l'exe dans les options de projet, et celui configurer comme l'application Hote de la DLL...)
    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

  5. #5
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 669
    Détails du profil
    Informations personnelles :
    Âge : 44
    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 669
    Points : 7 019
    Points
    7 019
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    As-tu fait un "Tout Constuire" dans la DLL et dans l'Exe ?
    Oui. J'ai même supprimé la DLL et l'exe, pour être bien sûr de les voir ré-apparaître quand je re-compile.

    Citation Envoyé par ShaiLeTroll Voir le message
    Lance-tu la DLL avec la bonne version de l'exe (voir répertoire de l'exe dans les options de projet, et celui configurer comme l'application Hote de la DLL...)
    J'ai vérifié aussi.
    La DLL est bien reliée à son hôte, et elle va se placer dans le bon répertoire, dans lequel l'exe va la chercher dynamiquement avec un LoadLibrary.
    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)

  6. #6
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 669
    Détails du profil
    Informations personnelles :
    Âge : 44
    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 669
    Points : 7 019
    Points
    7 019
    Par défaut
    Pas d'autres idées ?

    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)

  7. #7
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 553
    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 553
    Points : 25 133
    Points
    25 133
    Par défaut
    Essaye de mettre '01' au lieu de '1', une éventuelle différence Char et String ?
    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

  8. #8
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 669
    Détails du profil
    Informations personnelles :
    Âge : 44
    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 669
    Points : 7 019
    Points
    7 019
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Essaye de mettre '01' au lieu de '1', une éventuelle différence Char et String ?
    Ca marche !!



    Cette astuce me serait pas venu à l'idée.



    Par contre, je ne comprend pas bien, pourquoi avec un char, ça ne fonctionne pas.
    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)

  9. #9
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 553
    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 553
    Points : 25 133
    Points
    25 133
    Par défaut
    le char c'est un seul octet en D6, alors qu'une chaine contenant un seul char, c'est deux octets, le char et le zéro terminal ... d'où la violation d'accès, il essaye de lire la chaine mais tombe sur de la mémoire non accessible

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var
      Mon1: string;
    begin
      Mon1 := '1';
      InitColisageDLL(Application.Handle, @Session, PChar('HE'), PChar('HM'), PChar('15'), PChar(Mon1), PChar(szUtilisateur), bDroitAdmin);
      ...
    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

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 34
    Dernier message: 27/08/2012, 13h01
  2. Réponses: 4
    Dernier message: 30/08/2007, 18h08
  3. Réponses: 3
    Dernier message: 29/04/2006, 13h02
  4. Réponses: 3
    Dernier message: 16/01/2006, 16h02
  5. Réponses: 4
    Dernier message: 17/03/2004, 17h24

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