FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
Dll+Builder? como?
Buenas.
Me encuentro trabajando en un proyecto de control y monitoreo usando para ello el puerto usb de mi computador; la cuestion es : 1. que necesito incluir las funciones de una dll que son las que se comunican con el puerto y no c como es que puedo accesar a ellas desde el builder ; tengo la dll y ademas un archivo .cpp con las descripciones de las funciones y todo pero Que hago con esto? he revisado los hilos del foro y he visto que Delphi puede comunicarse directamente a la api; pero no c nada de delphi; y el proyecto debe ser en builder . 2 los archivos son los que da la microchip para trabajar con PIC18f4550 con el cual ya tengo todo listo ; lo he probado con un programa de ejemplo que dan en otra pagina ( programado en delphi para mi pesar ) y funciona; dan el codigo fuente y todo; pero la api esta escrita en C Builder (ironico no?) he modificado el codigo del pic y puedo hacer que varias cosas distintas pero lo interesante queda dependiendo del programa en el PC ya que no puedo modificar este programa. sin alguien tiene alguna sugerencia. 4 los archivos son: mpusbapi.dll ;_mpusbapi.cpp; _mpusbapi.h Muchisimas gracias de Antemano Última edición por aleph fecha: 22-12-2005 a las 15:24:23. |
#2
|
||||
|
||||
Estas de buenas:
Código:
#include <vcl.h> #include <windows.h> #include <string.h> #pragma hdrstop //--------------------------------------------------------------------------- #pragma argsused BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved) { return 1; } extern "C" { struct caso { char Ced[50]; int Lon; }; void __declspec(dllexport) WINAPI LongitudCad(caso *Caso) { Caso->Lon=strlen(Caso->Ced); } } Código:
#include <vcl.h> #pragma hdrstop #include "Unit1.h" #include "string.h" #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; const char DLL_PRUEBA[13] = "Longitud.dll"; struct caso { char Ced[50]; int Lon; }; void __stdcall (*F)(caso *); //------------------------------------------------------------------------------ __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } void __fastcall TForm1::Button1Click(TObject *Sender) { caso Caso; HINSTANCE Handle = LoadLibrary(DLL_PRUEBA); if( Handle) { F=(void (__stdcall *)(caso *))GetProcAddress(Handle,"LongitudCad"); if(!F) return; strcpy(Caso.Ced,Edit1->Text.c_str()); F(&Caso); ShowMessage("Longitud: "+IntToStr(Caso.Lon)+" caracteres."); } } Código:
#ifndef Unit1H #define Unit1H //--------------------------------------------------------------------------- #include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> //--------------------------------------------------------------------------- class TForm1 : public TForm { __published: // IDE-managed Components TButton *Button1; TEdit *Edit1; void __fastcall Button1Click(TObject *Sender); private: // User declarations public: // User declarations __fastcall TForm1(TComponent* Owner); }; //--------------------------------------------------------------------------- extern PACKAGE TForm1 *Form1; //--------------------------------------------------------------------------- #endif
__________________
Los Estados Unidos parecen destinados por la Providencia para plagar la América de miserias a nombre de la libertad." Simón Bolívar (Carta al Coronel Inglés Patricio Cambell 05/08/1829). |
#3
|
|||
|
|||
gracias ; pero tengo unas dudas; cuando la funcion tiene mas de un parametro como debo llamarla? agrego los parametros uno a continuacion del otro?. en el codigo aparece_:
F=(void (__stdcall *)(caso *))GetProcAddress(Handle,"LongitudCad" no estoy muy claro; que hace F en el codigo: F(&Caso); otra cosa es que algunas de las funciones retornan un valor y no se que hacer en ese caso. disculpa las molestias Última edición por aleph fecha: 06-01-2006 a las 20:03:48. |
#4
|
||||
|
||||
eres afortunado otra vez, era el ultimo vistazo q echaba a estos hilos :
F es un puntero a una función, alli se carga " por decirlo así " (Marteens tiene tiempo para explicarlo mejor) una referencia a ella, tal como ves en ese " F(&Caso) " la linea " F=(void (__stdcall *)(caso *))GetProcAddress(Handle,"LongitudCad"); " dice q F referirá a una función q "nada devuelve (void)" q se llama "LongitudCad" y sera obtenida de la DLL cargada en Handle y q tiene como parámetro un puntero a una estructura de tipo "caso", si tiene mas paràmetros pues los agregas uno tras otro tanto en la DLL como en la linea anterior en la parte "(caso *,...)" y si devuelve valor sería " F=( tipo_de_valor (__stdcall... " otra cosa..mosca con lo devuelto, es corto el tiempo para explicarlo todo...es mejor q devuelvas valores por parámetros usanso punteros o referencias por &
__________________
Los Estados Unidos parecen destinados por la Providencia para plagar la América de miserias a nombre de la libertad." Simón Bolívar (Carta al Coronel Inglés Patricio Cambell 05/08/1829). |
#5
|
|||
|
|||
Voy a ver todo eso; si alguna ves vuelves a revisar este hilo te dejo por escrito las gracias; por tu tiempo y por darme una mano. GRACIAS
|
#6
|
|||
|
|||
gracias
perfecto aprendi mucho con lo que escribiste gracias todo funciona a la perfeccion, toco hacer unas cuantas cosillas mas pero la base fue lo mas importante despues de sto todo fue mas facil
|
#7
|
|||
|
|||
Hola,
Aleph, estoy con un proyecto igual al tuyo. Yo el tema de la comunicacion con la dll, la tengo resuelta, pero al pasar al codigo de delphi a c, algo tengo que haber hecho mal ya que no responde a las comunicaciones. Le estoy dando vueltas pero nada... ¿Has conseguido comunicarte con el pic? Un saludo. |
|
|
|