begin process at 2010 02 10 00:37:37
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Trucs & Astuces

 > DLL ET PCHAR

DLL ET PCHAR


 Information sur la source

Note :
Aucune note
Catégorie :Trucs & Astuces Niveau :Débutant Date de création :05/02/2003 Date de mise à jour :05/02/2003 11:29:05 Vu :3 909

Auteur : jplg

Ecrire un message privé
Commentaire sur cette source (1)
Ajouter un commentaire et/ou une note

 Description

Exemple d'une dll avec 2 Pchar en entrée et renvoyant un pchar qui est la concaténation des 2 Pchar en entrée pour Delphi.

Source

  • Tout d'abord la dll:
  • library JprStr;
  • { Important note about DLL memory management: ShareMem must be the
  • first unit in your library's USES clause AND your project's (select
  • Project-View Source) USES clause if your DLL exports any procedures or
  • functions that pass strings as parameters or function results. This
  • applies to all strings passed to and from your DLL--even those that
  • are nested in records and classes. ShareMem is the interface unit to
  • the BORLNDMM.DLL shared memory manager, which must be deployed along
  • with your DLL. To avoid using BORLNDMM.DLL, pass string information
  • using PChar or ShortString parameters. }
  • uses
  • SysUtils,
  • Types,
  • Classes;
  • {$R *.res}
  • {H+}
  • function JpConcAt( Pstr1 : Pchar; Pstr2 : Pchar;Pstr3 : Pchar):Pchar;stdcall;
  • var
  • str1,str2,str3:string;
  • i:integer;
  • chaine: array[0..39] of char;
  • begin
  • str1:=Strpas(Pstr1);
  • str2:=Strpas(Pstr2);
  • str3:=str1 + str2;
  • strPLcopy(Pstr3,str3,40); // transformation String -> PChar
  • for i:=0 to 39 do
  • chaine[i]:=str3[i+1];
  • result:=@chaine;// renvoie un Pchar
  • end;
  • exports
  • JpConcAt;
  • begin
  • end.
  • maintenant l'appel à partir d'un form contenant 2 TEdit(les 2 chaines à concaténer), 1 Tbutton, 1 Tedit (Résultat):
  • unit AppelJpStr;
  • interface
  • uses
  • Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  • Dialogs, StdCtrls;
  • type
  • TFrmAppelJpStr = class(TForm)
  • Edit1: TEdit;
  • Edit2: TEdit;
  • Button1: TButton;
  • Edit3: TEdit;
  • procedure Button1Click(Sender: TObject);
  • private
  • { Private declarations }
  • public
  • { Public declarations }
  • end;
  • var
  • FrmAppelJpStr: TFrmAppelJpStr;
  • implementation
  • function JpConcAt( Pstr1 : Pchar ;Pstr2 : Pchar;Pstr3 :Pchar):Pchar;stdcall;external '.\Jprstr.dll';
  • {$R *.dfm}
  • Procedure TFrmAppelJpStr.Button1Click(Sender: TObject);
  • var
  • Chaine1:array[0..19] of char;
  • chaine2:array[0..19] of char;
  • chaine3:array[0..39] of char;
  • str1,str2,str3:string;
  • i:Integer;
  • Pstr1,Pstr:Pchar;
  • Pstr2:Pchar;
  • Pstr3:Pchar;
  • begin
  • str1:=edit1.Text;
  • str2:=edit2.Text;
  • str3:='';
  • // initialisation Pstr1
  • for i :=0 to length(str1) do
  • chaine1[i]:= str1[i+1];
  • Pstr1:=@chaine1;
  • // initialisation Pstr2
  • for i :=0 to length(str2) do
  • chaine2[i]:= str2[i+1];
  • Pstr2:=@chaine2;
  • //réservation pour Pstr3
  • Pstr3:=strAlloc(40);
  • // appel library
  • JpConcat(Pstr1,Pstr2,Pstr3);
  • str3:=strpas(Pstr3);
  • edit3.Text:= str3;
  • end;
  • Nota: si les passages Pchar->String ou String ->Pchar ne marchent pas (ca arrive...?), procédez Pchar->Array of Char ->String ou String -> Array Of Char -> Pchar
Tout d'abord la dll:
library JprStr;

