You are on page 1of 9

4/18/2017 APIStructures

A way to work with Visual FoxPro and API Structures

© Written by: Emanuele Cerlini

July 2004 ­ Reproduction Prohibited ­ Versione italiana

Download: (last update: April 18, 2006)

rAPIdStructure is an adapter for API Structures and it requires VFP 7 or greater.

Version 1.10

­ Added properties: cExcludeList, lAutoFar
­ Added parameter: nMemAddr to WriteMemory()
­ Removed the obsolete lAllInCharString parameter of SplitStruct(). It was consequence of a wrong way of declaring certain Dlls.
­ Added support for more elements in the same line, for the C structures.
­ Fixed bug with arrays of BYTE when lAutoArray = .T., for the C structures.
­ Reconsidered the count of bytes for the Bits structures.

1. Introduction and adaptations
2. Hints
3. Properties
4. Functions
5. Data Types
6. Samples


Before  starting,  I  would  say  straightaway  that  I  do  not  know  anything  about  Visual  C++  and  practically  anything  about  Visual
Basic. The little I know about Visual FoxPro allows me to wonder how comes that we have come by now to version 9.0 and there
is no internal function yet that manages the structure of data working with the API functions (Application Programming Interface).
I developed most of the following work by logical deduction – therefore it is largely corrigible and integrable – from the study of
documentation, from the examples taken in and from the Struct class  by  Christof  Lange  (and  Mark
Wilden, published in 1999), people I thank. Now I add also William GC Steinford, of whom the work I have seen only after the first
publication  of  this  document,  and  the  recent  vfp2c32  of  Christian  Ehlscheid.  Not  for  haughtiness  or  other  demands,  but  just
because I believe that now it is possible to simplify further the interaction of VFP with these structures, I allowed myself to develop
a class, entirely in Fox, that I kindly ask you to help me to improve it.
My main idea is to take word for word a definition of structure written in C++ or VB, to transfer it in a Fox variable (or in a memo
field), to implement with it a class where the structure members are created as new properties and from here to pass and receive
the data from Dlls. Of course also the widest support available is needed: sub­structures, pointers to the memory buffer, arrays of
characters, numbers and structures… And perhaps also an utility that copies easily in programming the members of structure…
In short, all that is useful to eliminate the uneasiness feeling that may take the user when he looks at the documentation of an API
function and finds out that such parameter is a structure.

Perhaps I express myself better with the code of the most banal example:
*!* code for VFP 7.00

Local cMyDef As String, ; 
  oStruct As Object, ; 
  cSysTime As String 

*!* inizialize 
Set Procedure To rpstruct Additive 

*!* declare function 
Declare GetLocalTime In WIN32API ; 
  STRING @ lpSystemTime

