>&& To make exe readonly attribute >LCFILE=curdir()+"ACCOUNTS.EXE" >#DEFINE FILE_ATTRIBUTE_READONLY 0x01 >#DEFINE FILE_ATTRIBUTE_HIDDEN 0x02 >#DEFINE FILE_ATTRIBUTE_SYSTEM 0x04 >#DEFINE FILE_ATTRIBUTE_DIRECTORY 0x10 >#DEFINE FILE_ATTRIBUTE_ARCHIVE 0x20 >#DEFINE FILE_ATTRIBUTE_NORMAL 0x80 >#DEFINE FILE_ATTRIBUTE_TEMPORARY 0x0100 >DECLARE LONG SetFileAttributes IN WIN32API STRING FileName, LONG FileAttributes >DECLARE LONG GetFileAttributes IN WIN32API STRING FileName >IF SetFileAttributes (LCFILE, BITOR(lnFileAttributes, FILE_ATTRIBUTE_READONLY)) = 0 >* Error setting attributes > RETURN .F. >ENDIF >IF lnFileAttributes = -1 > RETURN .F. >ENDIF >The same as Martin suggest, but with little change of places:
DECLARE INTEGER FormatMessage IN "kernel32.dll" INTEGER flags,; INTEGER notused,; INTEGER error,; INTEGER locale,; STRING @buffer,; INTEGER bufsize,; INTEGER notused lnFileAttributes = GetFileAttributes (LCFILE) IF lnFileAttributes = -1 nLastError=GetLastError() cError=SPACE(255) =FormatMessage(4096,0,nLastError,0,@cError,255,0) cError = ALLTRIM(STRTRAN(cError,CHR(0))) WAIT WINDOW 'Error #: '+ALLTRIM(STR(nLastError))+CHR(13)+'Error Msg: '+cError RETURN .F. ENDIF IF SetFileAttributes (LCFILE, BITOR(lnFileAttributes, FILE_ATTRIBUTE_READONLY)) = 0 * Error setting attributes nLastError=GetLastError() cError=SPACE(255) =FormatMessage(4096,0,nLastError,0,@cError,255,0) cError = ALLTRIM(STRTRAN(cError,CHR(0))) WAIT WINDOW 'Error #: '+ALLTRIM(STR(nLastError))+CHR(13)+'Error Msg: '+cError RETURN .F. ENDIF