donde se encuentra GetProcAddress()

donde se encuentra GetProcAddress()

Postby Arturo Lopesoria » Thu Feb 19, 2009 2:03 am

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)))
{
Arturo LS
User avatar
Arturo Lopesoria
 
Posts: 94
Joined: Fri Aug 10, 2007 1:47 am
Location: Mexico DF

Re: donde se encuentra GetProcAddress()

Postby Antonio Linares » Thu Feb 19, 2009 9:27 am

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 );
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42122
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: donde se encuentra GetProcAddress()

Postby Arturo Lopesoria » Thu Feb 19, 2009 3:12 pm

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
User avatar
Arturo Lopesoria
 
Posts: 94
Joined: Fri Aug 10, 2007 1:47 am
Location: Mexico DF

Re: donde se encuentra GetProcAddress()

Postby Antonio Linares » Thu Feb 19, 2009 6:57 pm

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.
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42122
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: donde se encuentra GetProcAddress()

Postby Antonio Linares » Thu Feb 19, 2009 7:06 pm

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  Expand view  RUN
#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
 
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42122
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: donde se encuentra GetProcAddress()

Postby Arturo Lopesoria » Fri Feb 20, 2009 12:25 pm

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.
Arturo LS
User avatar
Arturo Lopesoria
 
Posts: 94
Joined: Fri Aug 10, 2007 1:47 am
Location: Mexico DF

Re: donde se encuentra GetProcAddress()

Postby Antonio Linares » Fri Feb 20, 2009 12:58 pm

Arturo,

Es correcto lo que comentas :-)

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

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42122
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain


Return to FiveWin para Pocket PC

Who is online

Users browsing this forum: No registered users and 4 guests