*!* copy and paste SYSTEMTIME structure from MSDN Help 
typedef struct _SYSTEMTIME { 
  WORD wYear; 
  WORD wMonth; 
  WORD wDayOfWeek; 
  WORD wDay; 
  WORD wHour; 
  WORD wMinute; 
  WORD wSecond; 
  WORD wMilliseconds; 

With oStruct 
*!* Load it 

*!* Build a string 

*!* Call Dll 
  GetLocalTime(@cSysTime) 1/9

    DWORD nFileSizeLow.wMilliseconds *!* Using .4/18/2017 APIStructures *!* Split the result in members    .com/ecerlini/struttureapi_en. let's change that line with this one: WORD fFlags.    FILETIME ftLastAccessTime.wMonth    ?"Day Of Week".cFileTime) where m.  } WIN32_FIND_DATA.T.  etc. LONG.SplitStruct(m. also in order to  the  sub­structures  in  memory.html#intro 2/9 . INTEGER. In particular: To solve somehow the problem of data types variety. . If lUnknownAsStruct is. otherwise they have to be loaded by strucure1.    LPCTSTR pTo.F.foxitaly. In  the  following  case  we  have  3  sub­structures  FILETIME  which  are  loaded  automatically  as  they  have  lAllowIntStruct=.  my  special support  for  Windows  Sockets  Structures  exists  for  reading  of  CHAR  FAR  *  as  LPTSTR  and  CHAR  FAR  *  FAR  *  as  array  of pointers without direct conversion in text (above this last lAutoMemory doesn't affect)..T. 2 or 3 to know how and which data types have been recognized by the class.    DWORD dwReserved1.  directly  managed  with  the  functions  WriteMemory().    LPCSTR lpszProgressTitle.LoadCDef(m. *!* end example  Of course it is not always so simple.    LPCTSTR pFrom.T. before loading all.  } SHFILEOPSTRUCT. BYTE. STRING. that is to say: oStruct..wHour    ?"Minute".Null.cVariableDef).  if  lAutoFar  =  .  It  is  necessary  to  see  the  guide  of  each  structure  to  know  which  data  are  therein.cSysTime) *!* The result is here    ?"Year".  It  will  then  be  possible  to  access  members  of sub­structure in this way: ?oStruct.  It  is  also  possible  to  use ClipMembers() with the parameters 1. if lAutoMemory is .   where  FILEOP_FLAGS  is  not  a  sub­structure  but  just  a  non­recognized  data  type  whose  length  is  2  bytes  (please  refer  to Shellapi.  Also.dwLowDateTime typedef struct _WIN32_FIND_DATA {   DWORD dwFileAttributes. .ClipMembers() to paste here the members' name Endwith Clear Dlls "GetLocalTime"  oStruct=. for the C language.    FILEOP_FLAGS fFlags.h: typedef WORD FILEOP_FLAGS).wMinute    ?"Second". as a sub­structure and so it brings about the creation of a rAPIdStructure  internal  object  to  load  with  its  own  structure  definition.cFileTime  is  a  variable  containing  the  definition  of  FILETIME  structure. SINGLE I consider any data not recognized among these.  and the problem is resolved.    TCHAR cFileName[ MAX_PATH ]. .  if  it  is  not  among  the  ones  included  in  the  DataTypes() returned string and they are enabled. we find the line FILEOP_FLAGS fFlags.wSecond    ?"Milliseconds".wDay    ?"Hour". it can be entered a string in input.    TCHAR cAlternateFileName[ 14 ].ftCreationTime.    BOOL fAnyOperationsAborted.    UINT wFunc. Therefore.wDayOfWeek    ?"Day".member.    DWORD dwReserved0.LoadCDef (m.wYear    ?"Month". with some changes. The function DataTypes() returns the list of the data recognized in base to their length in bit (8.. For pointers in memory.    LPVOID hNameMappings. obtaining it directly in output. *LPSHFILEOPSTRUCT. . . DOUBLE. in the 2 languages. the class marks each not recognized data type such as 32  bit  number.. the following are accepted: BOOLEAN.    FILETIME ftCreationTime. for those regarding text like LPTSTR and LPWSTR (those with STR or CHAR in the end). 16.ftCreationTime. I chose to take an official list from MSDN ­> Platform SDK:  Win32  API  ­> Data Types. instead. In the other cases input e output are numeric. . *PWIN32_FIND_DATA. 32 and 64). . but in this last example we have 2 TCHAR arrays also: http://www.    DWORD nFileSizeHigh.    FILETIME ftLastWriteTime. In this case: typedef struct _SHFILEOPSTRUCT{    HWND hwnd. As far as Visual Basic data are concerned. .

  UCHAR;  for  Unicode  text. Now the main structure JOB_INFO_2 will use it directly.  in  case  lAutoArray  is  .foxitaly.       in order to be able to store the numeric value which represents the address into memory.  CHAR.  the  class  treats  as  ANSI  text  strings  the  arrays  of  BYTE.html#intro 3/9 . *PJOB_INFO_2.  BCHAR.F.  arrays  of If lAutoUnicodeConv is . If afterwards.    DWORD     TotalPages.    DWORD     Time.    DWORD     Status.  For  Visual  Basic.  how  previously  pointed.  HGLOBAL pSecurityDescriptor.  while  for  other.    LPTSTR     pDatatype. but if we find a medley of sub­structures normally incorporated and other into memory. considering the possible variants. before loading the structure. In order to free the allocated memory it will be necessary to act calling the function FreeMemory() because this doesn't happen automatically.    DWORD     StartTime.    DWORD     PagesPrinted. here we have two elements that point to one DEVMODE and one SECURITY_DESCRIPTOR (not reported now) in the memory.  like CHOOSEFONT. Going  back  over  the  pointers  into  memory.  TBYTE.    LPTSTR     pPrintProcessor.  I  have  not  found  a  better  way  in  order  to automatize this particularity of the structures.  PSECURITY_DESCRIPTOR pSecurityDescriptor. we create a separated object rAPIdStructure into which we load and set this last structure. obtained by MakeStruct() into buffer with WriteMemory() and store the result into member . they report the data type representing the handle and with which one  it  is  needed  to  replace  the  name  of  the structure: LONG. In case of keyword Union in a structure: http://www. we wuold also use DEVMODE.    LPTSTR     pPrinterName.  Any data type can be represented with arrays.  If they are represented by a constant such as MAX_PATH.    DWORD     Position.  the  manual  substitution  of  the  data  type  before  the  loading  is  the  only  way. it means that in a header file there is: #define MAX_PATH 260 and so.  It  exists  also  the possibility for an API function to call directly an array of data or of structures as parameter: the InitAPIArray() function treats these as  if  they  are  a  structure  with  an  array  composed  by  a  single  data  type  (or  sub­structure)  and  it  produces  a  passable  and receivable string for the Dlls..       with data type HGLOBAL HGLOBAL pDevMode. TCHAR.  there  is  also  the  possibility  to  have  sub­structures  in  a memory block: typedef struct _JOB_INFO_2 {    DWORD     JobId.  ANSI  text  for  the  arrays  of  BYTE  or  STRING;  of INTEGER for Unicode.    LPTSTR     pMachineName. the conversion of Unicode text strings is automatic.    LPTSTR     pDocument.  seems  to  manage  the  memory  handles  directly  as  incorporated  structures.4/18/2017 APIStructures TCHAR cFileName[ MAX_PATH ]. including sub­structures.    DWORD     Size.    DWORD     UntilTime.    SYSTEMTIME   Submitted.  This topic is valid also for expressions such as (0 to 31): it must be replaced with an unique integer value (32). we replace that constant manually: TCHAR cFileName[ 260 ].   TCHAR cAlternateFileName[ 14 ].pDevMode. For  C  language.  } JOB_INFO_2. The class doesn't accept arrays with 0 elements.    LPTSTR     pDriverName.    LPTSTR     pParameters. write the string of it. It is needed to set attention to those written in Visual Basic because any.    LPDEVMODE   pDevMode.. as that of the preceding  example.T. for instance.T.    DWORD     Priority. Definitions in the preceding structure written in Visual Basic: pDevMode As DEVMODE   pSecurityDescriptor As SECURITY_DESCRIPTOR  correct before the loading into the class: pDevMode As Long  pSecurityDescriptor As Long in alternative we could set lUnknownAsStruct to .    LPTSTR     pNotifyName..    PSECURITY_DESCRIPTOR pSecurityDescriptor.    LPTSTR     pStatus.    LPTSTR     pUserName.  their  numerical  value  is  reported  (except  for  Visual  Basic  STRING). If  these  data  are  not  in  array  format. In order to prepare the main structure we replace the references at the two structures LPDEVMODE pDevMode.

We look at the guide to know which part is implemented and. it is not possible to demand miracles.prg For the initialization: Set Procedure To rpstruct ADDITIVE  oStruct=CreateObject("rAPIdStructure")  PUBLIC PROPERTIES (between brackets the default value) Properties lAllowIntStruct. lAutoArray.html#intro 4/9 . Classes of the sub­structures inherit the properties settings of the main class.       DWORD dwUnCommittedSize.    }.    LONG right. lBoolNumeric.    DWORD cbData.    LONG top.        LPVOID lpLastBlock.      } Block. SET FIXED OFF is recommended.  } PROCESS_HEAP_ENTRY. while loading._top    .right    . *LPPROCESS_HEAP_ENTRY. *LPPROCESS_HEAP_ENTRY.      } Region. by manual intervention.     BYTE iRegionIndex.     BYTE cbOverhead.       LPVOID lpLastBlock. if a structure member corresponds to a property already existing in the class. we remove the non­interesting one: typedef struct _PROCESS_HEAP_ENTRY {    PVOID lpData. I just remind that this is an adaptation and that.        LPVOID lpFirstBlock. nPadding and vStopAt are not hereditary and are applied only to their own structure http://www. cExcludeList.cExcludeList="hMem;dwReserved" Finally it is necessary to notice that.   DWORD cbData.     WORD wFlags. Documentation of rAPIdStructure class in rpstruct.prg in order to test quickly the loading of the structures.   BYTE cbOverhead.   WORD wFlags.     } Region.   BYTE iRegionIndex.  This  is  the  case  of  RECT  structure  (or  RECTL) having left and top as members: typedef struct _RECT {    LONG left.       LPVOID lpFirstBlock.         DWORD dwReserved[ 3 ]._left    .   Hints ­ SET COMPATIBLE must be OFF.foxitaly. lAutoFar.  } RECT In order not to confuse them with the native properties.       struct {        DWORD dwCommittedSize. or we specify the members that must be excluded in the cExcludeList property: oStruct. ­ Check always the final semicolon (;) for the elements of the C++ structures. ­ Use rptest_en. lSplit64bit and lUnknownAsStruct can be set only before loading a structure definition or before to create an API array.     union {       struct {        HANDLE    LONG bottom. } PROCESS_HEAP_ENTRY.   union {     struct {       DWORD dwCommittedSize. even if it concerns many of the most common structures. The properties cDoubleNullList.4/18/2017 APIStructures typedef struct _PROCESS_HEAP_ENTRY {    PVOID lpData. a character  _  (underscore)  will  be  added  at  the  beginning  of  the  new  property.bottom  EndWith I hope this work will be helpful to somebody. the new ones will be reported this way in the class: With oStruct    .        DWORD dwUnCommittedSize.   }.

 It is needed to consider the members that contain arrays or sub­structures as a single element.) If True (. For the 64 bit integer value.T..foxitaly.F. cStructure (="") Contains the name of the loaded structure. signed.F. if this property is .) Only for C++ language data types.F.F. it considers them as the other arrays reporting the numerical value of each element.T. if this value is .  it  recognizes  the  data  type  as  HGLOBAL  (numeric.  The  formula  in  order  to  calculate  the entire value would be (HighPart * (0xFFFFFFFF + 1)) + LowPart..). recognizing them as simply pointers. lUnknownAsStruct (=. This support is for the multi­version structures. cExcludeList (="") Specifies  a  semicolon­separated  list  (;)  of  the  members  that  are  excluded  from  the  structure for example http://www. semicolon­separated (;)..T.rtf).  True  in  the  other  cases);  if  False  (. o .)  the Boolean values are logical (. The elements will have the names of LowPart and HighPart.). of the members that SplitStruct() must read from the memory as double­Null terminated strings.T. lAllowIntStruct (=.T. if this value is . otherwise the class accepts and returns only numerical values.  4  bytes)  in  order  to  the  definitions  in  C  language.  or  LONG (numeric. converts automatically the ANSI strings to Unicode and vice versa. lAutoUnicodeConv (=. in Input and Output. Whether this value is ­1.  unsigned.) If  True  (.T.T. If this value is . the class creates a sub­structure that separates these in two 32 bit portions. lSplit64bit (=. vStopAt (=0) Indicates the name (character) or the number (numeric and faster) of the last element to elaborate.  Expressly  for  the structures that use "Union" parts. or.html#intro 5/9 .)  indicates  that  Boolean  values  are  represented  as  numerical  (0  =  False. cDoubleNullList (="") Contains the list. lAutoMemory (=.T. This setting out is most common for the structures that require it (see also the file correct.).)  Manages in automatic way the sub­structures creating for each not recognized data type an object rAPIdStructure. lBoolNumeric (=.F.) Manages the arrays of 8 or 16 bit data automatically as text strings.) In order to the pointers in memory.) If it is False (. disables the automatism for the data types CHAR FAR * and CHAR FAR * FAR *. the class adds automatically the necessary characters rounding up the size to the nearest multiple of 4.T.. These are the error codes: 0 no error ­11 parameters not correct ­301 structure not loaded ­302 structure already loaded ­303 definition of structure not valid ­304 name of structure is missing ­305 invalid array in structure ­306 no members loaded ­307 invalid data type in a member ­308 error in a structure of secondary level ­309 DLL error reading/writing memory ­310 no pointer stored ­311 member name not existing ­312 invalid member index ­313 the member is not a pointer ­314 the string doesn't have pointer in memory nPadding (=0) Adjusts artificially the size of the structure adding the specified number of Null characters.T.T. 4 bytes) for those in Visual Basic.) Allows the automatic loading of the internal structures (see DataTypes("IS")) lAutoArray (=. nError (=0) Contains the internal code in order to the last error occours. the class allows the automatic reading/writing into buffer with text strings.   It is possible to load just one structure at a time. lAutoFar (=.T.4/18/2017 APIStructures or to the first level in an array of structures.

 forces the copy and adds the comment with the description.T. The  parameter  lAnsi2Wide  (logical  and  optional). and processes it like a single structure. the return value is 0.  forces  the  copy  of  the  members  also  if  the  sub­ structures have not been loaded; if the value is 2. Without or with any other value.T. the return value is .  The  function  operates  only  with  the  members  of  the  class  in  which  it  is contained. with a dot at the beginning. the return value is . InitAPIArray (cDataType. DataTypes (cType) Returns the list of the data types automatically recognized by the class and of the internal structures. LoadCDef (cDefStruct.. without comments and only if all the sub­structures are correctly loaded.T.. of the structure. SplitStruct() and. This function respects all the rules of LoadCDef() o LoadVBDef(). The parameter nFlag (numeric) specifies the number composed by one or more flags of which verify the presence in nIntValue (nFlag = 0 returns always . LPTSTR­>LPWSTR. nLength) Returns a character string assembling the members of the structure. This string is proper for the API functions that don't require values in input. Only the data types of C language could be loaded like single. the return value is an empty string (="").com/ecerlini/struttureapi_en. If the function fails. If data type is a structure (not internal).). The parameter nIntValue (numeric) indicates the value that could contain the flags. The parameter cDefStruct (character) must contain the definition. this function allocates the memory. The parameter cDataType (character) must contain the name of data type or structure to load. The parameter cMemberName  (character)  must  contain  the  name  of  the  structure  member  from  which  has  to  be  returned  the pointer. In all the other cases the returned list is that of the internal structures automatically recognized if lAllowIntStruct is . the list is separated in base to the length in bit of the represented data. It copies to the Clipboard the names of the structure's members. 16..F. in bytes. CalculateBytes Calculates and returns the size.F. The functions CalculateBytes(). http://www.  if  True  (.)  loads  a  declared  ANSI  structure  as  if  it  is  Unicode  (TCHAR­ >WCHAR. The function is similar to BITTEST() but it doesn't require the position of the bit to test and it also works with flags composed by more bits. GetPtr (cMemberName. MakeStruct(). If it is empty. The  parameter  cType  (character  or  numeric  and  optional)  must  contain  the  indication  for  the  list  to  obtain. writing the string. If the function fails.. with 0 or 2 as parameter. If the function fails. copies the names of the members. nIndex) Returns  the  pointer  of  a  text  string  from  the  memory. ResetData frees it automatically. If the function fails. otherwise it will report the error code. passing as parameters 8.html#intro 6/9 ..  Please. earning in speed. when succeeding. the array will have an unique element. it returns True (. For C language. If the function fails.  for  the complete list of supported data types see at the end of this documentation. ClipMembers() have negative result if all the possible sub­structures have not been loaded. If the function fails.T. composed by an unique data type or structure. lAnsi2Wide) Loads a definition of structure written in C++ language. the return value is 0.). LoadVBDef (cDefStruct) Loads a definition of structure written in Visual Basic language. This is ignored if his value is small than the value returned by CalculateBytes().foxitaly. 32 or 64; for Visual Basic with "VB" parameter the result will be a single list of the recognized data types. The parameter nLength (numeric and optional) indicates the length of the returned string adding characters (Chr(0)) at the end if it is necessary. If lAutoMemory is . ClipMembers (nMode) Utility for developers.4/18/2017 APIStructures the ones that change their dimension from an operative system to another. the property takes the name of the data type.F. The number of element includes also the members that could be listed in cExcludeList.T. adds a comment to each member with the description of how  the  class  has recognized it. it returns a string of characters Chr(0) without estimating the content of the various members. The parameter cDefStruct (character) must contain the definition. If the parameter lAllZero (logical and optional) is . This string is ready to be passed to the API function. the return value is . The parameter cElementName (character and optional) must contain the name of the new property where the class will store the array. ready to paste it into a command WITH . MakeStruct (lAllZero.. PUBLIC FUNCTIONS (between brackets the valid parameters) For all the functions is valid the topic that if the operation succeeds the property nError will have value 0. cElementName) Creates an array for API functions. but it doesn't forces the copy; with value 3. the returned pointer is that of the string written by MakeStruct() or that reported by SplitStruct(). nFlag) Checks whether one or more flags (bits that are set to 1) exist in a determined field or numeric value and. The parameter nIndex (numeric and optional) specifies the index number of the element in an improbable array of pointers.T.F. The parameter nElement (numeric and optional) must contain the number of elements for the array. nElement. the return value is . In  order  to  the  parameter  nMode  (numeric  and  optional):  if  the  value  is  1. If the function fails. If it is empty. the return value is . FlagTest (nIntValue. In base to the last of the two functions already called. If the function fails.).F. it is afterwards necessary to load the definition of the structure into each member of the array. and a text has been introduced in a member that points to the memory. ENDWITH.

The parameter nBytes (numeric) specifies the number of bytes to allocate. lDouble) Converts a floating­point (IEEE) number to a binary character representation. The parameter lSigned (logical and optional) indicates if the returned number could be negative. the parameters lUnicode and lDoubleNull are ignored. GetMemorySize (nMemHandle) Retrieves the current size. Float2Char (nFloat.   Numeric conversion These functions resent of the VFP limits and the values out of range are not verified.   Memory management AllocateMemory (nBytes) Allocates a number of bytes from the heap and return the handle to the newly allocated memory object. The parameter cCharFloat (character) must contain 4 or 8 characters and the decimal places displayed in result are respectively 6 or 15. the return value is 0. the return value is . the return value is 0.  must  contain  the  string  to  write. If the function fails. If the function fails. if True (. It also cleans the memory allocated by the class (not by the API functions). The parameter nMemAddr (numeric) specifies the pointer to a memory address. However. The parameter nMemAddr (numeric and optional) indicates the memory address in which to write directly. Char2Float (cCharFloat) Converts a binary character representation to a floating­point (IEEE) number. This function doesn't modify the setting of cDoubleNullList. Char2Num (cCharInt. The  parameter  lUnicode  (logical  and  optional)  if  True  (.)  considers  the  string  as  Unicode  and.  pay  attention  to  the documentation of the structure to know how to terminate the string with the addition of one or more null characters Chr(0). in bytes.. it reads up to the first null character. If this value is present and greater than 0. If the function fails.T. If the function fails.html#intro 7/9 .  it converts the Unicode text to ANSI. lAllowIntStruct.  The parameter nSizeRead (numeric and optional) specifies the number of bytes to read. If the function fails. this function is recommended every time that is to be entered in reading or writing to the memory buffer. lSigned) Converts a binary character representation to an integer value. WriteMemory (cMemString) Writes a string into memory and returns the address. cExcludeList. The use this parameter is potentially dangerous for the application. Destroy Event calls this function if it is necessary. (The obsolete parameter lAllInCharString (logical) has been removed). FreeMemory (nMemHandle) Frees the specified global memory object.F. before loading a definition of structure (but only since VFP 8 it removes the properties added in the class). If the function fails. the return value is . If the function fails. lUnicode. the return value is . if possible. Please. WriteMemory() calls this function automatically. lAutoArray. SplitStruct (cCharString) Redistributes the character string received by the API function in the members of the class. http://www. The parameter cCharInt (character) specifies the binary character representation to convert. The parameter cCharString (character) must contain the string of the structure. If the function lDoubleNull) Returns the contents of a pointer into memory as a string. ReadMemory (nMemAddr. the return value is 0.F. If the function fails.4/18/2017 APIStructures ResetClass Resets the class bringing it back to the initial condition. If the function fails. Automatically converts the data in the type requested by their reading. lUnknownAsStruct. The parameter nFloat (numeric) specifies the floating­point number to convert. see the command SYS(2600) in Fox Help.  if  lAutoUnicodeConv  is  .foxitaly. The parameter cMemString  (character). If the other parameters are missing. The parameter lDoubleNull (logical and optional). whenever possible. The parameter nMemHandle (numeric) indicates which is the handle to read.  Please. of the specified global memory object.F. lBoolNumeric.T.  with  length  better  than  0.F. the return value is 0. lSplit64bit. ResetData Sets zero the data of the single members carring them to the empty value. the return value is an empty string (=""). the return value is 0. lAutoMemory. The parameter nMemHandle (numeric) indicates which is the handle to free. nSizeRead.) specifies that the string to read is the one terminating with a double­ Null character instead than one only. nPadding and vStopAt. the return value is .

prg.prg... . .. GetPtr: getopenfilenameC.prg Multi­version structures: rasgetconnectionstatisticsC... . Array as text: gettimezoneinformationC..scx.   http://www. Pointers into memory: getstartupinfoVB.prg. equal to DataTypes("IS") or DataTypes(). setprinterVB... .prg.prg.  When  it  is missing... the return value is an empty string (="").. getprinterVB. .prg. the return value is an empty string (="").prg. It is possible to create them directly in the main class passing just the name instead of the complete definition. Union: shellexecuteexC. equal to DataTypes("VB") ) BOOLEAN BYTE DOUBLE INTEGER LONG STRING SINGLE Internal Structures (inside in the class. If the function fails.. Num2Char (nIntValue. ignoring the lAllowIntStruct setting) FILETIME POINT (or POINTL) RECT (or RECTL) SYSTEMTIME   Included samples Simple structures: createprocessVB.. Array of arrays: devicecapabilitiesC. enumprinterdriversC..prg.prg Structures in memory and complex: gethostbynameC...scx.   Supported Data Types by the class (returned by DataTypes()) 8 bit C (equal to DataTypes("8") ) BYTE BCHAR CHAR TBYTE TCHAR UCHAR 16 bit C (equal to DataTypes("16") ) ATOM LANGID SHORT USHORT WCHAR WORD 32 bit C (equal to DataTypes("32") ) BOOL BOOLEAN COLORREF DWORD DWORD_PTR DWORD32 FLOAT HACCEL HANDLE HBITMAP HBRUSH HCOLORSPACE HCONV HCONVLIST HCURSOR HDC HDDEDATA HDESK HDROP HDWP HENHMETAFILE HFILE HFONT HGDIOBJ HGLOBAL HHOOK HICON HIMAGELIST HIMC HINSTANCE HKEY HKL HLOCAL HMENU HMETAFILE HMODULE HMONITOR HPALETTE HPEN HRGN HRSRC HSZ HWINSTA HWND INT INT_PTR INT32 IPADDR IPMASK LCID LCSCSTYPE LCSGAMUTMATCH LCTYPE LONG LONG_PTR LONG32 LPARAM LPBOOL LPBYTE LPCOLORREF LPCSTR LPCTSTR LPCVOID LPCWSTR LPDWORD LPHANDLE LPINT LPLONG LPSTR LPTSTR LPVOID LPWORD LPWSTR LRESULT PBOOL PBOOLEAN PBYTE PCHAR PCSTR PCTSTR PCWCH PCWSTR PDWORD PFLOAT PHANDLE PHKEY PINT PLCID PLONG PSHORT PSTR PTBYTE PTCHAR PTSTR PUCHAR PUINT PULONG PUSHORT PVOID PWCHAR PWORD PWSTR REGSAM SC_HANDLE SC_LOCK SERVICE_STATUS_HANDLE SIZE_T SSIZE_T UINT UINT_PTR UINT32 ULONG ULONG_PTR ULONG32 USHORT VOID WPARAM 64 bit C (equal to DataTypes("64") ) DWORD64 DWORDLONG INT64 LONG64 LONGLONG QWORD UINT64 ULONG64 ULONGLONG Visual Basic (single list.prg.. .com/ecerlini/struttureapi_en..prg. ..prg...foxitaly. .4/18/2017 APIStructures The parameter lDouble (logical and optional) indicates if the represented result is Float or Double (4 or 8 characters)...  Double­Null: getprinterdriverC.scx. The parameter nIntValue (numeric) specifies the integer value to convert. .prg.  API array of single data types and structures: polypolygonC.html#intro 8/9 .  Non­recognized data type when it is not a sub­structure: shfileoperationC.. nChar) Converts an integer value to a binary character representation ..  Sub­structure: getwindowplacementVB. mapisendmailC. Other examples: faxsenddocumentC.prg. The  parameter  nChar  (numeric  and  optional)  indicates  the  length  in  characters  of  the  returned  character  string..prg. sendmessageVB.prg Members in bits: shgetsettingsC. . the resultant string will be long 4 bytes. Constants and non­supported expressions: findfirstfileC. . If the function fails.  64 bit data types: globalmemorystatusexC. . .

I thank Laura and Sara for this translation (. hobby developer July 2004 ­ Reproduction Prohibited Download: rpstruct. have been tested. Be clement with the critics: I abandoned school when I was 16 years old and since around twenty years I've been working with cattle (it is true.. «The  class  has  been  tested  with  Windows  XP  Professional  and  Visual  FoxPro  8  SP1  (with  backward  compatibility  to  VFP  7. The class is deprived of each warranty or refund for direct or indirect damages to whoever use it and/or to third users.) in the nature of the emiliana country. it is "as­is" and each modification is under exclusive responsibility of whoever operates it could also be distributed with the code and decompiled. not a scarce consideration of my colleagues. Not all the data types. and myself in order to technical and grammatical errors) » © Article: Emanuele Cerlini. You could send bugs (dead or alive) and comments to my e­mail   © FoxPro e Visual FoxPro are registered trademarks of Microsoft Corporation   Date: July 30 2004 webmaster@foxitaly. The class is free and without royalties.. Thank you for having read up to here and to those people who will make use of my     dal 22 Giugno 1999     http://www. recompiling it).. Sabbione ­ Reggio Emilia Breeder..4/18/2017 APIStructures "Section for whoever reads the detective story beginning from the last page. recognized by the class." All brand or product names are trademarks or registered trademarks of their respective holders.foxitaly.html#intro 9/9 ..