Dll et pchar

Contenu du snippet

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 / Exemple :


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

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.