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