Nuevas NORMAS para el foro

Curso Hacker
Bienvenido(a), Visitante. Favor de ingresar o registrarse. - Julio 06, 2008, 05:38:43
Boton Buscar
Inicio Ayuda Ingresar Registrarse
Visita: Articulos - Juegos Gratis - Da Foros

Comunidad Underground Hispana  |  Programacion  |  Programación  |  Carbide C/C#/C++  |  Tema: vinculación dinámica a una dll 0 Usuarios y 1 Visitante están viendo este tema. « anterior próximo »
Páginas: [1] Ir Abajo Imprimir
Autor Tema: vinculación dinámica a una dll  (Leído 74 veces)
dueñas
Recien Llegado
*
Desconectado Desconectado

Mensajes: 7


Ver Perfil Email
« en: Abril 10, 2008, 02:24:55 »

Hola, muy buenas.  Resulta que me he hecho con Visual Studio 2005 una dll con C++, con las funciones de un código que ya tenía.  Ahora estoy intentando hacer un programa que se vincule dinámicamente a la dll para poder usar sus funciones, pero el problema es que, al no haberlo hecho nunca antes, creo que lo estoy haciendo mal.  Posteo aquí el código de la vinculación que estoy realizando:

#include "stdafx.h"
#include <windows.h>
#include <stdlib.h>
#include <iostream>
#include "lSendHexFile.h"

typedef UINT (CALLBACK* LPFNDLLFUNC1)(DWORD,UINT);

LPFNDLLFUNC1 ReadID, ReadPM, ReadEE, SendHexFile;    // Function pointer

#define BUFFER_SIZE 4096

int _tmain(int argc, _TCHAR* argv[])
{
   HANDLE   ComDev ;
   char *   pInterfaceName = "COM1";
   char *   pReadPMAddress = NULL;
   char *   pReadEEAddress = NULL;
   char *   pBaudRate      = "115200";
   FILE *   pFile          = NULL;
   eFamily  Family;
   char Buffer[BUFFER_SIZE];
   HINSTANCE hDll;

   hDll = LoadLibrary("lSendHexFile.dll");  // cargar librería
   ReadID = (LPFNDLLFUNC1) GetProcAddress(hDll, "ReadID");
                ReadPM = (LPFNDLLFUNC1) GetProcAddress(hDll, "ReadPM");
                ReadEE = (LPFNDLLFUNC1) GetProcAddress(hDll, "ReadEE");
                SendHexFile = (LPFNDLLFUNC1) GetProcAddress(hDll, "SendHexFile");

//   Read Device ID
      Family = ReadID(&ComDev);

//   Process Read PM request and exit
      if(pReadPMAddress != NULL)
      {
         ReadPM(&ComDev, Buffer, pReadPMAddress, Family);
         return 0;
      }
   
//   Process Read EEPROM request and exit
      if(pReadEEAddress != NULL)
      {
         ReadEE(&ComDev, Buffer, pReadEEAddress, Family);
         return 0;
      }
       return 0;

   FreeLibrary(hDll);    // descargar librería
   return EXIT_SUCCESS;
}

Me da cuatro errores de compilación, y agradecería muchísimo que alguien me comentase algo para que estos errores no reaparezcan y consiga de una vez saber como se hacen las vinculaciones dinámicas.

Muchas gracias por adelantado.  Un saludo.
En línea
dueñas
Recien Llegado
*
Desconectado Desconectado

Mensajes: 7


Ver Perfil Email
« Respuesta #1 en: Abril 10, 2008, 02:45:35 »

Hola de nuevo.  Quería postear los errores que me dan, que si no os lo pongo difícil:

error C2664: 'LoadLibraryW' : no se puede convertir el parámetro 1 de 'const char [17]' a ' LPCWSTR'.  línea 32.
error C2198: 'LPFNDLLFUNC1' : no hay suficientes argumentos para la llamada.  línea 39.
error C2197: 'LPFNDLLFUNC1' : hay demasiados argumentos para la llamada. línea 44.
error C2197: 'LPFNDLLFUNC1' : hay demasiados argumentos para la llamada. línea 51.

Muchas gracias de nuevo.
En línea
dueñas
Recien Llegado
*
Desconectado Desconectado

Mensajes: 7


Ver Perfil Email
« Respuesta #2 en: Abril 11, 2008, 03:50:10 »

Hola, ya está solucionado.  Por si a alguien le ocurre lo mismo, digo lo que hice:

en las propiedades del proyecto, lo he configurado como utilizar juego de caracteres multibyte en lugar de unicode.

Crear un LPFNDLLFUNC diferente para cada función a la que se refiere, con sus respectivos parámetros.

Un saludo.
En línea
~[L]~
Visitante
« Respuesta #3 en: Abril 16, 2008, 04:15:58 »


Aún así podés configurar el proyecto para que use Unicode y usar las versiones ansi de las funciones de la api de win por ej.

Ejemplo :  MessageBox() es un define, o sea, si esta definido _UNICODE, define MessageBox como MessageBoxW y si no, Ansi....  MessageBoxA

siempre las funciones tienen su version ansi y unicode, las ansi tienen el sufijo A y unicode W (de wide)

LoadLibraryA() es la version ansi ^^

Sayonara^^
« Última modificación: Abril 16, 2008, 04:17:36 por ~[L]~ » En línea
Páginas: [1] Ir Arriba Imprimir 
Comunidad Underground Hispana  |  Programacion  |  Programación  |  Carbide C/C#/C++  |  Tema: vinculación dinámica a una dll « anterior próximo »
Ir a:  


Ranking-Hits
Powered by SMF 1.1.5 | SMF © 2006-2007, Simple Machines LLC