FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
Uso de dll externa en Delphi
Hola amigos, estoy adentrándome en territorio nuevo y espero puedan ayudarme.
Estoy realizando un proyecto Delphi, para el que necesito usar una dll hecha para C/C++ o Visual Basic 6, en la documentación de la dll no viene la forma de implementar en Delphi(no es sorpresa) ni describe los comandos dentro de ella como para hacer el típico procedimiento de:
Es la primera vez que voy a trabajar con dll's y ciertamente no se usar C++, se que la información va de casi a totalmente nula, pero alguno tiene alguna referencia de como trabajar dicha dll (o en general cualquier dll hecha en un lenguaje externo a Delphi). Adjunto un poco del código que viene en la documentación de la dll: Código:
struct SSP_COMMAND { SSP_FULL_KEY Key; unsigned long BaudRate; unsigned long Timeout; unsigned char PortNumber; unsigned char SSPAddress; unsigned char RetryLevel; unsigned char EncryptionStatus; unsigned char CommandDataLength; unsigned char CommandData[255]; unsigned char ResponseStatus; unsigned char ResponseDataLength; unsigned char ResponseData[255]; unsigned char IgnoreError; }; typedef UINT (__stdcall* DLLFUNC3)(SSP_COMMAND* cmd, SSP_COMMAND_INFO* sspInfo); DLLFUNC3 sspSendCommand = (DLLFUNC3)GetProcAddress(hInst, "SSPSendCommand"); |
#2
|
||||
|
||||
Cita:
Cita:
Primero debes tener definida la cabecera de la función a la que vas a llamar.
Como la cabecera necesita unos tipos "específicos" denerás tenerlos definidos en tu unidad (.PAS), así que debes "covertir" los tipos que ya te dan a Delphi. En tu caso, por ejemplo, el tipo: Código:
struct SSP_COMMAND { SSP_FULL_KEY Key; unsigned long BaudRate; unsigned long Timeout; unsigned char PortNumber; unsigned char SSPAddress; unsigned char RetryLevel; unsigned char EncryptionStatus; unsigned char CommandDataLength; unsigned char CommandData[255]; unsigned char ResponseStatus; unsigned char ResponseDataLength; unsigned char ResponseData[255]; unsigned char IgnoreError; };
Algo similar debes hacer con el resto.
__________________
Germán Estévez => Web/Blog Guía de estilo, Guía alternativa Utiliza TAG's en tus mensajes. Contactar con el Clubdelphi P.D: Más tiempo dedicado a la pregunta=Mejores respuestas. |
#3
|
||||
|
||||
Los otros tipos podrían ser algo así:
__________________
Germán Estévez => Web/Blog Guía de estilo, Guía alternativa Utiliza TAG's en tus mensajes. Contactar con el Clubdelphi P.D: Más tiempo dedicado a la pregunta=Mejores respuestas. |
#4
|
||||
|
||||
Supongo que si alguien más quiere mirar el tema, este documento le podría servir de ayuda.
http://www.marrginal.ru/files/cashma...ide%20v2.2.pdf Si tienes algun otro link, estaría bien que lo añadieras.
__________________
Germán Estévez => Web/Blog Guía de estilo, Guía alternativa Utiliza TAG's en tus mensajes. Contactar con el Clubdelphi P.D: Más tiempo dedicado a la pregunta=Mejores respuestas. |
#5
|
|||
|
|||
Antes que nada gracias por tomarte el tiempo de ver el tema y responder.
Comenzaré como dices con los encabezados del las funciones principales en el documento y de ahí me iré adentrando más en el tema, probando si lo que hago es correcto, tengo entendido que una vez logrando dicha instrucción ya sólo debo mandar llamar el método que me retornó el GetProcAddress y mandando como parámetos los tipos declarados con anterioridad. Cualquier cosa estaré reportándome de nuevo. Gracias. |
#6
|
|||
|
|||
Cita:
Hola de nuevo, tengo algunas dudas más específicas acerca de este tema: Tengo entendido que hay dos formas de usar las funciones dentro de la DLL(estática y dinámica), cuando intento llevar a cabo las siguientes lineas de C++ usando el dinámico tengo algo así: Codigo de C++ a replicar(no tal cual, sólo lo que ocupo): Código:
HINSTANCE hInst = LoadLibrary("ITLSSPProc.dll"); if (hInst != NULL) { // Link function names // Opens the COM port OpenPort = (LPFNDLLFUNC1)GetProcAddress(hInst, "OpenSSPComPortUSB"); if (OpenPort == NULL) { FreeLibrary(hInst); THREAD_UNLOCK return false; }
Pero aqui hay dos cosas, si en la línea de la duda pogo el @(que tengo entendido que es como usar un apuntador, pero no se) al evaluarlo me da nil (cosa que no debería pasar si funciona bien la linea del GetProcAddess), si le quito el arroba ni siquiera compila y me arroja el mensaje "Not enough actual parameters" que si no me equivoco es por que está intentando ejecutar la función(Cosa que no trato de hacer, yo sólo quiero saber si el GetProcAddess funcionó). ¿Saben que estoy haciendo mal o cual sería forma correcta de hacer el GetProcAddress? El código completo es:
He intentado con diferentes combinaciones(estáticas y dinámicas) pero no funciona, ahora estoy tratando de apegarme lo más posible a la forma C++ que coloqué. ¿Alguna idea? Si requieren el código y archivos que estoy tratando de usar se los puedo enviar por e-mail |
Herramientas | Buscar en Tema |
Desplegado | |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Llamar Aplicacion externa desde Delphi Fmx Androit | ASAPLTDA | FireMonkey | 4 | 08-08-2018 09:01:03 |
abrir aplicación externa desde delphi y detectar su cierre | petete2008 | API de Windows | 2 | 10-02-2012 11:44:23 |
Llamar a otra aplicacion externa a delphi... | daniel43 | Varios | 2 | 29-12-2010 01:30:44 |
Delphi - HotKey de aplicación externa | fdanielc | Lazarus, FreePascal, Kylix, etc. | 2 | 03-12-2008 20:12:11 |
Usar una aplicación externa desde Delphi | erika.martinez | Varios | 9 | 14-04-2005 18:10:22 |
|