Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Usar cadena en librería DLL para D7 y RX10 error en tipo de datos al pasar y recibir (https://www.clubdelphi.com/foros/showthread.php?t=93885)

CrazySoft 21-04-2019 15:15:36

Usar cadena en librería DLL para D7 y RX10 error en tipo de datos al pasar y recibir
 
Lo que estoy realizando es usar una librería DLL compilada en D7 y RX10, pasando una cadena e uniéndola con otra devolviendo la cadena nueva, uso un mismo ejecutable que lo compilo con D7 y RX10 lo ejecuto, y con algunos tipos de datos no recibe ni devuelve la cadena enviada

Cuál es la forma correcta de usar cadenas como parámetros en DLL

Gracias

Este es el resultado de la ejecución

Cadena enviada "Esta es una prueba"

Resultado en ejecutando en Rx10
DLL Rx10
Cadena_ Cadena PAnsiChar Esta es una prueba
Cadena_P Cadena PChar Esta es una prueba
Cadena_w Cadena PWideChar Esta es una prueba
Cadena_AS
Cadena_S Cadena string Esta es una prueba

DLL D7
Cadena_ Cadena PAnsiChar Esta es una prueba
Cadena_P 慃敤慮倠桃牡䔠
Cadena_w 慃敤慮倠楗敤桃牡䔠瑳⁡獥甠慮瀠畲扥a
Cadena_AS
Cadena_S 慃敤慮猠牴湩⁧Esta es u⠀ü⢚ü



Resultado en ejecutando en D7
DLL Rx10
Cadena_ Cadena PAnsiChar Esta es una prueba
Cadena_P C
Cadena_w Cadena PWideChar ?????????
Cadena_AS C
Cadena_S C

DLL D7
Cadena_ Cadena PAnsiChar Esta es una prueba
Cadena_P Cadena PChar Esta es una prueba
Cadena_w ?????????????
Cadena_AS Cadena PAnsiString Esta es una prueba
Cadena_S Cadena string Esta es una prueba





Código de pruebas




Dll en D7

Código Delphi [-]library Cadena2libD7; uses Classes, Windows, SysUtils , Dialogs ; {$R *.res} function Cadena_7(Cadena: PAnsiChar): PAnsiChar; stdcall; begin ShowMessage(string(Cadena)); Result := PAnsiChar(AnsiString('Cadena PAnsiChar '+(trim(string(Cadena))))); end; function Cadena_AS7(Cadena: PAnsiString): PAnsiString; stdcall; begin ShowMessage(string(AnsiString(Cadena))); Result := PAnsiString(('Cadena PAnsiString '+Trim(string(AnsiString(Cadena))))); end; function Cadena_P7(Cadena: PChar): PChar; stdcall; begin ShowMessage(string(AnsiString(Cadena))); Result := PChar(('Cadena PChar '+(string(AnsiString(Cadena))))); end; function Cadena_W7(Cadena: PWideChar): PWideChar; stdcall; begin ShowMessage(string(AnsiString(Cadena))); Result := PWideChar(('Cadena PWideChar '+Trim(string(AnsiString(Cadena))))); end; function Cadena_S7(Cadena: string): string; stdcall; begin ShowMessage(Cadena); Result := 'Cadena string '+Cadena; end; exports Cadena_7, Cadena_P7, Cadena_S7, Cadena_W7, Cadena_AS7; begin end.



DLL en Rx10

Código Delphi [-]library Cadena2libRx10; uses Classes, Windows, SysUtils ,Vcl.Dialogs; {$R *.res} function Cadena_(Cadena: PAnsiChar): PAnsiChar; stdcall; begin ShowMessage(string(Cadena)); Result := PAnsiChar(AnsiString('Cadena PAnsiChar '+(trim(string(Cadena))))); end; function Cadena_AS(Cadena: PAnsiString): PAnsiString; stdcall; begin ShowMessage(string(AnsiString(Cadena))); Result := PAnsiString(('Cadena PAnsiString '+Trim(string(AnsiString(Cadena))))); end; function Cadena_P(Cadena: PChar): PChar; stdcall; begin ShowMessage(string(AnsiString(Cadena))); Result := PChar(('Cadena PChar '+(string(AnsiString(Cadena))))); end; function Cadena_W(Cadena: PWideChar): PWideChar; stdcall; begin ShowMessage(string(AnsiString(Cadena))); Result := PWideChar(('Cadena PWideChar '+Trim(string(AnsiString(Cadena))))); end; function Cadena_S(Cadena: string): string; stdcall; begin ShowMessage(Cadena); Result := 'Cadena string '+Cadena; end; exports Cadena_, Cadena_P, Cadena_S, Cadena_W, Cadena_AS; begin end.





Programa de prueba ejecutado en D7 y Rx10



Código Delphi [-]unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Clipbrd; type TForm1 = class(TForm) Button2: TButton; Memo1: TMemo; Memo2: TMemo; Button1: TButton; procedure Button2Click(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} function Cadena_7(Cadena: PAnsiChar): PAnsiChar; stdcall external 'Cadena2libD7.dll' function Cadena_P7(Cadena: PChar): PChar; stdcall external 'Cadena2libD7.dll' function Cadena_W7(Cadena: PWideChar): PWideChar; stdcall external 'Cadena2libD7.dll' function Cadena_S7(Cadena: string): string; stdcall external 'Cadena2libD7.dll' function Cadena_AS7(Cadena: PAnsiString): PAnsiString; stdcall external 'Cadena2libD7.dll' function Cadena_(Cadena: PAnsiChar): PAnsiChar; stdcall external 'Cadena2libRx10.dll' function Cadena_P(Cadena: PChar): PChar; stdcall external 'Cadena2libRx10.dll' function Cadena_W(Cadena: PWideChar): PWideChar; stdcall external 'Cadena2libRx10.dll' function Cadena_S(Cadena: string): string; stdcall external 'Cadena2libRx10.dll' function Cadena_AS(Cadena: PAnsiString): PAnsiString; stdcall external 'Cadena2libRx10.dll' procedure TForm1.Button2Click(Sender: TObject); begin try Memo2.Lines.Add('Cadena_ '+Cadena_(PAnsiChar(AnsiString(trim(memo1.lines.text))))); except end; try Memo2.Lines.Add('Cadena_P '+StrPas(Cadena_P(PChar(String(trim(memo1.lines.text)))))); except end; try Memo2.Lines.Add('Cadena_w '+Cadena_W(PWideChar(String(trim(memo1.lines.text))))); except end; try Memo2.Lines.Add('Cadena_AS '+String(AnsiString(Cadena_AS(PAnsiString(pAnsicHAR(string(trim(memo1.lines.text)))))))); except end; try Memo2.Lines.Add('Cadena_S '+Cadena_S(string(trim(memo1.lines.text)))); except end; end; procedure TForm1.Button1Click(Sender: TObject); begin try Memo2.Lines.Add('Cadena_ '+Cadena_7(PAnsiChar(AnsiString(trim(memo1.lines.text))))); except end; try Memo2.Lines.Add('Cadena_P '+StrPas(Cadena_P7(PChar(String(trim(memo1.lines.text)))))); except end; try Memo2.Lines.Add('Cadena_w '+Cadena_W7(PWideChar(String(trim(memo1.lines.text))))); except end; try Memo2.Lines.Add('Cadena_AS '+String(AnsiString(Cadena_AS7(PAnsiString(pAnsicHAR(string(trim(memo1.lines.text)))))))); except end; try Memo2.Lines.Add('Cadena_S '+Cadena_S7(string(trim(memo1.lines.text)))); except end; end; end.

Ñuño Martínez 22-04-2019 13:04:29

No veo el código porque, por alguna razón, el formato se ha ido a freír espárragos. Aun así, si no recuerdo mal, para que se puedan compartir cadenas de texto (STRING) con DLLs hay que añadir la unidad ShareMem al USES de una de las unidades, tanto del programa principal como de la DLL.

CrazySoft 30-04-2019 12:33:08

Gracias ÑuÑo, por la ayuda pero lo que queria es solo pasar un parametro de tipo string a una funcion y que me devuelva otra cadena

CrazySoft 30-04-2019 12:37:59

pongo de nuevo el codigo para que sea legible


D7 Dll
Código Delphi [-]
library Cadena2libD7;

uses
//  ShareMem ,
  Classes, Windows, SysUtils
  , Dialogs
  ;

{$R *.res}


function Cadena_7(Cadena: PAnsiChar): PAnsiChar; stdcall;
begin
  ShowMessage(string(Cadena));
  Result := PAnsiChar(AnsiString('Cadena PAnsiChar '+(trim(string(Cadena)))));

end;

function Cadena_AS7(Cadena: PAnsiString): PAnsiString; stdcall;
begin
  ShowMessage(string(AnsiString(Cadena)));
  Result := PAnsiString(('Cadena PAnsiString '+Trim(string(AnsiString(Cadena)))));
end;

function Cadena_P7(Cadena: PChar): PChar; stdcall;
begin
  ShowMessage(string(AnsiString(Cadena)));
  Result := PChar(('Cadena PChar '+(string(AnsiString(Cadena)))));
end;

function Cadena_W7(Cadena: PWideChar): PWideChar; stdcall;
begin
  ShowMessage(string(AnsiString(Cadena)));
  Result := PWideChar(('Cadena PWideChar '+Trim(string(AnsiString(Cadena)))));
end;

function Cadena_S7(Cadena: string): string; stdcall;
begin
  ShowMessage(Cadena);
  Result := 'Cadena string '+Cadena;
end;

exports Cadena_7, Cadena_P7, Cadena_S7, Cadena_W7, Cadena_AS7;

begin
end.


RX10


Código Delphi [-]
library Cadena2libRx10;

uses
//

  {$IFDEF VER150}
 Classes, Windows, SysUtils
 ,Dialogs
 //,ShareMem
{$ELSE}
 System.Classes,Winapi.Windows,System.SysUtils
,Vcl.Dialogs
//,System.ShareMem
{$ENDIF}
 ;
{$R *.res}


function Cadena_(Cadena: PAnsiChar): PAnsiChar; stdcall;
begin
  ShowMessage(string(Cadena));
  Result := PAnsiChar(AnsiString('Cadena PAnsiChar '+(trim(string(Cadena)))));

end;

function Cadena_AS(Cadena: PAnsiString): PAnsiString; stdcall;
begin
  ShowMessage(string(AnsiString(Cadena)));
  Result := PAnsiString(('Cadena PAnsiString '+Trim(string(AnsiString(Cadena)))));
end;

function Cadena_P(Cadena: PChar): PChar; stdcall;
begin
  ShowMessage(string(AnsiString(Cadena)));
  Result := PChar(('Cadena PChar '+(string(AnsiString(Cadena)))));
end;

function Cadena_W(Cadena: PWideChar): PWideChar; stdcall;
begin
  ShowMessage(string(AnsiString(Cadena)));
  Result := PWideChar(('Cadena PWideChar '+Trim(string(AnsiString(Cadena)))));
end;

function Cadena_S(Cadena: string): string; stdcall;
begin
  ShowMessage(Cadena);
  Result := 'Cadena string '+Cadena;
end;

exports Cadena_, Cadena_P, Cadena_S, Cadena_W, Cadena_AS;

begin
end.


Pruebas


Código Delphi [-]
unit Unit1;

interface

uses


   Messages,  Variants,  Graphics, Controls, Forms,
   StdCtrls, Clipbrd,
  {$IFDEF VER150}
 Classes,  SysUtils  ,Dialogs
// ,ShareMem
{$ELSE}
 System.Classes,Winapi.Windows,System.SysUtils
,Vcl.Dialogs
//,System.ShareMem
{$ENDIF}

;

type
  TForm1 = class(TForm)
    Button2: TButton;
    Memo1: TMemo;
    Memo2: TMemo;
    Button1: TButton;
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;


var
  Form1: TForm1;

implementation

{$R *.dfm}


function Cadena_7(Cadena: PAnsiChar): PAnsiChar; stdcall external 'Cadena2libD7.dll'

function Cadena_P7(Cadena: PChar): PChar; stdcall external 'Cadena2libD7.dll'

function Cadena_W7(Cadena: PWideChar): PWideChar; stdcall external 'Cadena2libD7.dll'

function Cadena_S7(Cadena: string): string; stdcall external 'Cadena2libD7.dll'

function Cadena_AS7(Cadena: PAnsiString): PAnsiString; stdcall external 'Cadena2libD7.dll'

function Cadena_(Cadena: PAnsiChar): PAnsiChar; stdcall external 'Cadena2libRx10.dll'

function Cadena_P(Cadena: PChar): PChar; stdcall external 'Cadena2libRx10.dll'

function Cadena_W(Cadena: PWideChar): PWideChar; stdcall external 'Cadena2libRx10.dll'

function Cadena_S(Cadena: string): string; stdcall external 'Cadena2libRx10.dll'

function Cadena_AS(Cadena: PAnsiString): PAnsiString; stdcall external 'Cadena2libRx10.dll'


procedure TForm1.Button2Click(Sender: TObject);

begin
  try
    Memo2.Lines.Add('Cadena_ '+Cadena_(PAnsiChar(AnsiString(trim(memo1.lines.text)))));
  except
  end;
  try
    Memo2.Lines.Add('Cadena_P '+StrPas(Cadena_P(PChar(String(trim(memo1.lines.text))))));
  except
  end;
  try
    Memo2.Lines.Add('Cadena_w '+Cadena_W(PWideChar(String(trim(memo1.lines.text)))));
  except
  end;
  try
    Memo2.Lines.Add('Cadena_AS '+String(AnsiString(Cadena_AS(PAnsiString(pAnsicHAR(string(trim(memo1.lines.text))))))));
  except
  end;
  try
    Memo2.Lines.Add('Cadena_S '+Cadena_S(string(trim(memo1.lines.text))));
  except
  end;

end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  try
    Memo2.Lines.Add('Cadena_ '+Cadena_7(PAnsiChar(AnsiString(trim(memo1.lines.text)))));
  except
  end;
  try
    Memo2.Lines.Add('Cadena_P '+StrPas(Cadena_P7(PChar(String(trim(memo1.lines.text))))));
  except
  end;
  try
    Memo2.Lines.Add('Cadena_w '+Cadena_W7(PWideChar(String(trim(memo1.lines.text)))));
  except
  end;
  try
    Memo2.Lines.Add('Cadena_AS '+String(AnsiString(Cadena_AS7(PAnsiString(pAnsicHAR(string(trim(memo1.lines.text))))))));
  except
  end;
  try
    Memo2.Lines.Add('Cadena_S '+Cadena_S7(string(trim(memo1.lines.text))));
  except
  end;
end;

end.

Ñuño Martínez 04-05-2019 21:55:47

Visto un poco por encima, no veo cuál puede ser el problema.

De todas formas, ten cuidado con la conversión de cadenas, ya que a veces no lo hace bien. Por ejemplo, de PANSICHAR a ANSISTRING sí lo hace sólo con forzar el dato, pero de PWideChar a ANSISTRING no estoy seguro de que funcione bien.


La franja horaria es GMT +2. Ahora son las 11:36:41.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi