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 :

c++ appelle une DLL Delphi: La mémoire ne peut être "written"


Sujet :

C++

  1. #1
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 187
    Par défaut c++ appelle une DLL Delphi: La mémoire ne peut être "written"
    Bonjour tout le monde,

    j'ai un programme C++ qui appelle une DLL écrite en delphi, quand j'essai d'executer mon prog, j'ai une erreur du type:

    ********************************************************
    L'instruction à "0x...." emploie l'adresse mémoire "0x.....". La mémoire ne peut être "written".

    Cliquez sur Ok pour terminer le programme.
    Cliquer sur Annuler pour deboguer le programme.
    *******************************************************

    La même DLL appelée depuis Delphi marche très bien, mais appelée depuis C++ ca crash...
    En plus, si je me met en mode debug en C++, au moment de l'appel de la dLL il me sort une erruer du genre:
    Unhandled excetpion in MonProg.exe (MaDll.dll): 0xC0000005: Access Violation.

    A noter j'utilise Visual C++ 6.0 et que ma dll écrite en delphi fait appel aussi à un exe delphi. Quelqu'un a déjà recontré ce type de blem.
    Merci d'avance

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    731
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 731
    Par défaut
    On peut avoir un bout de code ?
    Comment utilises-tu la dll ? En faisant un LoadLibrary ou en appelant les méthodes directement en linkant statiquement avec la lib ?

  3. #3
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 187
    Par défaut
    Citation Envoyé par ep31
    On peut avoir un bout de code ?
    Comment utilises-tu la dll ? En faisant un LoadLibrary ou en appelant les méthodes directement en linkant statiquement avec la lib ?
    le voila mon code c++, j'utilise un loadlibrary
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    #include "stdafx.h"
    #include "windows.h"
     
    int main(int argc, char* argv[])
    {
     
      typedef void (_stdcall *ProcDllPtr)(int ExportType, char* Listerefcon, 
    	                                  int DestinationType, bool MajStatuts,
    									  bool choixRepertoire, char* RepertoireCible,
    									  bool CreerUnitaire);
     
      HINSTANCE hInstLibrary = LoadLibrary("ED_DLL.dll");
      if (hInstLibrary == NULL)   {
          FreeLibrary(hInstLibrary);
          return 1;
       }
     
      ProcDllPtr ProcExportDll = (ProcDllPtr) GetProcAddress(hInstLibrary, "ProcExportDll");
     
      if (ProcExportDll == NULL) {
          FreeLibrary(hInstLibrary);
    	  return 2;
       }
     
      ProcExportDll(1, "4031589", 1, true, true, "G:\Nouveau dossier", false);
     
      return 0;
    }
    Je crois qu'il y a une certaine problématique lors de l'appel des fonctions avec des parametres de type string dans delphi, mais je ne crois pas que ca serai la cause de mon erreur!!!
    Merci de ta reponse rapide déjà

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    731
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 731
    Par défaut
    Est-ce que ca plante à la ligne suivante ou non ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ProcExportDll(1, "4031589", 1, true, true, "G:\Nouveau dossier", false);

  5. #5
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 187
    Par défaut
    c'est exactement lors de l'execution de cette ligne que ca plante

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    731
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 731
    Par défaut
    Ton cinquième paramètre est incorrect (il manque un \ pour ignorer le \):
    Essaie avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ProcExportDll(1, "4031589", 1, true, true, "G:\\Nouveau dossier", false);

  7. #7
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 187
    Par défaut
    Ca plante toujours
    Ta remarque était sa place, c'est pour ca qu'il me donnait un warning... Maintenant c'est réglé mais toujours les meme erreurs me sont renvoyées

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    731
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 731
    Par défaut
    Ce qui est sûr, c'est que c'est à l'intérieur de la méthode de ta DLL que ça plante. Donc si j'étais toi, je recompilerais la dll, je mettrais un DebugBreak() au début de ta fonction qui plante et je ferais du pas à pas.

  9. #9
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 187
    Par défaut
    Citation Envoyé par ep31
    Ce qui est sûr, c'est que c'est à l'intérieur de la méthode de ta DLL que ça plante. Donc si j'étais toi, je recompilerais la dll, je mettrais un DebugBreak() au début de ta fonction qui plante et je ferais du pas à pas.
    C'est ce que j'ai fait, ca plante juste apres le begin. Quand je pointe la sourie sur les différents paramètres de ma fonction dans la dll, tous mes parametres sont bien affecté, sauf les paramètres qui sont de type char* où il me dit "inacessible value", donc par exemple en pointant sur la variable repertoireCible je dois voir "G:\Nouveau dossier" alors que je ne vois inaccessible value et ca rentre meme pas dans le corps de la fonction

  10. #10
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Renseigne toi sur les types à utiliser pour interfacer C++ et Delphi. Par exemple, je ne suis pas convaincu que char* soit le bon type pour les chaînes de caractères (pas compatible avec les chaînes Delphi).

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    731
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 731
    Par défaut
    Essaie alors de déclarer tes deux chaines à l'extérieur de l'appel, du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    char listere[51];
    char rep[51];
    strcpy_s (listerer, sizeof(listere), "4031589");
    strcpy_s (rep, sizeof(rep), "G:\\Nouveau dossier");
    ProcExportDll(1, listere, 1, true, true, rep, false);
    A tout hasard, comment est compilé ton projet : en Unicode ou en MultiByte ?

  12. #12
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 187
    Par défaut
    c'est dans quelle librarie où ca existe strcpy_s STP!! j'arrive pas a le trouver

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    731
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 731
    Par défaut
    Utilise strcpy tout court alors et sans le second paramètre. strcpy_s est apparu avec la version 8 des MFC.
    Tu as regardé si tu compilais en Multibyte ou en Unicode ?

  14. #14
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 187
    Par défaut
    J'ai essayé avec la méthode des strcpy et j'ai toujours le même problème. Par contre, je ne sais pas ce que ça veux dire compiler en multibyte ou en Unicode, quoique j'aimerais bien le savoir.
    Enfin, dans le forum delphi, on m'a confirmé que le type String de delphi est tres déconseillé vu une mauvaise gestion de mémoire, ce qui veut dire que que l'erreur provient de l'adaptation des type entre delphi et C++, je dois alors juste ré-interfacer ma fonction dans la dll et ceci en utilisant le type Pchar au lieu de String et TStringList... j'espere que ça marchera
    Merci quand même

  15. #15
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 187
    Par défaut
    j'ai remplacé le type string de delphi par PChar mais j'ai toujours le même problème... donc ça vient pas de l'indataptation des types char entre c++ et delphi àmoins s'il fallait remplacer le type char* de C++ par un autre type!!!

  16. #16
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Je sais que lorsqu'on veut travailler avec VB, il faut utiliser des BSTR pour les chaînes. Peut-être que c'est la même chose pour Delphi.

    D'autre part il y a aussi peut-être un truc avec la convention d'appel.

    Il n'y a pas des tutoriels qui traitent ce genre de problematique ?

  17. #17
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 187
    Par défaut
    Merci de m'avoir remonté le moral ooof
    en fait, je ne crois pas que le problème est au niveau de la convention d'appel... je pense que c'est plutot un blem d'interfacer les fonctions en c++ et en delphi
    Sinon je ne connai pas de tutoriel preci qui traite ce genre de probleme, si quelqu'un le connait je suis preneur

  18. #18
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 187
    Par défaut
    Je n'ai plus de problème, les paramètres sont bien envoyés à la dll delphi. Il fallait comme je l'ai déjà dit éviter d'utiliser les types String et TStringList dans les dll delphi mais PChar est beaucoup mieux. Malgré ca, je vois que parfois les paramètres passé sont bizarres pour les chianes genre #!à:.... mais quand je recompile ça marche je ne sais pas c'est dû à quoi mais bon ca marche quand meme

Discussions similaires

  1. Comment appeler une dll VB6 sous delphi
    Par zanoubya dans le forum Débuter
    Réponses: 6
    Dernier message: 05/10/2009, 18h04
  2. Appel d'une DLL Delphi en C#
    Par joc02 dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 14/05/2009, 16h25
  3. Réponses: 5
    Dernier message: 08/08/2008, 14h48
  4. Réponses: 4
    Dernier message: 01/06/2006, 15h55

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