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

Delphi Discussion :

Adaptation de type C++ et delphi (Pchar et char*)


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 187
    Par défaut Adaptation de type C++ et delphi (Pchar et char*)
    Bonjour Tous le monde:

    En fait je suis en train de developpez une DLL en delphi et je veux utiliser des variables dans les fonctions qui sont de types string, du coup je devais declarer Sharemem en premier dans la clause uses dans le code de la DLL... En fait tout le monde me déconseille d'utiliser String mais d'utiliser Pchar. Le probleme c'est que je dois aussi utiliser des TStringList dans les fonctions implementé dans ma DLL comment je fait alors pour remplacer TStringList dans la DLL..

    J'ai aussi une autre petite question est ce que je peux trouver en delphi un type liste d'entier, car tous les elets de ma TStringList que j'utilise dans ma DLL je les convertis en entier vu que j'ai besoin d'une liste d'entier..
    Merci d'avance les gas

  2. #2
    Membre Expert Avatar de philnext
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 553
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 553
    Par défaut
    Pour passer une tstringList tu utilise sa propriété text qui est une string que tu 'cast' en Pchar.
    Dans ta dll tu fais l'inverse.

  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 philnext
    Pour passer une tstringList tu utilise sa propriété text qui est une string que tu 'cast' en Pchar.
    Dans ta dll tu fais l'inverse.
    Peux tu m'expliquer sur un exemple STP car je ne suis que débutant en delphi. Merci d'avance.

  4. #4
    Membre émérite
    Avatar de CapJack
    Homme Profil pro
    Prof, développeur amateur vaguement éclairé...
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Prof, développeur amateur vaguement éclairé...
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Par défaut
    bouzaidi, regarde comment je fais dans le code source que je t'ai donné par ailleurs (au fait, merci pour les remerciements en mp ).

    Si SL est un TStringList, la propriété SL.Text contient le texte formaté comme le serait un fichier texte (avec des séparations CR/LF = #13#10 entre les lignes).

    On convertit l'intégralité du contenu du TStringlist en PChar avec le transtypage PChar(SL.Text). On obtient alors un PChar où toutes les chaînes du tableau sont à la suite, séparées par des séquence CR/LF.

    A l'inverse, un tel PChar P se récupère en TStringList par SL.Text := string(P). Pas plus difficile.

  5. #5
    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 CapJack
    bouzaidi, regarde comment je fais dans le code source que je t'ai donné par ailleurs (au fait, merci pour les remerciements en mp ).

    Si SL est un TStringList, la propriété SL.Text contient le texte formaté comme le serait un fichier texte (avec des séparations CR/LF = #13#10 entre les lignes).

    On convertit l'intégralité du contenu du TStringlist en PChar avec le transtypage PChar(SL.Text). On obtient alors un PChar où toutes les chaînes du tableau sont à la suite, séparées par des séquence CR/LF.

    A l'inverse, un tel PChar P se récupère en TStringList par SL.Text := string(P). Pas plus difficile.
    Merci bocou... c'était très clair

  6. #6
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Par défaut
    Salut

    Je dis peut-être un bêtise mais si tu passes directement la TStringList en paramètre (son pointeur en fait) ça ne pose pas de problème As-tu essayé?
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  7. #7
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 187
    Par défaut Adaptation de type C++ et delphi (Pchar et char*)
    Bonjour,
    J'ai une dll écrite en delphi que j'appelle depuis un programme C++, mon problème c'est que je dois interfacer la fonction de la dll appelée par c++ pour que ça devient adapté avec les types de delphi...
    Bref voila l'entête de la fonction dans C++ et dans La dLL:
    code C++
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      typedef void (_stdcall *ProcDllPtr)(int ExportType, char* Listerefcon, 
                                          int DestinationType, bool MajStatuts,
                                          bool choixRepertoire, char* RepertoireCible,
                                          bool CreerUnitaire);
    //et lors de l'appel je teste comme suit:
     ProcExportDll(1, "4031589", 1, true, true, "G:\\Nouveau dossier", false);
    code delphi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    library ma_dll;
    uses Sharemem,.....
     
    procedure ProcExportDll(ExportType : Integer; Listrefcon : Pchar; DestinationType: Integer;
                            MajStatuts,choixRepertoire : Boolean; RepertoireCible : Pchar;
                            CreerUnitaire : Boolean); stdcall;
    Je pense que ca peut aussi etre un probleme de convention d'appel. Je note qu'au début je travaillais avec des string et des TStringList, mais tous des amis du forum me l'ont déconseillé, le blem c est que ca marche pas aussi avec des PChar aussi!!!!!!!!
    Merci de m'aider si vous voyez comment

  8. #8
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 083
    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 083
    Par défaut
    On dirait que deux sujets on été fusionné, du coup, cela a planté ma réponse

    Bon, je vais faire court

    Boolean = 1 Byte
    Bool = 4 Bytes (cf http://support.microsoft.com/kb/199315/fr)
    donc faut utilise
    LongBool = 4 Bytes en Delphi

    sinon ShareMem, devient inutile, personnellement, moins je vois cette unité et sa DLL mieux je me porte !
    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

  9. #9
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Par défaut
    Citation Envoyé par ShaiLeTroll
    sinon ShareMem, devient inutile, personnellement, moins je vois cette unité et sa DLL mieux je me porte !
    Utilise FastShareMem
    http://delphi.developpez.com/faq/?pa...rstringdansdll
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  10. #10
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 083
    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 083
    Par défaut
    J'ai fait quelques DLL ou ActiveX mais dans un FrameWork de mes employeurs, donc j'ignore tout ce qui pouvait trainer derrière, ... mais quand je fais une DLL, j'utilise les PChar ou les ShortString, qui fonctionne bien puisque c'est un type simple et borné ...

    Sinon, personnellement, faudrait que je teste un truc sur une machine sans Delphi car j'ai une form et autres classes delphi, et cela fonctionne sans avoir mis ShareMem, j'avoue que j'y comprends rien à ce sujet, car pourquoi cela fonctionne ??? surement parce que j'ai delphi installé !

    WriteStringList enregisre nickel ... et ma form est la à aussi ... je la modifie dans le programme appelant en plus :

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    procedure TFrmTestDivers.WriteStringList(const FileName: string; const Strings: TStrings);
    var
      HandleDLL: HMODULE;
      _WriteStringList: procedure(const FileName: string; const Strings: TStrings); stdcall;
    begin
      HandleDLL := LoadLibrary('DLLTest.dll');
     
      if HandleDLL > 0 then
      begin
        try
          @_WriteStringList := GetProcAddress(HandleDLL, 'WriteStringList');
          if Assigned(@_WriteStringList) then
            _WriteStringList(FileName, Strings);
        finally
          FreeLibrary(HandleDLL);
        end;
      end;
    end;
     
    procedure TFrmTestDivers.BtnWriteStringListClick(Sender: TObject);
    begin
      WriteStringList('toto.txt', MemoDLL.Lines);
    end;
     
    procedure TFrmTestDivers.GetDLLForm(out Form: TForm);
    var
      HandleDLL: HMODULE;
      _GetDLLForm: procedure(out Form: TForm); stdcall;
    begin
      HandleDLL := LoadLibrary('DLLTest.dll');
     
      if HandleDLL > 0 then
      begin
        @_GetDLLForm := GetProcAddress(HandleDLL, 'GetDLLForm');
        if Assigned(@_GetDLLForm) then
          _GetDLLForm(Form)
        else
          Form := nil;
        if Assigned(Form) then
        begin
          Form.OnClose := DLLFormClose;
          Form.Tag := HandleDLL;
          Form.Caption := Form.Caption + ' - ' + Application.ExeName;
        end;
      end;
    end;
     
    procedure TFrmTestDivers.FreeDLLForm(const Form: TForm);
    var
      _FreeDLLForm: procedure(const Form: TForm); stdcall;
    begin
      if Form.Tag > 0 then
      begin
        @_FreeDLLForm := GetProcAddress(Form.Tag, 'FreeDLLForm');
        if Assigned(@_FreeDLLForm) then
        begin
          _FreeDLLForm(Form);
          FreeLibrary(Form.Tag);
        end;
      end;
    end;
     
    procedure TFrmTestDivers.DLLFormClose(Sender: TObject; var Action: TCloseAction);
    begin
      Action := caHide;
    end;
     
    var
      Form: TForm;
     
    procedure TFrmTestDivers.BtnGetDLLFormClick(Sender: TObject);
    begin
      GetDLLForm(Form);
      Form.Show();
    end;
     
    procedure TFrmTestDivers.BtnFreeDLLFormClick(Sender: TObject);
    begin
      FreeDLLForm(Form);
    end;
    Composant à copier dans une Form, un copier coller directement en RAD colle le text et créé les composants !
    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
    30
    31
    32
    33
    34
    35
    36
    37
     
    object BtnWriteStringList: TButton
      Left = 8
      Top = 8
      Width = 75
      Height = 25
      Caption = 'WriteStringList'
      TabOrder = 0
      OnClick = BtnWriteStringListClick
    end
    object MemoDLL: TMemo
      Left = 8
      Top = 40
      Width = 185
      Height = 89
      Lines.Strings = (
        'MemoDLL')
      TabOrder = 1
    end
    object BtnGetDLLForm: TButton
      Left = 8
      Top = 136
      Width = 75
      Height = 25
      Caption = 'GetDLLForm'
      TabOrder = 2
      OnClick = BtnGetDLLFormClick
    end
    object BtnFreeDLLForm: TButton
      Left = 88
      Top = 136
      Width = 75
      Height = 25
      Caption = 'FreeDLLForm'
      TabOrder = 3
      OnClick = BtnFreeDLLFormClick
    end
    J'ai mis en fichier les sources qui vont avec,
    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

Discussions similaires

  1. adapter un sha1 php en delphi
    Par aphyl dans le forum Langage
    Réponses: 3
    Dernier message: 12/04/2009, 11h35
  2. [ADO] Enregistrer et reproduire un type BLOB sous Delphi
    Par Lucas Panny dans le forum Bases de données
    Réponses: 8
    Dernier message: 24/04/2008, 07h37
  3. Adaptation de code vbs pour delphi
    Par neuneu1 dans le forum Débuter
    Réponses: 5
    Dernier message: 03/03/2008, 19h44
  4. Type mismatch sur un PCHAR
    Par TheBigMac dans le forum Langage
    Réponses: 3
    Dernier message: 30/01/2007, 00h35
  5. Assembleur et type de variable delphi
    Par declencher dans le forum Langage
    Réponses: 5
    Dernier message: 20/06/2004, 23h21

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