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.