guinness Posted November 28, 2011 Share Posted November 28, 2011 (edited) I was just curious as to what was the preferred approach when using DllStructCreate and then later using DllStructGetData/DllStructSetData etc... Is it more customary to declare an element name in DllStructCreate to later use in DllStructGetData/DllStructSetData or opt for using just the element index instead?It might be a straightforward answer of "both are fine" but I'm wanting to improve my understanding of the language as well as the best practices for creating good code.Example: This is an example of the API function GetVersionExWexpandcollapse popup#include <Array.au3> #cs Note: You must have the latest beta as these examples are using struct* instead of DllStructGetPtr. #ce Local $aArray = _WindowsOSVersion_1() ; Using DllStructCreate with the Element name. _ArrayDisplay($aArray) $aArray = _WindowsOSVersion_2() ; Using DllStructCreate with the Element index number. _ArrayDisplay($aArray) Func _WindowsOSVersion_1() ; Using DllStructCreate with the Element name. Local $aVersion[4] = [-1, -1, -1, -1] Local $tagOSVERSIONINFO = DllStructCreate('dword dwOSVersionInfoSize;dword dwMajorVersion;dword dwMinorVersion;dword dwBuildNumber;dword dwPlatformId;wchar szCSDVersion[128]') DllStructSetData($tagOSVERSIONINFO, 'dwOSVersionInfoSize', DllStructGetSize($tagOSVERSIONINFO)) Local $aReturn = DllCall('kernel32.dll', 'int', 'GetVersionExW', 'struct*', $tagOSVERSIONINFO) If @error Or Not $aReturn[0] Then Return SetError(1, 0, $aReturn) EndIf $aVersion[0] = DllStructGetData($tagOSVERSIONINFO, 'dwMajorVersion') $aVersion[1] = DllStructGetData($tagOSVERSIONINFO, 'dwMinorVersion') $aVersion[2] = DllStructGetData($tagOSVERSIONINFO, 'dwBuildNumber') $aVersion[3] = DllStructGetData($tagOSVERSIONINFO, 'szCSDVersion') Return $aVersion EndFunc ;==>_WindowsOSVersion_1 Func _WindowsOSVersion_2() ; Using DllStructCreate with the Element index number. Local $aVersion[4] = [-1, -1, -1, -1] Local $tagOSVERSIONINFO = DllStructCreate('dword;dword;dword;dword;dword;wchar[128]') DllStructSetData($tagOSVERSIONINFO, 1, DllStructGetSize($tagOSVERSIONINFO)) Local $aReturn = DllCall('kernel32.dll', 'int', 'GetVersionExW', 'struct*', $tagOSVERSIONINFO) If @error Or Not $aReturn[0] Then Return SetError(1, 0, $aVersion) EndIf $aVersion[0] = DllStructGetData($tagOSVERSIONINFO, 2) $aVersion[1] = DllStructGetData($tagOSVERSIONINFO, 3) $aVersion[2] = DllStructGetData($tagOSVERSIONINFO, 4) $aVersion[3] = DllStructGetData($tagOSVERSIONINFO, 6) Return $aVersion EndFunc ;==>_WindowsOSVersion_2 Edited November 28, 2011 by guinness UDF List: _AdapterConnections() • _AlwaysRun() • _AppMon() • _AppMonEx() • _ArrayFilter/_ArrayReduce • _BinaryBin() • _CheckMsgBox() • _CmdLineRaw() • _ContextMenu() • _ConvertLHWebColor()/_ConvertSHWebColor() • _DesktopDimensions() • _DisplayPassword() • _DotNet_Load()/_DotNet_Unload() • _Fibonacci() • _FileCompare() • _FileCompareContents() • _FileNameByHandle() • _FilePrefix/SRE() • _FindInFile() • _GetBackgroundColor()/_SetBackgroundColor() • _GetConrolID() • _GetCtrlClass() • _GetDirectoryFormat() • _GetDriveMediaType() • _GetFilename()/_GetFilenameExt() • _GetHardwareID() • _GetIP() • _GetIP_Country() • _GetOSLanguage() • _GetSavedSource() • _GetStringSize() • _GetSystemPaths() • _GetURLImage() • _GIFImage() • _GoogleWeather() • _GUICtrlCreateGroup() • _GUICtrlListBox_CreateArray() • _GUICtrlListView_CreateArray() • _GUICtrlListView_SaveCSV() • _GUICtrlListView_SaveHTML() • _GUICtrlListView_SaveTxt() • _GUICtrlListView_SaveXML() • _GUICtrlMenu_Recent() • _GUICtrlMenu_SetItemImage() • _GUICtrlTreeView_CreateArray() • _GUIDisable() • _GUIImageList_SetIconFromHandle() • _GUIRegisterMsg() • _GUISetIcon() • _Icon_Clear()/_Icon_Set() • _IdleTime() • _InetGet() • _InetGetGUI() • _InetGetProgress() • _IPDetails() • _IsFileOlder() • _IsGUID() • _IsHex() • _IsPalindrome() • _IsRegKey() • _IsStringRegExp() • _IsSystemDrive() • _IsUPX() • _IsValidType() • _IsWebColor() • _Language() • _Log() • _MicrosoftInternetConnectivity() • _MSDNDataType() • _PathFull/GetRelative/Split() • _PathSplitEx() • _PrintFromArray() • _ProgressSetMarquee() • _ReDim() • _RockPaperScissors()/_RockPaperScissorsLizardSpock() • _ScrollingCredits • _SelfDelete() • _SelfRename() • _SelfUpdate() • _SendTo() • _ShellAll() • _ShellFile() • _ShellFolder() • _SingletonHWID() • _SingletonPID() • _Startup() • _StringCompact() • _StringIsValid() • _StringRegExpMetaCharacters() • _StringReplaceWholeWord() • _StringStripChars() • _Temperature() • _TrialPeriod() • _UKToUSDate()/_USToUKDate() • _WinAPI_Create_CTL_CODE() • _WinAPI_CreateGUID() • _WMIDateStringToDate()/_DateToWMIDateString() • Au3 script parsing • AutoIt Search • AutoIt3 Portable • AutoIt3WrapperToPragma • AutoItWinGetTitle()/AutoItWinSetTitle() • Coding • DirToHTML5 • FileInstallr • FileReadLastChars() • GeoIP database • GUI - Only Close Button • GUI Examples • GUICtrlDeleteImage() • GUICtrlGetBkColor() • GUICtrlGetStyle() • GUIEvents • GUIGetBkColor() • Int_Parse() & Int_TryParse() • IsISBN() • LockFile() • Mapping CtrlIDs • OOP in AutoIt • ParseHeadersToSciTE() • PasswordValid • PasteBin • Posts Per Day • PreExpand • Protect Globals • Queue() • Resource Update • ResourcesEx • SciTE Jump • Settings INI • SHELLHOOK • Shunting-Yard • Signature Creator • Stack() • Stopwatch() • StringAddLF()/StringStripLF() • StringEOLToCRLF() • VSCROLL • WM_COPYDATA • More Examples... Updated: 22/04/2018 Link to comment Share on other sites More sharing options...
Shaggi Posted November 29, 2011 Share Posted November 29, 2011 (edited) Use elements names for clarity, else just for indexes. An element name takes O(n) strcmp whilst indexes are direct access (i assume) Edited November 29, 2011 by Shaggi Ever wanted to call functions in another process? ProcessCall UDFConsole stuff: Console UDFC Preprocessor for AutoIt OMG Link to comment Share on other sites More sharing options...
guinness Posted November 29, 2011 Author Share Posted November 29, 2011 OK, I thought as much. Thanks shaggi. UDF List: _AdapterConnections() • _AlwaysRun() • _AppMon() • _AppMonEx() • _ArrayFilter/_ArrayReduce • _BinaryBin() • _CheckMsgBox() • _CmdLineRaw() • _ContextMenu() • _ConvertLHWebColor()/_ConvertSHWebColor() • _DesktopDimensions() • _DisplayPassword() • _DotNet_Load()/_DotNet_Unload() • _Fibonacci() • _FileCompare() • _FileCompareContents() • _FileNameByHandle() • _FilePrefix/SRE() • _FindInFile() • _GetBackgroundColor()/_SetBackgroundColor() • _GetConrolID() • _GetCtrlClass() • _GetDirectoryFormat() • _GetDriveMediaType() • _GetFilename()/_GetFilenameExt() • _GetHardwareID() • _GetIP() • _GetIP_Country() • _GetOSLanguage() • _GetSavedSource() • _GetStringSize() • _GetSystemPaths() • _GetURLImage() • _GIFImage() • _GoogleWeather() • _GUICtrlCreateGroup() • _GUICtrlListBox_CreateArray() • _GUICtrlListView_CreateArray() • _GUICtrlListView_SaveCSV() • _GUICtrlListView_SaveHTML() • _GUICtrlListView_SaveTxt() • _GUICtrlListView_SaveXML() • _GUICtrlMenu_Recent() • _GUICtrlMenu_SetItemImage() • _GUICtrlTreeView_CreateArray() • _GUIDisable() • _GUIImageList_SetIconFromHandle() • _GUIRegisterMsg() • _GUISetIcon() • _Icon_Clear()/_Icon_Set() • _IdleTime() • _InetGet() • _InetGetGUI() • _InetGetProgress() • _IPDetails() • _IsFileOlder() • _IsGUID() • _IsHex() • _IsPalindrome() • _IsRegKey() • _IsStringRegExp() • _IsSystemDrive() • _IsUPX() • _IsValidType() • _IsWebColor() • _Language() • _Log() • _MicrosoftInternetConnectivity() • _MSDNDataType() • _PathFull/GetRelative/Split() • _PathSplitEx() • _PrintFromArray() • _ProgressSetMarquee() • _ReDim() • _RockPaperScissors()/_RockPaperScissorsLizardSpock() • _ScrollingCredits • _SelfDelete() • _SelfRename() • _SelfUpdate() • _SendTo() • _ShellAll() • _ShellFile() • _ShellFolder() • _SingletonHWID() • _SingletonPID() • _Startup() • _StringCompact() • _StringIsValid() • _StringRegExpMetaCharacters() • _StringReplaceWholeWord() • _StringStripChars() • _Temperature() • _TrialPeriod() • _UKToUSDate()/_USToUKDate() • _WinAPI_Create_CTL_CODE() • _WinAPI_CreateGUID() • _WMIDateStringToDate()/_DateToWMIDateString() • Au3 script parsing • AutoIt Search • AutoIt3 Portable • AutoIt3WrapperToPragma • AutoItWinGetTitle()/AutoItWinSetTitle() • Coding • DirToHTML5 • FileInstallr • FileReadLastChars() • GeoIP database • GUI - Only Close Button • GUI Examples • GUICtrlDeleteImage() • GUICtrlGetBkColor() • GUICtrlGetStyle() • GUIEvents • GUIGetBkColor() • Int_Parse() & Int_TryParse() • IsISBN() • LockFile() • Mapping CtrlIDs • OOP in AutoIt • ParseHeadersToSciTE() • PasswordValid • PasteBin • Posts Per Day • PreExpand • Protect Globals • Queue() • Resource Update • ResourcesEx • SciTE Jump • Settings INI • SHELLHOOK • Shunting-Yard • Signature Creator • Stack() • Stopwatch() • StringAddLF()/StringStripLF() • StringEOLToCRLF() • VSCROLL • WM_COPYDATA • More Examples... Updated: 22/04/2018 Link to comment Share on other sites More sharing options...
KaFu Posted November 29, 2011 Share Posted November 29, 2011 Using the type 'struct*' (latest Beta required) + fetching the data via the element index and not the name seems the be the fastest way ... expandcollapse popup#Region ;**** Directives created by AutoIt3Wrapper_GUI **** #AutoIt3Wrapper_Version=Beta #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI **** #include <Array.au3> #cs Note: You must have the latest beta as these examples are using struct* instead of DllStructGetPtr. #ce #cs Local $aArray = _WindowsOSVersion_1() ; Using DllStructCreate with the Element name. _ArrayDisplay($aArray) $aArray = _WindowsOSVersion_2() ; Using DllStructCreate with the Element index number. _ArrayDisplay($aArray) #ce $timer = TimerInit() For $i = 0 To 10000 _WindowsOSVersion_1() Next ConsoleWrite(TimerDiff($timer) & @CRLF) $timer = TimerInit() For $i = 0 To 10000 _WindowsOSVersion_2() Next ConsoleWrite(TimerDiff($timer) & @CRLF) $timer = TimerInit() For $i = 0 To 10000 _WindowsOSVersion_3() Next ConsoleWrite(TimerDiff($timer) & @CRLF) $timer = TimerInit() For $i = 0 To 10000 _WindowsOSVersion_4() Next ConsoleWrite(TimerDiff($timer) & @CRLF) Func _WindowsOSVersion_1() ; Using DllStructCreate with the Element name. Local $aVersion[4] = [-1, -1, -1, -1] Local $tagOSVERSIONINFO = DllStructCreate('dword dwOSVersionInfoSize;dword dwMajorVersion;dword dwMinorVersion;dword dwBuildNumber;dword dwPlatformId;wchar szCSDVersion[128]') DllStructSetData($tagOSVERSIONINFO, 'dwOSVersionInfoSize', DllStructGetSize($tagOSVERSIONINFO)) Local $aReturn = DllCall('kernel32.dll', 'int', 'GetVersionExW', 'struct*', $tagOSVERSIONINFO) If @error Or Not $aReturn[0] Then Return SetError(1, 0, $aReturn) EndIf $aVersion[0] = DllStructGetData($tagOSVERSIONINFO, 'dwMajorVersion') $aVersion[1] = DllStructGetData($tagOSVERSIONINFO, 'dwMinorVersion') $aVersion[2] = DllStructGetData($tagOSVERSIONINFO, 'dwBuildNumber') $aVersion[3] = DllStructGetData($tagOSVERSIONINFO, 'szCSDVersion') Return $aVersion EndFunc ;==>_WindowsOSVersion_1 Func _WindowsOSVersion_2() ; Using DllStructCreate with the Element index number. Local $aVersion[4] = [-1, -1, -1, -1] Local $tagOSVERSIONINFO = DllStructCreate('dword;dword;dword;dword;dword;wchar[128]') DllStructSetData($tagOSVERSIONINFO, 1, DllStructGetSize($tagOSVERSIONINFO)) Local $aReturn = DllCall('kernel32.dll', 'int', 'GetVersionExW', 'struct*', $tagOSVERSIONINFO) If @error Or Not $aReturn[0] Then Return SetError(1, 0, $aVersion) EndIf $aVersion[0] = DllStructGetData($tagOSVERSIONINFO, 2) $aVersion[1] = DllStructGetData($tagOSVERSIONINFO, 3) $aVersion[2] = DllStructGetData($tagOSVERSIONINFO, 4) $aVersion[3] = DllStructGetData($tagOSVERSIONINFO, 6) Return $aVersion EndFunc ;==>_WindowsOSVersion_2 Func _WindowsOSVersion_3() ; Using DllStructCreate with the Element name. Local $aVersion[4] = [-1, -1, -1, -1] Local $tagOSVERSIONINFO = DllStructCreate('dword dwOSVersionInfoSize;dword dwMajorVersion;dword dwMinorVersion;dword dwBuildNumber;dword dwPlatformId;wchar szCSDVersion[128]') DllStructSetData($tagOSVERSIONINFO, 'dwOSVersionInfoSize', DllStructGetSize($tagOSVERSIONINFO)) Local $aReturn = DllCall('kernel32.dll', 'int', 'GetVersionExW', 'ptr', DllStructGetPtr($tagOSVERSIONINFO)) If @error Or Not $aReturn[0] Then Return SetError(1, 0, $aReturn) EndIf $aVersion[0] = DllStructGetData($tagOSVERSIONINFO, 'dwMajorVersion') $aVersion[1] = DllStructGetData($tagOSVERSIONINFO, 'dwMinorVersion') $aVersion[2] = DllStructGetData($tagOSVERSIONINFO, 'dwBuildNumber') $aVersion[3] = DllStructGetData($tagOSVERSIONINFO, 'szCSDVersion') Return $aVersion EndFunc ;==>_WindowsOSVersion_1 Func _WindowsOSVersion_4() ; Using DllStructCreate with the Element index number. Local $aVersion[4] = [-1, -1, -1, -1] Local $tagOSVERSIONINFO = DllStructCreate('dword;dword;dword;dword;dword;wchar[128]') DllStructSetData($tagOSVERSIONINFO, 1, DllStructGetSize($tagOSVERSIONINFO)) Local $aReturn = DllCall('kernel32.dll', 'int', 'GetVersionExW', 'ptr', DllStructGetPtr($tagOSVERSIONINFO)) If @error Or Not $aReturn[0] Then Return SetError(1, 0, $aVersion) EndIf $aVersion[0] = DllStructGetData($tagOSVERSIONINFO, 2) $aVersion[1] = DllStructGetData($tagOSVERSIONINFO, 3) $aVersion[2] = DllStructGetData($tagOSVERSIONINFO, 4) $aVersion[3] = DllStructGetData($tagOSVERSIONINFO, 6) Return $aVersion EndFunc ;==>_WindowsOSVersion_2 OS: Win10-22H2 - 64bit - German, AutoIt Version: 3.3.16.1, AutoIt Editor: SciTE, Website: https://funk.eu AMT - Auto-Movie-Thumbnailer (2022-Nov-26) BIC - Batch-Image-Cropper (2023-Apr-01) COP - Color Picker (2009-May-21) DCS - Dynamic Cursor Selector (2024-Feb-16) HMW - Hide my Windows (2018-Sep-16) HRC - HotKey Resolution Changer (2012-May-16) ICU - Icon Configuration Utility (2018-Sep-16) SMF - Search my Files (2023-Jun-03) - THE file info and duplicates search tool SSD - Set Sound Device (2017-Sep-16) Link to comment Share on other sites More sharing options...
guinness Posted November 29, 2011 Author Share Posted November 29, 2011 Thanks KaFu, I got the same result, example 2 was quicker of the 4. UDF List: _AdapterConnections() • _AlwaysRun() • _AppMon() • _AppMonEx() • _ArrayFilter/_ArrayReduce • _BinaryBin() • _CheckMsgBox() • _CmdLineRaw() • _ContextMenu() • _ConvertLHWebColor()/_ConvertSHWebColor() • _DesktopDimensions() • _DisplayPassword() • _DotNet_Load()/_DotNet_Unload() • _Fibonacci() • _FileCompare() • _FileCompareContents() • _FileNameByHandle() • _FilePrefix/SRE() • _FindInFile() • _GetBackgroundColor()/_SetBackgroundColor() • _GetConrolID() • _GetCtrlClass() • _GetDirectoryFormat() • _GetDriveMediaType() • _GetFilename()/_GetFilenameExt() • _GetHardwareID() • _GetIP() • _GetIP_Country() • _GetOSLanguage() • _GetSavedSource() • _GetStringSize() • _GetSystemPaths() • _GetURLImage() • _GIFImage() • _GoogleWeather() • _GUICtrlCreateGroup() • _GUICtrlListBox_CreateArray() • _GUICtrlListView_CreateArray() • _GUICtrlListView_SaveCSV() • _GUICtrlListView_SaveHTML() • _GUICtrlListView_SaveTxt() • _GUICtrlListView_SaveXML() • _GUICtrlMenu_Recent() • _GUICtrlMenu_SetItemImage() • _GUICtrlTreeView_CreateArray() • _GUIDisable() • _GUIImageList_SetIconFromHandle() • _GUIRegisterMsg() • _GUISetIcon() • _Icon_Clear()/_Icon_Set() • _IdleTime() • _InetGet() • _InetGetGUI() • _InetGetProgress() • _IPDetails() • _IsFileOlder() • _IsGUID() • _IsHex() • _IsPalindrome() • _IsRegKey() • _IsStringRegExp() • _IsSystemDrive() • _IsUPX() • _IsValidType() • _IsWebColor() • _Language() • _Log() • _MicrosoftInternetConnectivity() • _MSDNDataType() • _PathFull/GetRelative/Split() • _PathSplitEx() • _PrintFromArray() • _ProgressSetMarquee() • _ReDim() • _RockPaperScissors()/_RockPaperScissorsLizardSpock() • _ScrollingCredits • _SelfDelete() • _SelfRename() • _SelfUpdate() • _SendTo() • _ShellAll() • _ShellFile() • _ShellFolder() • _SingletonHWID() • _SingletonPID() • _Startup() • _StringCompact() • _StringIsValid() • _StringRegExpMetaCharacters() • _StringReplaceWholeWord() • _StringStripChars() • _Temperature() • _TrialPeriod() • _UKToUSDate()/_USToUKDate() • _WinAPI_Create_CTL_CODE() • _WinAPI_CreateGUID() • _WMIDateStringToDate()/_DateToWMIDateString() • Au3 script parsing • AutoIt Search • AutoIt3 Portable • AutoIt3WrapperToPragma • AutoItWinGetTitle()/AutoItWinSetTitle() • Coding • DirToHTML5 • FileInstallr • FileReadLastChars() • GeoIP database • GUI - Only Close Button • GUI Examples • GUICtrlDeleteImage() • GUICtrlGetBkColor() • GUICtrlGetStyle() • GUIEvents • GUIGetBkColor() • Int_Parse() & Int_TryParse() • IsISBN() • LockFile() • Mapping CtrlIDs • OOP in AutoIt • ParseHeadersToSciTE() • PasswordValid • PasteBin • Posts Per Day • PreExpand • Protect Globals • Queue() • Resource Update • ResourcesEx • SciTE Jump • Settings INI • SHELLHOOK • Shunting-Yard • Signature Creator • Stack() • Stopwatch() • StringAddLF()/StringStripLF() • StringEOLToCRLF() • VSCROLL • WM_COPYDATA • More Examples... Updated: 22/04/2018 Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now