Page 1 of 1

donde se encuentra GetProcAddress()

Posted: Thu Feb 19, 2009 2:03 am
by Arturo Lopesoria
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)))
{

Re: donde se encuentra GetProcAddress()

Posted: Thu Feb 19, 2009 9:27 am
by Antonio Linares
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 );

Re: donde se encuentra GetProcAddress()

Posted: Thu Feb 19, 2009 3:12 pm
by Arturo Lopesoria
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 ???

Re: donde se encuentra GetProcAddress()

Posted: Thu Feb 19, 2009 6:57 pm
by Antonio Linares
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.

Re: donde se encuentra GetProcAddress()

Posted: Thu Feb 19, 2009 7:06 pm
by Antonio Linares
Arturo,

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
 

Re: donde se encuentra GetProcAddress()

Posted: Fri Feb 20, 2009 12:25 pm
by Arturo Lopesoria
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.

Re: donde se encuentra GetProcAddress()

Posted: Fri Feb 20, 2009 12:58 pm
by Antonio Linares
Arturo,

Es correcto lo que comentas :-)

Aqui tienes impdef.exe:
http://www.mediafire.com/?sharekey=414c ... eaa7bc68bc