Using Win32 functions in Visual FoxPro Image Gallery
Code examples:
Custom GDI+ class
GDI+: Implementing image scrolling with inertia
Obtaining names and positions for shortcuts located on the Windows Desktop
How to put a horizontal text scrolling on the form (a news line, marquee)
Displaying icons in the system tray (VFP9)
Displaying dimmed window behind VFP top-level form
Storing content of the Clipboard to a bitmap file
How to load a user profile
Browsing Windows Known Folders (Special Folders)
Printing Image File, programmatically set print page orientation to landscape
How to change display settings: screen resolution, screen refresh rate
Subclassing CommandButton control to create BackColor property
How to play AVI file on the _screen
Vertical Label control
Winsock: sending email messages (SMTP, port 25)
Detecting changes in connections to removable drives (VFP9)
Storing screen shot of a form to bitmap file
Enumerating devices installed on the local machine
How to print a bitmap file
How to print FoxPro form
How to control Adobe Reader 9.0 (SDI mode) from VFP application
How to make a VFP form fading out when released (GDI version)
Custom FTP Class for Visual FoxPro application
Pocket PC: custom RAPI class for operating with files and folders on mobile device
Using File Mapping for enumerating files opened by Visual FoxPro

User rating: 9/10 (1 votes)
Rate this code sample:
  • ~
More code examples    Listed functions    Add comment     W32 Constants      Translate this page Printer friendly version of this code sample
Before you begin:
File mapping is the association of the contents of a file with a portion of the virtual address space of a process.

API function GetMappedFileName called in combination with CreateFileMapping and MapViewOfFile functions is able to retrieve the name for a given file handle.

The following code scans range of possible file handles from 1 to 1024 trying to obtain a file name from each of them.

 
#DEFINE PAGE_READONLY 2
#DEFINE PAGE_READWRITE 4
#DEFINE PAGE_WRITECOPY 8
#DEFINE PAGE_EXECUTE_READ 0x20
#DEFINE PAGE_EXECUTE_READWRITE 0x40
 
#DEFINE SECTION_QUERY 1
#DEFINE SECTION_MAP_WRITE 2
#DEFINE SECTION_MAP_READ 4
#DEFINE SECTION_MAP_EXECUTE 8
#DEFINE SECTION_EXTEND_SIZE 0x10
#DEFINE STANDARD_RIGHTS_REQUIRED 0xF0000
 
#DEFINE SECTION_ALL_ACCESS BITOR(STANDARD_RIGHTS_REQUIRED,;
    SECTION_QUERY, SECTION_MAP_WRITE, SECTION_MAP_READ,;
    SECTION_MAP_EXECUTE, SECTION_EXTEND_SIZE)
 
#DEFINE FILE_MAP_WRITE SECTION_MAP_WRITE
#DEFINE FILE_MAP_READ SECTION_MAP_READ
#DEFINE FILE_MAP_ALL_ACCESS SECTION_ALL_ACCESS
 
#DEFINE INVALID_HANDLE_VALUE -1
#DEFINE MAX_PATH 260
 
DO declare
DO ScanDevices
 
PRIVATE cFilename, nError, nFileSize, nFileType, hFileIndex, hProcess
cFilename=""
STORE 0 TO nError
* obtain (pseudo) handle for the current process
hProcess=GetCurrentProcess()
 
* try to open a file using FoxPro low-level file functions
LOCAL hFile1
hFile1 = FOPEN("MYFILE.TXT", 2)
? "hFile1:", hFile1
 
CREATE CURSOR cs (hfile I, errorcode I, filename C(250),;
    filesize I, filetype I)
 
FOR hFileIndex=1 TO 4096
    nError=0
    cFilename=""
    nFileSize = GetFileSize(hFileIndex)
    nFileType = GetFileType(hFileIndex)
 
    * both modes should match, for example:
    * PAGE_READONLY, SECTION_MAP_READ
    * PAGE_READWRITE, SECTION_MAP_WRITE
    = GetName(hFileIndex, PAGE_READONLY, SECTION_MAP_READ)
 
    INSERT INTO cs VALUES (m.hFileIndex, m.nError,;
        m.cFilename, m.nFilesize, m.nFileType)
NEXT
 
IF hFile1 <> INVALID_HANDLE_VALUE
    = FCLOSE(hFile1)
