Hi Xavi,

Another method, and this is what we use consistently 
in Harbour, is to #define _WIN32_WINNT to 0x0500.

Though probably we should rather use GetProcAddress() 
for GetLongPathName() to not break apps running on 
older Windows versions.

Brgds,
Viktor

On 2010 Feb 13, at 14:15, Xavi wrote:

> Thanks Viktor,
> 
> IMHO before we need to know how to set the minimum version of Windows.
> Usually this is done by defining in the final project _WIN32_WINNT.
> So the code would look something like this .-
> 
> ...
> 
> #if ( _WIN32_WINNT >= 0x0500 ) && ! defined( HB_OS_WIN_CE )
> #  define HBDI_L_FGPN( p1, p2, p3 ) GetLongPathName( p1, p2, p3 )
> #  define HBDI_S_FGPN( p1, p2, p3 ) GetShortPathName( p1, p2, p3 )
> #else
> #  define HBDI_L_FGPN( p1, p2, p3 ) GetShortPathName( p1, p2, p3 )
> #  define HBDI_S_FGPN( p1, p2, p3 ) GetShortPathName( p1, p2, p3 )
> #endif
> 
> static DWORD hbi_GetShortLongPathName( HB_BOOL bLong )
> {
>   void * hPath;
>   DWORD length = 0;
>   LPCTSTR lpszInPath = HB_PARSTR( 1, &hPath, NULL );
> 
>   if( lpszInPath )
>   {
>      if( HB_ISBYREF( 2 ) )
>      {
>         TCHAR buffer[ HB_PATH_MAX ];
>         DWORD cchBuffer = ( DWORD ) HB_SIZEOFARRAY( buffer );
>         LPTSTR lpszOutPath = buffer;
>         HB_BOOL fSize = HB_ISNUM( 3 );
> 
>         if( fSize ) /* size fixed by user */
>         {
>            cchBuffer = ( DWORD ) hb_parnl( 3 );
>            if( cchBuffer == 0 )
>               lpszOutPath = NULL;
>            else if( cchBuffer > ( DWORD ) HB_SIZEOFARRAY( buffer ) )
>               lpszOutPath = ( LPTSTR ) hb_xgrab( cchBuffer * sizeof( TCHAR ) 
> );
>         }
> 
>         length = bLong ? HBDI_L_FGPN( lpszInPath, lpszOutPath, cchBuffer ) :
>                          HBDI_S_FGPN( lpszInPath, lpszOutPath, cchBuffer ) ;
> 
>         if( !fSize && length > cchBuffer )  /* default buffer size was too 
> small */
>         {
>            cchBuffer = length;
>            lpszOutPath = ( LPTSTR ) hb_xgrab( cchBuffer * sizeof( TCHAR ) );
> 
>            length = bLong ? HBDI_L_FGPN( lpszInPath, lpszOutPath, cchBuffer ) 
> :
>                             HBDI_S_FGPN( lpszInPath, lpszOutPath, cchBuffer ) 
> ;
>         }
>         hbwapi_SetLastError( GetLastError() );
>         HB_STORSTRLEN( lpszOutPath, length > cchBuffer ? 0 : length, 2 );
> 
>         if( lpszOutPath && lpszOutPath != buffer )
>            hb_xfree( lpszOutPath );
>      }
>      else
>      {
>         length = bLong ? HBDI_L_FGPN( lpszInPath, NULL, 0 ) :
>                          HBDI_S_FGPN( lpszInPath, NULL, 0 ) ;
> 
>         hbwapi_SetLastError( GetLastError() );
>      }
>   }
>   hb_strfree( hPath );
>   return length;
> }
> 
> HB_FUNC( WAPI_GETLONGPATHNAME )
> {
> #if ( _WIN32_WINNT >= 0x0500 ) && ! defined( HB_OS_WIN_CE )
>   hb_retnl( hbi_GetShortLongPathName( HB_TRUE ) );
> #else
>   hbwapi_SetLastError( ERROR_INVALID_FUNCTION );
>   hb_retnl( 0 );
> #endif
> }
> 
> HB_FUNC( WAPI_GETSHORTPATHNAME )
> {
>   hbi_GetShortLongPathName( HB_FALSE );
> }
> 
> ...
> 
> I think we can not fix this definition inside Harbor should be passed by the 
> user.
> What do you think about this?
> 
> Best regards,
> Xavi
> _______________________________________________
> Harbour mailing list (attachment size limit: 40KB)
> Harbour@harbour-project.org
> http://lists.harbour-project.org/mailman/listinfo/harbour

_______________________________________________
Harbour mailing list (attachment size limit: 40KB)
Harbour@harbour-project.org
http://lists.harbour-project.org/mailman/listinfo/harbour

Reply via email to