From QB64.org wiki
Jump to: navigation, search

The _OFFSET variable type stores the location of a value in memory. The byte size varies as required by the system.


DIM variable AS _OFFSET


  • _OFFSET types can be created as signed or _UNSIGNED at the programmer's discretion.
  • The type suffix for _OFFSET is %& which designates the integer value's flexible size.
  • Offset values are only useful when used in conjunction with _MEM or DECLARE LIBRARY procedures.
  • OFFSET values are used as a part of the _MEM variable type in QB64. Variable.OFFSET returns or sets the current position in memory.
  • API LIBRARY parameter or type names may include lp, ptr or p which designates them as a pointer type.
  • Warning: _OFFSET values cannot be cast to other variable type values reliably.
  • Warning: Variable length STRING values can move about in memory at any time. If you get the _OFFSET of a variable length sting on one code line and use it on the next it may not be there anymore. To be safe, move variable length strings into fixed length strings first.


Example: The SHBrowseForFolder function receives information about the folder selected by the user in Windows XP and 7.

DECLARE CUSTOMTYPE LIBRARY FUNCTION FindWindow& (BYVAL ClassName AS _OFFSET, WindowName$) END DECLARE _TITLE "Super Window" hwnd& = FindWindow(0, "Super Window" + CHR$(0)) TYPE BROWSEINFO 'typedef struct _browseinfo 'Microsoft MSDN hwndOwner AS LONG ' ' HWND pidlRoot AS _OFFSET ' ' PCIDLIST_ABSOLUTE pszDisplayName AS _OFFSET ' ' LPTSTR lpszTitle AS _OFFSET ' ' LPCTSTR ulFlags AS _UNSIGNED LONG ' UINT lpfn AS _OFFSET ' ' BFFCALLBACK lParam AS _OFFSET ' ' LPARAM iImage AS LONG ' ' int END TYPE 'BROWSEINFO, *PBROWSEINFO, *LPBROWSEINFO; DECLARE DYNAMIC LIBRARY "shell32" FUNCTION SHBrowseForFolder%& (x AS BROWSEINFO) 'Microsoft MSDN SUB SHGetPathFromIDList (BYVAL lpItem AS _OFFSET, BYVAL szDir AS _OFFSET) 'Microsoft MSDN END DECLARE DIM b AS BROWSEINFO b.hwndOwner = hwnd DIM s AS STRING * 1024 b.pszDisplayName = _OFFSET(s$) a$ = "Choose a folder!!!" + CHR$(0) b.lpszTitle = _OFFSET(a$) DIM o AS _OFFSET o = SHBrowseForFolder(b) IF o THEN PRINT LEFT$(s$, INSTR(s$, CHR$(0)) - 1) DIM s2 AS STRING * 1024 SHGetPathFromIDList o, _OFFSET(s2$) PRINT LEFT$(s2$, INSTR(s2$, CHR$(0)) - 1) ELSE PRINT "Cancel?" END IF

Code by Galleon

See also

Go to Keyword Reference - Alphabetical
Go to Keyword Reference - By usage
Go to Main WIKI Page