ENDIF
 
BROWSE NORMAL FOR errorcode=0 NOWAIT
* end of main
 
PROCEDURE GetName(hFile, nCreateFlag, nMapFlag)
    LOCAL hFileMap, hMem, cBuffer, nBufsize
 
    hFileMap = CreateFileMapping(hFile, 0, nCreateFlag, 0,1, Null)
    IF hFileMap <= 0
        nError=GetLastError()
        RETURN
    ENDIF
 
    hMem = MapViewOfFile(hFileMap, nMapFlag, 0,0,1)
    IF hMem = 0
        nError=GetLastError()
        cBuffer=""
    ELSE
        cBuffer = REPLICATE(CHR(0), MAX_PATH)
        nBufsize = GetMappedFileName(hProcess, hMem,;
            @cBuffer, MAX_PATH)
 
        IF nBufsize=0
            nError=GetLastError()
            cBuffer=""
        ELSE
            cBuffer = SUBSTR(cBuffer, 1, nBufsize)
        ENDIF
        = UnmapViewOfFile(hMem)
    ENDIF
    CloseHandle(hFileMap)
    cFilename=cBuffer
 
FUNCTION GetFileSize(hFile)
#DEFINE MAX_DWORD 0xffffffff
    LOCAL cBuffer
    cBuffer = REPLICATE(CHR(0), 8)
    IF GetFileSizeEx(hFile, @cBuffer) = 0
        RETURN 0
    ELSE
        RETURN buf2dword(SUBSTR(cBuffer,1,4)) +;
                buf2dword(SUBSTR(cBuffer,5,4)) * (MAX_DWORD+1)
    ENDIF
 
PROCEDURE ScanDevices
    CREATE CURSOR csDosDevices (drvletter C(2), targetpath C(250))
 
    LOCAL cDrives, nBufsize, cDrvLetter, ch, cTargetPath
    cDrives = REPLICATE(CHR(0), 250)
    nBufsize = GetLogicalDriveStrings(LEN(cDrives), @cDrives)
    cDrives = PADR(cDrives, nBufsize)
 
    cDrvLetter=""
    FOR nBufsize=1 TO LEN(cDrives)
        ch = SUBSTR(cDrives, nBufsize,1)
        IF ch = Chr(0)
            cDrvLetter=PADR(cDrvLetter,2)
            cTargetPath = REPLICATE(CHR(0), MAX_PATH)
 
            = QueryDosDevice(cDrvLetter, @cTargetPath,;
                LEN(cTargetPath))
 
            cTargetPath = STRTRAN(cTargetPath, CHR(0), "")
            INSERT INTO csDosDevices VALUES (;
                cDrvLetter, cTargetPath)
 
            cDrvLetter = ""
        ELSE
            cDrvLetter = cDrvLetter + m.ch
        ENDIF
    NEXT
 
PROCEDURE declare
    DECLARE INTEGER CloseHandle IN kernel32 INTEGER hObject
    DECLARE INTEGER GetLastError IN kernel32
    DECLARE INTEGER GetFileType IN kernel32 INTEGER hFile
    DECLARE INTEGER GetFileSizeEx IN kernel32;
        INTEGER hFile, STRING @lpFileSize
 
    DECLARE INTEGER CreateFileMapping IN kernel32;
        INTEGER hFile, INTEGER lpAttributes, INTEGER flProtect,;
        LONG dwMaximumSizeHi, LONG dwMaximumSizeLo, STRING lpName
 
    DECLARE LONG MapViewOfFile IN kernel32;
        INTEGER hFileMappingObject, INTEGER dwDesiredAccess,;
        LONG dwFileOffsetHi, LONG dwFileOffsetLo,;
        LONG dwNumberOfBytesToMap
 
    DECLARE INTEGER UnmapViewOfFile IN kernel32 LONG lpBaseAddress
    DECLARE INTEGER GetCurrentProcess IN kernel32
 
    DECLARE INTEGER GetMappedFileName IN psapi;
        INTEGER hProcess, INTEGER lpv,;
        STRING @lpFilename, INTEGER nSize
 
    DECLARE INTEGER OpenFile IN kernel32;
        STRING lpFileName, STRING @lpReOpenBuff, INTEGER wStyle 
 
    DECLARE INTEGER GetLogicalDriveStrings IN kernel32;
        INTEGER nBufferLength, STRING @lpBuffer
 
    DECLARE INTEGER QueryDosDevice IN kernel32;
        STRING lpDeviceName, STRING @lpTargetPath, LONG ucchMax
 
