Ver la versión completa : [Ayuda] ¿Se puede llamar a una DLL dentro de otra DLL?
Puck2099
23/06/2009, 10:12
Hola,
Estoy desarrollando en el trabajo una DLL en Visual C para que sea llamada desde una aplicación en Visual Basic, pues bien, desde la DLL que estoy creando necesitaría hacer llamadas a una DLL externa (concretamente libtiff).
A la hora de compilar si le pongo el parámetro /c para que no enlace me dice que no se pueden encontrar las funciones que uso de libtiff (aunque en el proyecto he importado el libtiff_i.lib) y si no uso este parámetro me las encuentra y no da problemas por ahí, pero me dice que no se puede encontrar el punto de entrada (puesto que al ser una DLL no hay un main).
¿Alguien sabe si estoy haciendo algo mal o es imposible llamar a una DLL desde dentro de otra? No creo que sea imposible, pues entonces no se podrían llamar a las funciones básicas de C, pero ya estoy quemadísimo haciendo pruebas y no saco nada en claro...
Muchas gracias :brindis:
EDITO: Los errores son:
Cuando no encuentra la función:
error LNK2001: unresolved external symbol _TIFFClose@4
Cuando no encuentra el punto de entrada:
LINK : fatal error LNK1561: entry point must be defined
flozanot
23/06/2009, 10:25
Hola,
Estoy desarrollando en el trabajo una DLL en Visual C para que sea llamada desde una aplicación en Visual Basic, pues bien, desde la DLL que estoy creando necesitaría hacer llamadas a una DLL externa (concretamente libtiff).
A la hora de compilar si le pongo el parámetro /c para que no enlace me dice que no se pueden encontrar las funciones que uso de libtiff (aunque en el proyecto he importado el libtiff_i.lib) y si no uso este parámetro me las encuentra y no da problemas por ahí, pero me dice que no se puede encontrar el punto de entrada (puesto que al ser una DLL no hay un main).
¿Alguien sabe si estoy haciendo algo mal o es imposible llamar a una DLL desde dentro de otra? No creo que sea imposible, pues entonces no se podrían llamar a las funciones básicas de C, pero ya estoy quemadísimo haciendo pruebas y no saco nada en claro...
Muchas gracias :brindis:
EDITO: Los errores son:
Cuando no encuentra la función:
error LNK2001: unresolved external symbol _TIFFClose@4
Cuando no encuentra el punto de entrada:
LINK : fatal error LNK1561: entry point must be defined
Tienes que crear la DLL enlazándola con libtiff.
Si le dices que quieres crear un ejecutable, normal que te pete.
Project Workspace->MFC App Wizard (dll)
Puck2099
23/06/2009, 10:43
Tienes que crear la DLL enlazándola con libtiff.
Si le dices que quieres crear un ejecutable, normal que te pete.
Project Workspace->MFC App Wizard (dll)
No, no he creado un ejecutable sino un proyecto basado en "Win32 Dynamic-Link Library"...
¿Las DLL de MFC funcionarán bien en Visual Basic 6?
flozanot
23/06/2009, 10:59
No, no he creado un ejecutable sino un proyecto basado en "Win32 Dynamic-Link Library"...
¿Las DLL de MFC funcionarán bien en Visual Basic 6?
Las DLL de MFC funcionan bien en Visual Basic 6.
Te paso el .dsp de una dll que hize que tiraba de libgmp.dll (la gnu bignum)
# Microsoft Developer Studio Project File - Name="cripto" - Package Owner=<4>
# Microsoft Developer Studio Generated Build File, Format Version 6.00
# ** DO NOT EDIT **
# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
CFG=cripto - Win32 Debug
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
!MESSAGE use the Export Makefile command and run
!MESSAGE
!MESSAGE NMAKE /f "cripto.mak".
!MESSAGE
!MESSAGE You can specify a configuration when running NMAKE
!MESSAGE by defining the macro CFG on the command line. For example:
!MESSAGE
!MESSAGE NMAKE /f "cripto.mak" CFG="cripto - Win32 Debug"
!MESSAGE
!MESSAGE Possible choices for configuration are:
!MESSAGE
!MESSAGE "cripto - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE "cripto - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE
# Begin Project
# PROP AllowPerConfigDependencies 0
# PROP Scc_ProjName ""
# PROP Scc_LocalPath ""
CPP=cl.exe
MTL=midl.exe
RSC=rc.exe
!IF "$(CFG)" == "cripto - Win32 Release"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "Release"
# PROP BASE Intermediate_Dir "Release"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "Release"
# PROP Intermediate_Dir "Release"
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CRIPTO_EXPORTS" /YX /FD /c
# ADD CPP /nologo /MT /W3 /GX /O2 /I "I:\Archivos de programa\Java\jdk1.6.0_10\include" /I "I:\Archivos de programa\Java\jdk1.6.0_10\include\win32" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CRIPTO_EXPORTS" /YX /FD /c
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
# ADD BASE RSC /l 0xc0a /d "NDEBUG"
# ADD RSC /l 0xc0a /d "NDEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
!ELSEIF "$(CFG)" == "cripto - Win32 Debug"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir "Debug"
# PROP BASE Intermediate_Dir "Debug"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "Debug"
# PROP Intermediate_Dir "Debug"
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CRIPTO_EXPORTS" /YX /FD /GZ /c
# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "I:\Archivos de programa\Java\jdk1.6.0_10\include" /I "." /I "I:\Archivos de programa\Java\jdk1.6.0_10\include\win32" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CRIPTO_EXPORTS" /YX /FD /GZ /c
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
# ADD BASE RSC /l 0xc0a /d "_DEBUG"
# ADD RSC /l 0xc0a /d "_DEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
!ENDIF
# Begin Target
# Name "cripto - Win32 Release"
# Name "cripto - Win32 Debug"
# Begin Group "Source Files"
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
# Begin Source File
SOURCE=.\src\AESimp.c
# End Source File
# Begin Source File
SOURCE=.\src\RSAimp.c
# End Source File
# Begin Source File
SOURCE=".\src\SHA-1imp.c"
# End Source File
# Begin Source File
SOURCE=.\src\VernamImp.c
# End Source File
# End Group
# Begin Group "Header Files"
# PROP Default_Filter "h;hpp;hxx;hm;inl"
# Begin Source File
SOURCE=.\src\AES.h
# End Source File
# Begin Source File
SOURCE=.\src\AES_tables.h
# End Source File
# Begin Source File
SOURCE=.\src\RSA.h
# End Source File
# Begin Source File
SOURCE=.\src\SHA1.h
# End Source File
# Begin Source File
SOURCE=.\src\Vernam.h
# End Source File
# End Group
# Begin Group "Resource Files"
# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
# End Group
# Begin Source File
SOURCE=.\dep\gmp.lib
# End Source File
# End Target
# End Project
Es un proyecto para construir una dll que será llamada desde java y que depende de la GNU bignum (gmp.dll)
civantoz
23/06/2009, 11:02
Pues una libreria, una vez compilada, da igual en que esté hecha, debes poder enlazarla con cualquier lenguaje.
En cuanto a lo de enlazar una libreria desde otra, se me ocurre que puedes hacerlo como los machotes (no se como lo estas haciendo ahora), tirando de API, con combos de funciones como LoadLibrary, GetModuleHandle y GetProcAddress. No te garantizo que tire, pero es una alternativa a probar... ahora si me vas a pedir ayuda concreta con esas funciones, te digo que hace literalmente años que no las uso :D pero en cualquier tutorial de crackers, inyección de dll y demás seguro que tienes bastante código de ejemplo de como usarlas xD
Saludos !
se pueden llamar, y deviera dejarte hacer enlaces estaticos, la otra forma seria "a lo bruto", osea usar el "LoadLibrariA" y la funcion de localicación de funciones (no recuerdo el nombre) y ya ta.
Lo correcto es linkar el archivo .lib que llama a la otra DLL como estás haciendo. Aunque las DLLs no tienen Main(), sí que tienen un punto de entrada muy parecido que es DllMain(). De hecho esta función te la crea el asistente de VC. Te dejo un artículo sobre crear DLLs en C para Visual Basic. También explica cómo pasar los distintos tipos de parámetros.
Interfacing Visual Basic and C (http://www.flipcode.com/archives/Interfacing_Visual_Basic_And_C.shtml)
Si que puedes y tienes que ir a herramientas e incluir TODAS las referencias de las DLL que necesiten tu proyecto, aunque esten en el sistema, si no estan incluidas en el proyecto, no resolvera su dependencia y te da esos fallos ;)
Puck2099
23/06/2009, 19:28
Pues al final ha sido tan sencillo como hacer exactamente los mismos pasos, pero usando un MFC DLL en lugar de la biblioteca de enlace dinámico y todo funcionó a la primera :loco:
Gracias a todos :brindis:
vizales77
23/06/2009, 21:27
virgencitadelamorhermoso... :-P
Pues al final ha sido tan sencillo como hacer exactamente los mismos pasos, pero usando un MFC DLL en lugar de la biblioteca de enlace dinámico y todo funcionó a la primera :loco:
Gracias a todos :brindis:
No se muy bien porque, pero tengo algo en contra de MFC.
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions Inc. All rights reserved.