![]() |
![]() |
| Paypal | 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
|
|||
|
|||
|
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. |
![]() |
|
|
|