FUNCTION buf2dword(lcBuffer)
RETURN Asc(SUBSTR(lcBuffer, 1,1)) + ;
    BitLShift(Asc(SUBSTR(lcBuffer, 2,1)),  8) +;
    BitLShift(Asc(SUBSTR(lcBuffer, 3,1)), 16) +;
    BitLShift(Asc(SUBSTR(lcBuffer, 4,1)), 24)
 
 
 

User rating: 9/10 (1 votes)
Rate this code sample:
  • ~
4666 bytes  
Created: 2004-11-02 13:03:12  
Modified: 2009-02-03 15:26:42  
Visits in 7 days: 140  
Listed functions:
CloseHandle
CreateFileMapping
GetCurrentProcess
GetFileSizeEx
GetFileType
GetLastError
GetLogicalDriveStrings
GetMappedFileName
MapViewOfFile
OpenFile
QueryDosDevice
UnmapViewOfFile
Printer friendly API declarations
My comment:
The file handles are scanned in the context of current FoxPro application -- GetCurrentProcess API function is used to obtain the process handle.

Some file handles can not be accessed -- browse records with errorcode=5 (ERROR_ACCESS_DENIED).

Filenames are returned in \Device\HarddiskVolume..\ format.

As you can see, there are four handles per each open file. In Visual FoxPro, SYS(2010) always returns 255 -- these two values may be logically linked.

Visual FoxPro hides real file handle values. The FOPEN() returns the value from internal FoxPro table, not the value assigned by the OS.

Technically you may try to call the CloseHandle API for some handles on this list.

* * *

\Device\HarddiskVolume1 is the name of an object in the Windows kernel object hierarchy. It represents a device with the name HarddiskVolume1, which is the first volume of the hard disk. This device is normally mounted under the file-system name "c:", so the path is equivalent to c:\...

In the code sample above, the QueryDosDevice function is used to find the drive letters corresponding to the names like \Device\HarddiskVolume1 -- open cursor csDosDevices to see all.

* * *
Some links:
  • File Mapping, an article on MSDN
  • Obtaining a File Name From a File Handle, an article on MSDN
  • File Mapping Class Module on FreeVBcode.com
  • Faster File Access With File Mapping, an article written by Hernαn Moraldo
  • Low Level File Functions on FoxPro Wiki
  • Word Index links for this example:
    Translate this page:
      Spanish    Portuguese    German    French    Italian  
    FreeTranslation.com offers instant, free translations of text or web pages.
    User Contributed Notes:
    There are no notes on this subject.


    Copyright © 2001-2017 News2News, Inc. Before reproducing or distributing any data from this site please ask for an approval from its owner. Unless otherwise specified, this page is for your personal and non-commercial use. The information on this page is presented AS IS, meaning that you may use it at your own risk. Microsoft Visual FoxPro and Windows are trade marks of Microsoft Corp. All other trademarks are the property of their respective owners. 

    Privacy policy
    Credits: PHP (4.4.9), an HTML-embedded scripting language, MySQL (5.6.37), the Open Source standard SQL database, AceHTML Freeware Version 4, freeware HTML Editor of choice.   Hosted by Korax Online Inc.
    Last Topics Visited (54.198.54.142)
    10 sec.Example: 'Using FoxTray ActiveX control: System Tray Icon and menu attached to VFP form'
    38 sec.Function: 'GetCurrentThreadId'
    Function group: 'Process and Thread'
    48 sec.Function: 'GetEnvironmentStrings'
    Function group: 'Process and Thread'
    1.03 min.Function: 'GdipDeleteBrush'
    Function group: 'GDI+ Brush'
    1.2 min.Function: 'IsZoomed'
    Function group: 'Window'
    1.38 min.Function: 'FtpRemoveDirectory'
    1.55 min.Function: 'GetEnvironmentVariable'
    Function group: 'Process and Thread'
    1.75 min.
    Function group: 'Menu'
    1.95 min.Banners
    2.13 min.Function: 'CeGetFileSize'
    Google
    Advertise here!