donde se encuentra GetProcAddress()

Post Reply
User avatar
Arturo Lopesoria
Posts: 84
Joined: Fri Aug 10, 2007 1:47 am
Location: Mexico DF
Contact:

donde se encuentra GetProcAddress()

Post 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)))
{
Arturo LS
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: donde se encuentra GetProcAddress()

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

Antonio Linares
www.fivetechsoft.com
User avatar
Arturo Lopesoria
Posts: 84
Joined: Fri Aug 10, 2007 1:47 am
Location: Mexico DF
Contact:

Re: donde se encuentra GetProcAddress()

Post 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 ???
Arturo LS
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: donde se encuentra GetProcAddress()

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

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

Re: donde se encuentra GetProcAddress()

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

Antonio Linares
www.fivetechsoft.com
User avatar
Arturo Lopesoria
Posts: 84
Joined: Fri Aug 10, 2007 1:47 am
Location: Mexico DF
Contact:

Re: donde se encuentra GetProcAddress()

Post 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.
Arturo LS
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: donde se encuentra GetProcAddress()

Post by Antonio Linares »

Arturo,

Es correcto lo que comentas :-)

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

Antonio Linares
www.fivetechsoft.com
Post Reply