| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
Nelbes
Registrado: 23 Oct 2004 Mensajes: 27
| Publicado: 19/01/2005 11:43 am | | | Título: Como se hace una dll en dev-c |
| | Hola queria saber como se hace una dll en dev-c, la se hacer en visual c pero no en dev, lei el tutorial pero no tengo esa version del dev y cuando compilo el programa de test (el que usa la dll) me aparece un mensaje de error diciendo que no se encuentra la funcion que esta en la dll y no genra el ejecutable, osea el proyecto no tiene en cuenta la dll. La funcion esta declarada como DLLIMPORT en la cabecera del test y la dll y esta en la dll, la dll se compila bien. Gracias |
| | Volver arriba | |  | quique
Registrado: 30 Mar 2004 Mensajes: 720 Ubicación: Por ahí
| Publicado: 21/01/2005 6:46 am | | | Título: |
| Qué version de Dev-C++ tienes? Qué mensaje de error te da? (copialo y pegalo aquí)
Salu2 |
| | Volver arriba | |  | Nelbes
Registrado: 23 Oct 2004 Mensajes: 27
| Publicado: 26/01/2005 3:32 pm | | | Título: |
| Los resultados son los siguientes:
[Linker error] undefined reference to `_imp___Z7funcionv' C:\Documents.......[Build Error] [Proyecto1.exe] Error 1
Lo que yo hago es lo siguiente, por ejemplo:
#include <windows.h>
#include "dll.h"
/* Declare Windows procedure */ LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
/* Make the class name into a global variable */ char szClassName[ ] = "WindowsApp";
int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil)
{ HWND hwnd; /* This is the handle for our window */ MSG messages; /* Here messages to the application are saved */ WNDCLASSEX wincl; /* Data structure for the windowclass */
/* The Window structure */ wincl.hInstance = hThisInstance; wincl.lpszClassName = szClassName; wincl.lpfnWndProc = WindowProcedure; /* This function is called by windows */ wincl.style = CS_DBLCLKS; /* Catch double-clicks */ wincl.cbSize = sizeof (WNDCLASSEX);
/* Use default icon and mouse-pointer */ wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION); wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION); wincl.hCursor = LoadCursor (NULL, IDC_ARROW); wincl.lpszMenuName = NULL; /* No menu */ wincl.cbClsExtra = 0; /* No extra bytes after the window class */ wincl.cbWndExtra = 0; /* structure or the window instance */ /* Use Windows's default color as the background of the window */ wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
/* Register the window class, and if it fails quit the program */ if (!RegisterClassEx (&wincl)) return 0;
/* The class is registered, let's create the program*/ hwnd = CreateWindowEx ( 0, /* Extended possibilites for variation */ szClassName, /* Classname */ "Windows App", /* Title Text */ WS_OVERLAPPEDWINDOW, /* default window */ CW_USEDEFAULT, /* Windows decides the position */ CW_USEDEFAULT, /* where the window ends up on the screen */ 544, /* The programs width */ 375, /* and height in pixels */ HWND_DESKTOP, /* The window is a child-window to desktop */ NULL, /* No menu */ hThisInstance, /* Program Instance handler */ NULL /* No Window Creation data */ );
/* Make the window visible on the screen */ ShowWindow (hwnd, nFunsterStil);
/* Run the message loop. It will run until GetMessage() returns 0 */ while (GetMessage (&messages, NULL, 0, 0)) { /* Translate virtual-key messages into character messages */ TranslateMessage(&messages); /* Send message to WindowProcedure */ DispatchMessage(&messages); }
/* The program return-value is 0 - The value that PostQuitMessage() gave */ return messages.wParam; }
/* This function is called by the Windows function DispatchMessage() */
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc ; PAINTSTRUCT ps ; RECT rect ; switch (message) /* handle the messages */ { case WM_DESTROY: PostQuitMessage (0); /* send a WM_QUIT to the message queue */ break; case WM_PAINT: hdc = BeginPaint (hwnd, &ps) ; GetClientRect (hwnd, &rect) ; DrawText (hdc, funcion (), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER) ; EndPaint (hwnd, &ps) ; return 0 ; default: /* for messages that we don't deal with */ return DefWindowProc (hwnd, message, wParam, lParam); }
return 0; }
con la dll:
/* Replace "dll.h" with the name of your header */ #include "dll.h" #include <windows.h>
DllClass::DllClass() {
}
DllClass::~DllClass () {
}
BOOL APIENTRY DllMain (HINSTANCE hInst /* Library instance handle. */ , DWORD reason /* Reason this function is being called. */ , LPVOID reserved /* Not used. */ ) { switch (reason) { case DLL_PROCESS_ATTACH: break;
case DLL_PROCESS_DETACH: break;
case DLL_THREAD_ATTACH: break;
case DLL_THREAD_DETACH: break; }
/* Returns TRUE on success, FALSE on failure */ return TRUE; }
char* funcion () { static char c[] = "Esta puta dll funciona"; return c; }
Y el archivo de cabecera:
#ifndef _DLL_H_ #define _DLL_H_
#if BUILDING_DLL # define DLLIMPORT __declspec (dllexport) #else /* Not BUILDING_DLL */ # define DLLIMPORT __declspec (dllimport) #endif /* Not BUILDING_DLL */
class DLLIMPORT DllClass { public: DllClass(); virtual ~DllClass(void);
private:
};
DLLIMPORT char* funcion ();
#endif /* _DLL_H_ */ |
| | Volver arriba | |  | | quique
Registrado: 30 Mar 2004 Mensajes: 720 Ubicación: Por ahí
| Publicado: 27/01/2005 2:38 am | | | Título: |
| A pesar de que no me has contestado qué versión del Dev Usas, da lo mismo, intentaré ayudarte 
1) En la sección "Descargas -> Cursos", hay un manual sobre hacer DLLs con Dev-C++. Bájatelo
2) Leete, si puedes, todo el manual, por si tienes algún concepto que no entiendes
3) Si no quieres leerlo o no tienes tiempo o ya sabes de qué va, vete al capítulo III del manual: "Cómo usan otros progamas la DLL"
4) Ahí está descrito como otros programas "linkan estáticamente" la DLL. Dependiendo de la versión del Dev-C++, el archivo LIB no se incluye automáticamente en el proyecto que usa la DLL, por lo que al intentar linkar, te da el error que dices: "undefined reference"
5) Comprueba que en las opciones de proyecto tienes incluído el archivo LIB - Para saber a qué me refiero, leete el Capítulo II del manual
Si tienes más preguntas, aquí estamos
Salu2 |
| | Volver arriba | |  | Nelbes
Registrado: 23 Oct 2004 Mensajes: 27
| Publicado: 27/01/2005 12:34 pm | | | Título: |
| | Perdon, mi version del dev es la 4.9.8.0, tambien lo actualicé y use la ultima. Leí el curso, pero no es para mi version del dev, en el dev del curso hay una ventana que enlaza el programa con la dll cuando uno crea la dll y en mi version no está. Yo agregue el archivo libNOMBRE.a en la casilla"Linker" de la pestaña "Parametros" de la ventana "Opciones de proyecto"en el proyecto del programa que usa la dll, aún asi no funciona, tengo el mismo error, que puede ser?. Encontrás algún error en mi codigo?......gracias |
| | Volver arriba | |  | quique
Registrado: 30 Mar 2004 Mensajes: 720 Ubicación: Por ahí
| Publicado: 31/01/2005 4:16 am | | | Título: |
| Yo tengo la version 4.9.9.0, pero he hecho lo siguiente: 1) Crear una dll con el nombre "DLL". (proyecto-nuevo-DLL) 2) He copiado lo que tu pones en tu post y pegado en mi proyecto 3) Compilado y linkado, sin problemas. Como resultado tengo: - libdll.a - dll.h - dll.dll 4) He creado un nuevo proyecto windows (proyecto-nuevo-Aplicación windows) 5) He copiado y pegado lo que tu pones en el post 6) He intentado compilar, y efectivamente, me daba el error: [Linker error] undefined reference to `_imp___Z7funcionv' 7) Igual que tú, agregue el archivo libdll.a: en mi versión (4.9.9.0), eso ve con "Proyeecto" -> "Opciones de proyecto" -> pestaña "Parametros" -> Botón "Añadir biblioteca u objeto".
Vuelvo a compilar, y funciona
Parece que lo que tu haces está bien. Una pregunta que se me ocurre: - Tienes el archivo libdll.a en LA MISMA CARPETA que el proyecto que USA la DLL? - Y el .h? Y la DLL?

