Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 21-04-2019
CrazySoft CrazySoft is offline
Miembro
 
Registrado: abr 2005
Posts: 96
Poder: 19
CrazySoft Va por buen camino
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.
Responder Con Cita
  #2  
Antiguo 22-04-2019
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 6.000
Poder: 25
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
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.
__________________
Proyectos actuales --> Allegro 5 Pascal ¡y Delphi!|MinGRo Game Engine
Responder Con Cita
  #3  
Antiguo 30-04-2019
CrazySoft CrazySoft is offline
Miembro
 
Registrado: abr 2005
Posts: 96
Poder: 19
CrazySoft Va por buen camino
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
Responder Con Cita
  #4  
Antiguo 30-04-2019
CrazySoft CrazySoft is offline
Miembro
 
Registrado: abr 2005
Posts: 96
Poder: 19
CrazySoft Va por buen camino
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.
Responder Con Cita
  #5  
Antiguo 04-05-2019
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 6.000
Poder: 25
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
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.
__________________
Proyectos actuales --> Allegro 5 Pascal ¡y Delphi!|MinGRo Game Engine
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
que tipo de datos utilizar para guardar cualquier tipo de archivo jeremiselxi MS SQL Server 2 08-12-2014 20:30:00
Recibir cadena de carácter. REHome .NET 3 09-09-2008 17:12:16
pasar un tipo de datos (array of record) entre aplicaciones mauqu Varios 4 26-10-2007 21:04:31
EOleSysError Error al cargar libreria de tipo/DLL david duarte Conexión con bases de datos 1 24-01-2006 19:27:08
Usar tipo de datos double con mysql..... uper MySQL 2 18-10-2005 21:31:42


La franja horaria es GMT +2. Ahora son las 20:26:34.


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
Copyright 1996-2007 Club Delphi