Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Llamar funcion dll con una cadena... (https://www.clubdelphi.com/foros/showthread.php?t=54726)

robinsongm 28-03-2008 14:54:34

Llamar funcion dll con una cadena...
 
Hola!.
Me he creado una DLL solo de funciones que devuelven strings.

y necesito una forma para poder acceder a dichas funciones si solo sé el nombre de la funcion en un string...
Me explico....

Estas son funciones ejemplo en la DLL:

Function hola_mundo: String;
Begin
result:= '*** Hola mundo ***'
End;

Function SegundaFuncion: String;
Begin
result:= 'Esta es la segunda funcion'
End;

(NO se si debería poner: Function.... :String; stdcall; ¿?)

Tengo una lista de "IDs" en string dentro de mi aplicación y cada uno es el nombre de una función, Los nombres son activamente variables claro que dentro de todos los que ya existen en la DLL.
No sé que id me enviarán, es dinamico y por tanto no puedo hacer la llamada con extern y así. Pues tendria que crearme un metodo
para cada funcion de la DLL y son cientos.... ademas que luego debería comprobar ID por ID para saber que funcion llamar....

Conociendo los IDs, desde la aplicacion he hecho (mas o menos y no estoy muy seguro de si es la forma correcta):

Funcion LeerCadena (IdCadena: String): String;
P: function: String; stdcall;
Begin
P:= GetProcAddress(HandleMiDLL,PCHar(IdCadena));
result:= P;
End;


Haciendo la llamada a LeerCadena('hola_mundo'); la misma debería responderme con: '*** Hola Mundo ***';

El Handle de mi dll lo obtengo con LoadLibrary(PathMIDLL) en procedimientos anteriores...

No se si me doy a entender bien, espero que si y que me puedan dar una manito. jajaja.

Muchas gracias majos!

cHackAll 28-03-2008 15:46:39

No puedes usar un string en una DLL.

Caso
Ampliación

PD; cualquier funcion exportada en la DLL debe ser declarada con stdcall.

Saludos

Chris 28-03-2008 16:07:19

Cita:

Empezado por cHackAll (Mensaje 275983)
No puedes usar un string en una DLL.

Caso
Ampliación

PD; cualquier funcion exportada en la DLL debe ser declarada con stdcall.

Saludos

No es que no se pueda, sino que simplemente, no deberías. En mi caso personal prefiero utilizar OleVariant en vez de String, o también puedes utilizar PAnsiChar.

Saludos.

keyboy 28-03-2008 16:52:29

Cita:

Empezado por D&W (Mensaje 275988)
No es que no se pueda, sino que simplemente, no deberías.

Pues, ¿cuál es la diferencia? Cualquier acceso a una función que use string causará un error. Yo entonces lo interpreto como no se debe porque no se puede :)

Y bueno, también se puede recurrir ShareMem para poder usar el tipo string, auqnue eso obliga a redistribuir la librería borlndmm.dll.

Bye

JOSEPE 28-03-2008 20:30:20

No necesariamente si se hace uso de FastMM.
Saludos,
JOSEPE

robinsongm 01-04-2008 08:31:54

hey...muchas gracias a todos por los comentarios!...

Da igual como declare los tipos en la dll, pero me interesa que en delphi sean Strings, pues son mensajes a mostrar a los usuarios...

Muchas gracias de nuevo!

drkirocorp 26-02-2010 20:55:21

String y PChar en DLL y Delphi
 
Hola, aunque el hilo ya es viejo, algunos colegas lo ven por primera vez o por centésima vez jeje, encontré este ejemplo en donde se puede obtener un string desde la dll sin tener errores extraños, por si le sirve a alguien, saludos

///En la DLL---------------------------

library MyDLL;
uses
SysUtils;

const
AString: string = 'Hello world!';

function ReturnsAString: PChar;
begin
GetMem( Result, length( AString ) +1 );
StrPCopy( Result, AString )
end;

procedure FreeString( s: PChar );
begin
FreeMem( s )
end;

exports
ReturnsAString,
FreeString;

begin
end.

//En Delphi--------------------------------

procedure Button1Click( Sender: Object ); // or whatever
var
s: string;
p: PChar;
begin
p := ReturnsAString; // get the DLL's memory
s := p; // get a copy into our string
FreeString( p ); // return the DLL's memory
ShowMessage( s )
end;


La franja horaria es GMT +2. Ahora son las 06:05:14.

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