Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Dll+Builder? como? (https://www.clubdelphi.com/foros/showthread.php?t=28524)

aleph 22-12-2005 00:50:28

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

OSKR 22-12-2005 23:41:32

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);

}

}


este es el codigo de la DLL....y este es el codigo del cpp q la carga:
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.");

}

}


este el el .h:
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



aleph 26-12-2005 20:06:56

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,&quot;LongitudCad&quot;);



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

OSKR 27-12-2005 22:24:04

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 &

aleph 29-12-2005 21:45:12

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

aleph 16-09-2006 01:00:09

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

//xx\\ 17-11-2006 21:23:15

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.


La franja horaria es GMT +2. Ahora son las 06:23:36.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi