Using Win32 functions in Visual FoxPro Image Gallery
Code examples:
How to change display settings: screen resolution, screen refresh rate
Adding and deleting Scheduled Tasks using NetScheduleJob API functions
Custom GDI+ class
Capturing keyboard activity of another application with the Raw Input API (VFP9)
Converting Unicode data from the Clipboard to a character string using a given code page
How to download a file from the FTP server using FtpGetFile
Detecting changes in connections to removable drives (VFP9)
Enumerating data formats currently available on the clipboard
Winsock: sending email messages (SMTP, port 25)
How to play AVI file on the _screen
Enumerating raw input devices attached to the system (keyboard, mouse, human interface device)
Custom FTP Class for Visual FoxPro application
Custom HttpRequest class (WinHTTP)
Deleting files into the Recycle Bin
Creating the Open dialog box to specify the drive, directory, and name of a file to open
How to activate Windows Calculator
Splash Screen for the VFP application
Custom HttpRequest class (WinINet)
Using Font and Text functions
Establishing connection using the SQLDriverConnect
How to display the Properties dialog box for a file (ShellExecuteEx)
Mapping and disconnecting network drives
Displaying bitmap using the AlphaBlend function
Dragging files from Explorer window and dropping them on FoxPro control (requires VFP9)
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: 153  
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-2013 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.1.55-log), the Open Source standard SQL database, AceHTML Freeware Version 4, freeware HTML Editor of choice.   Hosted by Korax Online Inc.
    Last Topics Visited (54.224.79.93)
    1.26 hrs.Function: 'NetUserEnum'
    1.27 hrs.Function: 'RegEnumValue'
    Function group: 'Registry'
    2.24 hrs.Function: 'CM_Get_Sibling_Ex'
     Function: 'HeapReAlloc'
    3.96 hrs.
    Function group: 'ODBC API'
     Function: 'WindowFromDC'
    4.31 hrs.Function: 'WSAGetLastError'
    Function group: 'Windows Sockets 2 (Winsock)'
     Example: 'Get the power status of your laptop computer'
    4.78 hrs.Function: 'GetGUIThreadInfo'
     Example: 'Setting the Window Region for a form'
    Google
    Advertise here!