Dll et pchar

Soyez le premier à donner votre avis sur cette source.

Snippet vu 7 172 fois - Téléchargée 36 fois

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

Ajouter un commentaire Commentaire
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
14
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.

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.