begin process at 2012 02 05 00:18:28
  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 :5 017

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 DICTIONNAIRE WORD DANS UN RICHEDIT par H60
Source avec Zip TRIER DU GREC DANS UNE APPLI EN CODE LOCAL FRANÇAIS. par fricot
Source avec Zip Source avec une capture INTÉGRATION DE PAGE HTML DANS LES RESSOURCES D'UNE DLL par christophe75018
FONCTION DE CONVERSION DE MILLISECONDES EN HH:MM:SS:MMM par vyseR
Source avec Zip Source avec une capture UTILISER UNE DLL INCLUSE EN RESSOURCES par Bacterius

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

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
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,624 sec (3)

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