![]() |
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. |
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.
|
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
|
pongo de nuevo el codigo para que sea legible
D7 Dll
RX10
Pruebas
|
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:24:49. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi