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

  1. #1
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 187
    Points : 55
    Points
    55
    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 chevronné Avatar de philnext
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 552
    Points : 1 780
    Points
    1 780
    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 du Club
    Inscrit en
    Avril 2007
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 187
    Points : 55
    Points
    55
    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 éprouvé
    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
    Points : 988
    Points
    988
    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 du Club
    Inscrit en
    Avril 2007
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 187
    Points : 55
    Points
    55
    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
    Points : 8 078
    Points
    8 078
    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é?

  7. #7
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 187
    Points : 55
    Points
    55
    Par défaut
    Citation Envoyé par Pedro
    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é?
    Je n'ai pas encore essayé cela, c'est pour ça que je voulé demander pour eviter des pbs mais bon je vais voir ... Merci quand meme

  8. #8
    Membre éprouvé
    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
    Points : 988
    Points
    988
    Par défaut
    Citation Envoyé par Pedro
    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é?
    Il doit interfacer sa Dll Delphi avec un programme C++. Donc, non...

    Sinon, je n'avais pas vu la deuxième partie de la question.

    Ça fait des années que j'ai programmé un TIntegerList inspiré de TList. Outre les propriétés de TList, il ajoute les fonctions/procédures suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        procedure SortUp;
        procedure SortDown;
        procedure ShowList(StringList:TStrings;Descriptor:TIntegerDescriptor;ClearIt:Boolean);
        function  Minimum:Integer;
        function  Maximum:Integer;
        function  Range:Integer;
        function  Sum:Extended;
        function  Average:Extended;
        procedure CopyFrom(List:TIntegerList);
        procedure CopyTo(List:TIntegerList);
    Je le mets en fichier joint, mais je suppose qu'il y a d'autres unités qui existent. Sinon, le plus simple est d'utiliser un TList avec un transtypage systématique des items en Integer, mais c'est pénible au bout d'un moment.

    Mon source aurait peut-être sa place quelque part sur le site, je ne sais pas ?
    Fichiers attachés Fichiers attachés

  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
    Points : 8 078
    Points
    8 078
    Par défaut
    Citation Envoyé par CapJack
    Il doit interfacer sa Dll Delphi avec un programme C++. Donc, non...
    Oui vu sous cet angle-là on peut le voir comme ça
    Citation Envoyé par CapJack
    Mon source aurait peut-être sa place quelque part sur le site, je ne sais pas ?
    Mais bien sûr N'hésitez pas à proposer vos codes à l'équipe de modération qui se fera un plaisir de les recevoir

  10. #10
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 187
    Points : 55
    Points
    55
    Par défaut
    Troop riche comme idée... thx a lot folks

  11. #11
    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
    Points : 8 078
    Points
    8 078
    Par défaut
    Citation Envoyé par bouzaidi
    Troop riche comme idée... thx a lot folks
    Si c'est résolu, clique sur le bouton


    PS: c'est quelle solution que tu as adopté au fait?

  12. #12
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 563
    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 563
    Points : 25 165
    Points
    25 165
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaList.Text := StrPas(PointerChar);
    il suffit que PointerChar un PChar (ou Char*) contiennet des retours charriots (#13 et #10)...

    ou sinon,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    MaList.Delimiter := ';';
    MaList.QuoteChar := '"';
    MaList.DelimitedText:= StrPas(PointerChar);
    ça donne un découpage à la csv ou comma text ...

    ton problène n'est pas lié au DLL mais à une méconnaissance de la TStringList ... CapJack a déjà expliqué cela dans l'autre sujet

    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.

  13. #13
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 187
    Points : 55
    Points
    55
    Par défaut
    Je veux tester ma dll ecrite en delphi par un apel de c++.

    l'un des paramètres utilisé dans la DLL est de type TStringList, donc lors de l'appel dans C++ j'ai utilisé une variable char*. Le Problème c est que je ne sais pas comment tester, c'est à dire comment fournir la liste des string dans C++. Si je doit fournir une liste qui contient les trois string suivant "coucou", "toto","titi" est ce que je doit donner comme parametre en c++ le char "coucou#13#10toto#13#10titi" ????

    Merciii

  14. #14
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 187
    Points : 55
    Points
    55
    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

  15. #15
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 563
    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 563
    Points : 25 165
    Points
    25 165
    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 !

  16. #16
    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
    Points : 8 078
    Points
    8 078
    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

  17. #17
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 563
    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 563
    Points : 25 165
    Points
    25 165
    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,

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