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?
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.