Quiero crear una aplicación que consulte a una DLL


Me gustaría que puedas orientarme.
Quisiera crear una aplicación que consulte a una DLL, cuyo nombre no conozco, pero si las funciones que contiene.
Por ejemplo, la aplicación leerá un archivo: ListaDLL.txt, donde encontrara que el nombre de la 1ra librería es "ruta/NuevaDLL.dll"; ahora necesito, usando este nombre obtenido, llamar a la función "MiFuncion(x:double):Pchar", luego, podría encontrar en "ListaDLL.txt" otro nombre:"OtraDLL.dll", en la cual también deberá encontrarse la función "MiFuncion(x):PChar", y así sucesivamente
¿Es posible hacer esto?


De serlo, ¿cuál seria un ejemplo de código?

1 Respuesta

Respuesta
1
Te comento que si he trabajado con llamadas a DLL y que si es posible realizar esto, y te digo que si tienes que ejecutar funciones con datos fijos es mejor que programes tu DLL para que reciba únicamente un valor y dependiendo de ese valor se ejecute tu función, de no ser así se tendría que hacer un proceso más laborioso.
Para comenzar debes preparar los parámetros de envío. (Manejo como ejemplo parte de un código utilizado)
sParams := '"' + PARAM_DOCUMENT_ID + '=' + Encrypt(g_DACveDoc) + '"' + #32;
sParams := sParams + '"' + PARAM_DOCUMENT_VERSION + '=' + Encrypt(IntToStr(g_DARevDoc)) + '"' + #32;
sParams := sParams + '"' + PARAM_RESP_ID + '=' + Encrypt( g_UACveRes ) + '"' + #32;
sParams := sParams + '"' + PARAM_RESP_DESC + '=' + g_UADesRes + '"' + #32;
sParams := sParams + '"' + PARAM_USER_ID + '=' + Encrypt( g_UAUserID ) + '"' + #32;
sParams := sParams + '"' + PARAM_ALIAS_NAME + '=' + Encrypt( g_AliasBDE ) + '"' + #32;
sParams := sParams + '"' + PARAM_SCHEMA_NAME + '=' + Encrypt( g_Schema ) + '"' + #32;
sParams := sParams + '"' + PARAM_SCHEMA_PASS + '=' + Encrypt( g_SPassw ) + '"' + #32;
sParams := sParams + '"' + PARAM_CAN_MODIFY + '=' + Encrypt(IntToStr(Integer(True))) + '"' + #32;
sParams := sParams + '"' + PARAM_USU_RED + '=' + Encrypt(g_UsuRed) + '"';
Y después la llamada y envío de parámetros.
ExecuteAndWait('SCDEditor.exe ' + sParams)
Del lado de la DLL:
Constructor TControlPrint. Create(PCveDoc, PRevDoc, PStsDoc, PTipUsr, Pg_SAEstado, Pg_UAUserID,
PCveCar: String; Pg_Previsualizando: Boolean; Pg_UACveRes,
Pg_DAStsDoc, Pg_DATipDoc, Pg_DAProbaj, Pg_UARefPer, PG_DB2DSN: String);
var
l_Ciclo : Integer;
begin
inherited Create;
fRIParmLst := TStringList.Create;
fRIParmVal := TStringList.Create;
fRIPrefijo := 'SCD_' + FormatDateTime('yyyymmddhhnnss',Now) + '_';
for l_ciclo := 1 to 37 do
begin
fRIParmLst.Add(g_RIParams[l_Ciclo]);
fRIParmVal.Add(g_RIDftVal[l_Ciclo])
end;
TControlPrint
RICveDoc := PCveDoc;
RIRevDoc := PRevDoc;
RIStsDoc := PStsDoc;
RITipUsr := PTipUsr;
fG_SAEstado := Pg_SAEstado;
fG_UAUserID := Pg_UAUserID;
CveCar := PCveCar;
fG_Previsualizando := Pg_Previsualizando;
fG_UACveRes := Pg_UACveRes;
fG_DAStsDoc := Pg_DAStsDoc;
fG_DATipDoc := Pg_DATipDoc;
FG_DAProbaj := Pg_DAProbaj;
FG_UARefPer := Pg_UARefPer;
FG_DB2DSN := PG_DB2DSN
end;
Por medio de este constructor se generan las variables que reciben los datos y se deben crear variables globales para que puedan tomar el valor y poderlo usar.
Espero que esto te ayude un poco en lo que estás buscando.
Que estés bien.
Hola Osiris:
En primer lugar muchas gracias por responder, demuestras un buen nivel, pues te cuento que hice la misma pregunta con muchos amigos por mi trabajo y no pudieron darme ningún alcance.
Lo que me confunde un poco, es la necesidad de trabajar en el DLL. Por ello para simplificar, asumiremos que tenemos muchas DLL similares, solo diferenciadas en el nombre, y que todas tienen el siguiente código:
library .............;   //aqui viene el nombre de la DLL
uses SysUtils, Classes;
function MiFuncion ( x: double) : PChar; cdecl;
begin
     if x = 1 then Result := "Ok";
end;
exports MiFuncion index 1;
begin
end.
Ahora, mi aplicacion tiene integrado el siguiente codigo:
var
F : Textfile;
S: String;
...
...
AssignFile(F, "listado.txt");
Reset ( F);
Readln(F,S);
CloseFile(F);
...
...
Como se aprecia, en la variable 'S' (tipo string) tengo el nombre de la librería DLL, que la he obtenido de un archivo que he leído.
Para este caso especifico: ¿Cuál sería el código necesario para llamar a MiFuncion de la DLL cuyo nombre esta en la variable 'S'? (Asumiendo que cualesquiera sea la DLL a llamar tendrá el código mostrado lineas arriba)
Espero no molestarte, pero la verdad quisiera tener bien clarificada la idea para poder aplicarla.
Nuevamente muchas gracias por tu ayuda
Pepe
Ah ok, bueno, en este caso puedes usar un constructor semejante al que te envié, utilizando finalmente el comando ExecuteAndWait('NombreDLL' + NombreFunción). De esta forma estarás llamando directamente a la DLL y le estarás enviando el nombre de la fnción que deseas correr.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas