Tengo un error de linkeo UNRESOLVED EXTERNAL GetProcAddress
la linea de codigo que genera el error es:
lpZipCreateFile = (ZipCreateFilePtr *)GetProcAddress(zipDll, ZIPCREATEFILENAME);
(A proposito se trata de probar LiteZip.dll que me sugiere JL Capel en mi post anterior)
ESTOY UTILIZANDO EL BUILD DE AUGOST 2007, poruqe hasta hoy no me ha dado ningun problema, mi g2.bat ha sido el mismo que he usado desde el principio.
Saludos.
INCLUYO PARTE DEL SOURCE:
#pragma BEGINDUMP
#include <windows.h>
#include <tchar.h>
// Include LiteZip.h for creating a ZIP archive
#include "LiteZip.h"
// Where we store the pointers to LiteZip.dll's functions that we call
ZipCreateFilePtr *lpZipCreateFile;
ZipAddFilePtr *lpZipAddFile;
ZipClosePtr *lpZipClose;
ZipFormatMessagePtr *lpZipFormatMessage;
HB_FUNC( CREAZIP )
{
LPWSTR sZipfile = AnsiToWide( hb_parc( 1 ) );
HMODULE zipDll;
HZIP hz;
DWORD result;
// Open the LiteZip.DLL. Note: If LiteZip.dll is not placed in a path that can be found
// by this app, then LoadLibrary will fail. So, either copy LiteZip.dll to the same
// directory as this EXE, or to some directory that Windows is set to search.
if ((zipDll = (HMODULE)LoadLibrary(_T("LiteZip.dll"))))
{
// Get the addresses of 4 functions in LiteZip.dll -- ZipCreateFile(), ZipAddFile()
// ZipClose(), and ZipFormatMessage.
lpZipCreateFile = (ZipCreateFilePtr *)GetProcAddress(zipDll, ZIPCREATEFILENAME);
lpZipAddFile = (ZipAddFilePtr *)GetProcAddress(zipDll, ZIPADDFILENAME);
lpZipClose = (ZipClosePtr *)GetProcAddress(zipDll, ZIPCLOSENAME);
lpZipFormatMessage = (ZipFormatMessagePtr *)GetProcAddress(zipDll, ZIPFORMATMESSAGENAME);
// Create a ZIP archive on disk named as sZipfile
if (!(result = lpZipCreateFile(&hz, sZipfile, 0)))
{
donde se encuentra GetProcAddress()
- Arturo Lopesoria
- Posts: 84
- Joined: Fri Aug 10, 2007 1:47 am
- Location: Mexico DF
- Contact:
donde se encuentra GetProcAddress()
Arturo LS
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
Re: donde se encuentra GetProcAddress()
Arturo,
Tienes que usar GetProcAddressW( HMODULE hModule, WCHAR * cProcName ); que es para unicode.
Ojo que cProcName tiene que ser proporcionado en unicode, por lo que tienes que llamar a estas funciones:
WCHAR * AnsiToWide( char * );
...
WCHAR * pW = AnsiToWide( "nombre_funcion" );
usas pW
y liberas su memoria despues de usarlo:
hb_xfree( ( void * ) pW );
Tienes que usar GetProcAddressW( HMODULE hModule, WCHAR * cProcName ); que es para unicode.
Ojo que cProcName tiene que ser proporcionado en unicode, por lo que tienes que llamar a estas funciones:
WCHAR * AnsiToWide( char * );
...
WCHAR * pW = AnsiToWide( "nombre_funcion" );
usas pW
y liberas su memoria despues de usarlo:
hb_xfree( ( void * ) pW );
- Arturo Lopesoria
- Posts: 84
- Joined: Fri Aug 10, 2007 1:47 am
- Location: Mexico DF
- Contact:
Re: donde se encuentra GetProcAddress()
Gracias, ya estoy intentando con GetProcAddressW() en lugar de GetProcAddress(), aun no lo logro porque se casi nada de C y menos de tipos de variable, pero por lo pronto GetProcAddressW() igual me marca "undefined assuming external..." pienso que me falta alguna libreria ???
Arturo LS
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
Re: donde se encuentra GetProcAddress()
Arturo,
La función GetProcAddressW() es proporcionada por coredll.lib, que es una librería de importación del propio coredll.dll de Windows Mobile.
La función GetProcAddressW() es proporcionada por coredll.lib, que es una librería de importación del propio coredll.dll de Windows Mobile.
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
Re: donde se encuentra GetProcAddress()
Arturo,
Aqui tienes un pequeño ejemplo que usa LoadLibrary() y GetProcAddressW() y que aqui compila y genera el EXE bien:
test.prg
Aqui tienes un pequeño ejemplo que usa LoadLibrary() y GetProcAddressW() y que aqui compila y genera el EXE bien:
test.prg
Code: Select all
#include "FWCE.ch"
function Main()
MsgInfo( Test() )
return nil
#pragma BEGINDUMP
#include <hbapi.h>
#include <windows.h>
HMODULE GetProcAddressW( HMODULE, WCHAR * );
HB_FUNC( TEST )
{
HMODULE hModule = LoadLibrary( L"coredll.dll" );
hb_retnl( ( LONG ) GetProcAddressW( hModule, L"MessageBoxW" ) );
FreeLibrary( hModule );
}
#pragma ENDDUMP
- Arturo Lopesoria
- Posts: 84
- Joined: Fri Aug 10, 2007 1:47 am
- Location: Mexico DF
- Contact:
Re: donde se encuentra GetProcAddress()
Gracias, con lo que me mandaste pude comprobar que la dll que estoy intentando no puede cargarse, probablemente porque la lib no esta para ARM. Ahora, si entendi bien lo leido aqui en los foros, si yo tengo LiteZip.dll y LiteZip.lib, necesito lo siguiente:
Para obtener LiteZip.def:
impdef.exe LiteZip.def LiteZip.dll
Y luego obtendria un nuebo LiteZip.lib con esto:
c:\vce\bin\lib /def:LiteZip.def /machine:ARM
Mi problema es que bajo c:\vce\bin unicamente tengo lib.exe, pero no tengo impdef.exe
-Estoy bien?
-Como obtengo impdef.exe?
- me hara falta algo mas?
Saludos.
Para obtener LiteZip.def:
impdef.exe LiteZip.def LiteZip.dll
Y luego obtendria un nuebo LiteZip.lib con esto:
c:\vce\bin\lib /def:LiteZip.def /machine:ARM
Mi problema es que bajo c:\vce\bin unicamente tengo lib.exe, pero no tengo impdef.exe
-Estoy bien?
-Como obtengo impdef.exe?
- me hara falta algo mas?
Saludos.
Arturo LS
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
Re: donde se encuentra GetProcAddress()
Arturo,
Es correcto lo que comentas
Aqui tienes impdef.exe:
http://www.mediafire.com/?sharekey=414c ... eaa7bc68bc
Es correcto lo que comentas
Aqui tienes impdef.exe:
http://www.mediafire.com/?sharekey=414c ... eaa7bc68bc