{ Important note about DLL memory management: ShareMem must be the
  first unit in your library's USES clause AND your project's (select
  Project-View Source) USES clause if your DLL exports any procedures or
  functions that pass strings as parameters or function results. This
  applies to all strings passed to and from your DLL--even those that
  are nested in records and classes. ShareMem is the interface unit to
  the BORLNDMM.DLL shared memory manager, which must be deployed along
  with your DLL. To avoid using BORLNDMM.DLL, pass string information
  using PChar or ShortString parameters. }

uses
  SysUtils,
  Types,
  Classes;

{$R *.res}
{H+}

function JpConcAt( Pstr1 : Pchar; Pstr2 : Pchar;Pstr3 : Pchar):Pchar;stdcall;
var
       str1,str2,str3:string;
       i:integer;
       chaine: array[0..39] of char;
begin
       str1:=Strpas(Pstr1);
       str2:=Strpas(Pstr2);
       str3:=str1 + str2;
       strPLcopy(Pstr3,str3,40); // transformation String -> PChar

       for i:=0 to 39 do
          chaine[i]:=str3[i+1];
       result:=@chaine;// renvoie un Pchar


end;

exports
      JpConcAt;

begin
end.


maintenant l'appel à partir d'un form contenant 2 TEdit(les 2 chaines à concaténer), 1 Tbutton, 1 Tedit (Résultat):
unit AppelJpStr;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TFrmAppelJpStr = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Button1: TButton;
    Edit3: TEdit;

procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  FrmAppelJpStr: TFrmAppelJpStr;


implementation

function JpConcAt( Pstr1 : Pchar ;Pstr2 : Pchar;Pstr3 :Pchar):Pchar;stdcall;external '.\Jprstr.dll';

{$R *.dfm}

Procedure TFrmAppelJpStr.Button1Click(Sender: TObject);
var
  Chaine1:array[0..19] of char;
  chaine2:array[0..19] of char;
  chaine3:array[0..39] of char;
  str1,str2,str3:string;
  i:Integer;
  Pstr1,Pstr:Pchar;
  Pstr2:Pchar;
  Pstr3:Pchar;
begin
  str1:=edit1.Text;
  str2:=edit2.Text;
  str3:='';
  // initialisation Pstr1
  for i :=0 to length(str1) do
     chaine1[i]:= str1[i+1];
  Pstr1:=@chaine1;
    // initialisation Pstr2
  for i :=0 to length(str2) do
     chaine2[i]:= str2[i+1];
  Pstr2:=@chaine2;
  //réservation pour Pstr3
  Pstr3:=strAlloc(40);
  // appel library
  JpConcat(Pstr1,Pstr2,Pstr3);
  str3:=strpas(Pstr3);
  edit3.Text:= str3;
end;

Nota: si les passages Pchar->String ou String ->Pchar ne marchent pas (ca arrive...?), procédez Pchar->Array of Char ->String ou String -> Array Of Char -> Pchar

 Conclusion

l'exemple fonctionne en Delphi 6 et Delphi 7


 Sources de la même categorie

Source avec Zip Source avec une capture UTILISER UNE DLL INCLUSE EN RESSOURCES par Bacterius
Source avec Zip Source avec une capture IMAGE DANS UN TDBGRID par HAFTARIFOUAD
Source avec Zip Source avec une capture [ASTUCE] COMMENT VOIR UN ITEM, D'UNE LISTBOX, TRONQUÉ DANS U... par cirec
Source avec Zip Source avec une capture MESSAGEDLG PERSONNALISÉ par HAFTARIFOUAD
Source avec Zip Source avec une capture COMMENT DESSINER SUR UN TCANVAS LE TEXTE D'UNE FORMULE CHIMI... par pseudo3

Commentaires et avis

Commentaire de rt15 le 02/08/2005 10:53:29 administrateur CS

Arf, je cherche à faire ce que ton code fait.

Je suis dans un cyber café, alors tendu...

Néanmoins, je crois que l'on peut simplifier le passage exe vers dll.

Du style const Pstr1: PChar
(Avec du stdcall)

Puis réutilisation du pointeur en toute liberté, comme s'il était déclaré comme const dans la fonction de la dll.

Je ramène plus d'info dès que je peux.

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix


HTC Magic

Entre 429€ et 429€

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,374 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales