begin process at 2008 08 29 21:13:35
1 233 885 membres
407 nouveaux aujourd'hui
14 294 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

DLL ET PCHAR


Information sur la source

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 181

Note :
Aucune note

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
  • signaler à un administrateur
    Commentaire de rt15 le 02/08/2005 10:53:29

    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

Pub



Appels d'offres

Recherche developpeur ...
Budget : 700€
SITE MARCHAND LOCATION...
Budget : 3 000€
SITE MARCHAND POUR HOTEL
Budget : 4 000€

CalendriCode

Août 2008
LMMJVSD
    123
45678910
11121314151617
18192021222324
25262728293031

VS Express FR Gratuit !

VS Express en français et 100% gratuit !

Boutique

Boutique de goodies CodeS-SourceS