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 :

DLL XE2 utilisée par un programme Delphi 5


Sujet :

Langage Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 530
    Par défaut DLL XE2 utilisée par un programme Delphi 5
    Bonjour

    J'ai créé une fois une dll avec XE2 et je l'ai utilisée à partir d'un soft écrit en D2. Ça fonctionnait très bien mais la seule fonction utilisée prenait un entier comme paramètre. Là, je fais la même chose (dll XE2 mais utilisée avec code Delphi 5) avec des paramètres de type chaînes. Mon programme de test sous XE2 fonctionne parfaitement. Le même code utilisé sous D5 provoque une violation d'accès que je n'arrive pas à comprendre. J'utilise Sharemem des 2 cotés et mes paramètres sont de type PAnsiString.

    Est-ce qu'il faut que je pense à autre chose pour que ça soit compatible ?

    Papy !

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

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    pourquoi des PAnsiString ? tant qu'à utiliser ShareMem autant utiliser des AnsiString.

    Cependant, en matière de DLL je préfère encore utiliser des types indépendant de la gestion mémoire, PAnsiChar dans ton cas, sans ShareMem.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Membre Expert

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 530
    Par défaut
    Ça va effectivement beaucoup mieux comme ça.

    Merci Paul

  4. #4
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 096
    Par défaut
    Euh, le AnsiString D5 ne contient pas les deux 1er membre du StrRec stocké avant le Str[1]

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
          unsigned short codePage; // 2009+
          unsigned short elemSize; // 2009+
          int refCnt;
          int length;
    Cela pourrait peut-être fonctionner en lecture seule, mais si il y a modification, il existe un risque que la taille allouée soit mauvaise et donc VA

    Si tu utilises Sharemem\BORLNDMM.DLL en D5 et XE2, est-ce que cela prive XE2 de son nouveau gestionnaire de mémoire (100 fois plus rapide que celui de D5 ?)

    Comme Paul Toth, je préfère aussi me passer de ShareMem !
    le type BSTR géré par des WideString évite pas mal de soucis aussi, on peut allouer d'un côté et libérer de l'autre contrairement avec GetMem sur du PAnsiChar
    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
    Membre Expert

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 530
    Par défaut
    Je ne fais aucune modification. La DLL récupère des informations pour envoyer un email (Expéditeur, Sujet, Corps, etc.). Les infos sont ensuite juste utilisées pour renseigner les propriétés du composant Ip*Works d'envoi de mail.

  6. #6
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 096
    Par défaut
    Tente d'ajouter const à tes paramètres de DLL si ce n'est pas déjà fait !
    si cela fonctionne, cela ne laissera pas d’ambiguïté sur l'utilisation des chaines
    si cela ne fonctionne pas (vu que c'est proche des PAnsiString), oublie le mot clé mais ajoute un petit commentaire !

    D'ailleurs, si pur lecture seule, même pas besoin de ShareMem avec des AnsiString : DLL String Pourquoi ça marche sans BORLNDMM.DLL
    C'est moche comme technique comme le soulignait déjà Paul Toth et c'est en plus très instructif

    Ou même des ShortString cela évite ShareMem et le déploiement de BORLNDMM.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

  7. #7
    Membre Expert

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 530
    Par défaut
    Je viens de parcourir la discussion que tu as indiquée dans ta réponse. Très intéressant. A tout hasard, et même si c'est un peu tard, voici un extrait de l'aide de Delphi XE3:

    System.SysUtils.StrPLCopy

    Delphi

    function StrPLCopy(Dest: PAnsiChar; const Source: AnsiString; MaxLen: Cardinal): PAnsiChar;
    function StrPLCopy(Dest: PWideChar; const Source: UnicodeString; MaxLen: Cardinal): PWideChar;
    Ceci pour ton ancienne question sur les widestring

    Sinon, pour passer à ma dll la liste des destinataires de l'email, j'utilisais un paramètre de type array of PAnsiChar mais j'ai l'impression que ça a mis un peu le bazar (en tous cas, ma gestion sans doute un peu foireuse, je l'avoue). Du coup, j'ai remplacé par un PAnsiChar qui représente les adresses séparées par des virgules et je redécoupe ça dans ma dll.

    Le tableau dynamique de PAnsiChar était-il une bonne solution à ton avis ?

    Je suis passé de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    procedure EnvoyerEmail(
      Expediteur,
      Sujet,
      Corps            : PAnsiChar;
      Destinataires : array of PAnsiChar;
      Fichiers         : array of PAnsiChar;
      Port              : Integer;
      ServeurMail,
      Utilisateur,
      MotDePasse    : PAnsiChar); stdcall;
    à

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    procedure EnvoyerEmail(
      Expediteur,
      Sujet,
      Corps         : PAnsiChar;
      Destinataires : PAnsiChar;
      Fichiers      : PAnsiChar;
      Port          : Integer;
      ServeurMail,
      Utilisateur,
      MotDePasse    : PAnsiChar); stdcall;

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

Discussions similaires

  1. Mesure des ressources utilisées par un programme
    Par sunmat dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 27/10/2008, 12h32
  2. Liste des ressources utilisées par un programme
    Par QAYS dans le forum Windows XP
    Réponses: 1
    Dernier message: 03/05/2007, 20h40
  3. Trouver le nombre de handle utiliser par un programme
    Par chuckboy dans le forum Windows
    Réponses: 1
    Dernier message: 19/12/2005, 23h38
  4. Lister les classes utilisées par un programme
    Par seawolfm dans le forum Général Java
    Réponses: 3
    Dernier message: 11/10/2005, 13h18
  5. Dll en c++ dans un programme delphi
    Par wikers dans le forum Langage
    Réponses: 2
    Dernier message: 04/08/2005, 15h39

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