Jump to content

Recommended Posts

Posted (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 GetVersionExW

#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 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

Posted

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

Posted

Using the type 'struct*' (latest Beta required) + fetching the data via the element index and not the name seems the be the fastest way :D...

#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
Posted

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

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...