Salu2 |
| | Volver arriba | |  | | Nelbes
Registrado: 23 Oct 2004 Mensajes: 27
| Publicado: 31/01/2005 10:35 am | | | Título: |
| Si tengo todo en la misma carpeta. La verdad no se que puede ser, hago exactamente lo que tu has dicho, voy a intentar de nuevo. en la casilla de "Parametros" me aparece libdll.a nada mas supongo que igual que a vos, sin la ruta especificada, no se me ocurre que pasa. Gracias por todo. Salu2 |
| | Volver arriba | |  | Nelbes
Registrado: 23 Oct 2004 Mensajes: 27
| Publicado: 03/02/2005 5:32 pm | | | Título: |
| Encontre el error, probe bastante sistematicamente y llegue a la conclusion de que es por la version del software que estaba usando, asi que les recomiendo no usar la version del dev-c++ 4.9.8.0...garacias por todo salu2 |
| | Volver arriba | |  | anairam
Registrado: 22 Jun 2007 Mensajes: 1
| Publicado: 22/06/2007 2:53 pm | | | Título: |
| | Hola! Me gustaría saber donde exactamente puedo conseguir el tutorial que sugirió Quique. Al menos acá no lo encontré. Soy nueva en el foro y me urge aprender a crear DLLs |
| | Volver arriba | |  | | hynuser
Registrado: 11 Ago 2007 Mensajes: 2
| Publicado: 11/08/2007 11:42 am | | | Título: |
| | Cita: | 1) En la sección "Descargas -> Cursos", hay un manual sobre hacer DLLs con Dev-C++. Bájatelo
|
No encuentro el manual, podeis poner un link directo?
Saludos!! |
| | Volver arriba | |  | | |
| No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|
| |