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 :

Dangerosité de ShareMem avec exe non ShareMem


Sujet :

Langage Delphi

  1. #1
    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 Dangerosité de ShareMem avec exe non ShareMem
    Salut a tous,
    étant en migration d'une application Delphi (7) vers C++ & Qt, j'arrive sur ce sujet, et je préfère m'assurer du comportement qu'aura mon application.
    D'abord, ma question : Est il dangereux d'utiliser une dll qui uses ShareMem dans une application qui ne le uses pas, si on n'utilise pas de fonctions avec des String ?

    Le contexte est le suivant :
    j'ai une application principale, et plusieurs autres qui doivent interagir avec cette première. Toutes ces applications sont actuellement en Delphi 7.
    Pour avoir cette interaction, l'app principale fournit une dll, qui utilise ShareMem (de même que tous les app satellites).
    L'une de ces app passant en C++ & Qt, il faut que je fasse quelques modifications pour que la dll soit compatible avec tout le monde (NB : les applications peuvent évoluer sur une machine indépendamment les unes des autres).
    Mon idée est de rajouter des fonctions utilisant des PChar, en plus des String. De cette manière, tout la monde continue de fonctionner avec cette nouvelle dll.
    Par exemple, ma dll ressemblera à ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    procedure SetNumero(ANum: integer); stdcall;//inchangé compatible avec les 2
    procedure SetAdresse(AAdresse: string); stdcall;//pour les anciennes apps
    procedure SetAdressePChar(AAdresse: PChar); stdcall;//pour la nouvelle app
    Étant donné que les anciennes apps utilisent toujours les strings, ma dll doit uses-er SharMem, mais mon app C++ ne le uses-era forcement pas. Y a t'il un risque à cela ? C'est dur d'en être sûr en testant car les erreurs liées a SharMem n'apparaissent pas à tous les coups.

    Merci de votre éclairage.

  2. #2
    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
    si l'API n'utilise plus que des PChar, ShareMem n'est plus nécessaire.

    pour faire simple ShareMem permet à l'EXE de libérer une zone mémoire allouée par la DLL et vice et versa.

    cela concerne donc GetMem/FreeMem, SetLength, et donc aussi les strings.

    si la DLL ne cherche pas à libérer une zone mémoire de l'EXE ou qu'elle est responsable de la libération de tout ce qu'elle alloue, tu supprimes ShareMem.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    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
    Je ne peux pas supprimer ShareMem car j'ai des fonctions de compatibilité qui utilisent toujours des string. Mais si mon exe n'utilise que les fonctions PChar (en paramètre et en retour), je peux laisser ShareMem dans la dll sans risque ?
    Ce que je me dis, c'est que l'exe doit initialiser le gestionnaire de mémoire de borlandmm.dll, or si il n'utilise pas ShareMem, le gestionnaire n'est pas dans un état viable, et les potentielle allocations de string, même simplement dans le corps d'une fonction de la dll, peut causer un problème.
    Citation Envoyé par Paul TOTH Voir le message
    si la DLL ne cherche pas à libérer une zone mémoire de l'EXE ou qu'elle est responsable de la libération de tout ce qu'elle alloue, tu supprimes ShareMem.
    Et si je suis dans ce cas, mais que je ne supprime pas SharMem, pas de problème ?

  4. #4
    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
    si je comprend bien tu as un exe sans sharemem qui utilise une DLL qui l'exploite...ben oui tant que la DLL ne récupère pas un type dynamique de l'exe elle n'a aucune raison de chercher à la libérer.

    attention cependant aux déclarations, tu peux très bien avoir cette déclaration dans la DLL

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    procedure test(p: PChar);
    et celle-ci dans l'exe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    procedure test(const s: string); external 'dll';
    dans les deux cas c'est un pointeur sur le premier caractère d'une chaîne qui se termine (aussi) par #0

    vu que la DLL pense que c'est un simple PChar elle n'en fera rien de spéciale, et vu que l'exe déclare la string en "const", il ne s'attends pas à ce qu'elle soit modifiée par la DLL, donc tout va bien

    par contre si tu déclares que c'est un string dans la DLL elle peut aller voir du côté des offsets négatifs et foutre le zone.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  5. #5
    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
    Ok super.
    Merci pour la réponse Paul.

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 31/01/2017, 09h16
  2. Fonction "system" et lancer d'un exe non compatible avec l'OS
    Par Captain'Flam dans le forum Débuter
    Réponses: 3
    Dernier message: 26/10/2016, 20h41
  3. [WinForms] ComboBox avec valeur non désirée
    Par Ditch dans le forum Général Dotnet
    Réponses: 14
    Dernier message: 11/04/2006, 16h52
  4. Problème de mutex avec Waitforsingleobject non-bloquant
    Par rvzip64 dans le forum API, COM et SDKs
    Réponses: 6
    Dernier message: 03/11/2005, 11h02
  5. Fichier texte avec codage non standard
    Par giloutho dans le forum Langage
    Réponses: 4
    Dernier message: 15/07/2005, 19h31

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