Sign in to follow this  
Followers 0
guinness

DllStructCreate & DllStructGet/SetData - element name or index (code of practice)

5 posts in this topic

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

_AdapterConnections()_AlwaysRun()_AppMon()_AppMonEx()_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 parsingAutoIt SearchAutoIt3 PortableAutoIt3WrapperToPragmaAutoItWinGetTitle()/AutoItWinSetTitle()CodingDirToHTML5FileInstallrFileReadLastChars()GeoIP databaseGUI - Only Close ButtonGUI ExamplesGUICtrlDeleteImage()GUICtrlGetBkColor()GUICtrlGetStyle()GUIEventsGUIGetBkColor()Int_Parse() & Int_TryParse()IsISBN()LockFile()Mapping CtrlIDsOOP in AutoItParseHeadersToSciTE()PasswordValidPasteBinPosts Per DayPreExpandProtect GlobalsQueue()Resource UpdateResourcesExSciTE JumpSettings INISHELLHOOKShunting-YardSignature CreatorStack()Stopwatch()StringAddLF()/StringStripLF()StringEOLToCRLF()VSCROLLWM_COPYDATAMore Examples...

Updated: 04/09/2015

Share this post


Link to post
Share on other sites



#2 ·  Posted (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 by Shaggi

Ever wanted to call functions in another process? ProcessCall UDFConsole stuff: Console UDFC Preprocessor for AutoIt OMG

Share this post


Link to post
Share on other sites

OK, I thought as much. Thanks shaggi.


_AdapterConnections()_AlwaysRun()_AppMon()_AppMonEx()_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 parsingAutoIt SearchAutoIt3 PortableAutoIt3WrapperToPragmaAutoItWinGetTitle()/AutoItWinSetTitle()CodingDirToHTML5FileInstallrFileReadLastChars()GeoIP databaseGUI - Only Close ButtonGUI ExamplesGUICtrlDeleteImage()GUICtrlGetBkColor()GUICtrlGetStyle()GUIEventsGUIGetBkColor()Int_Parse() & Int_TryParse()IsISBN()LockFile()Mapping CtrlIDsOOP in AutoItParseHeadersToSciTE()PasswordValidPasteBinPosts Per DayPreExpandProtect GlobalsQueue()Resource UpdateResourcesExSciTE JumpSettings INISHELLHOOKShunting-YardSignature CreatorStack()Stopwatch()StringAddLF()/StringStripLF()StringEOLToCRLF()VSCROLLWM_COPYDATAMore Examples...

Updated: 04/09/2015

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Thanks KaFu, I got the same result, example 2 was quicker of the 4.


_AdapterConnections()_AlwaysRun()_AppMon()_AppMonEx()_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 parsingAutoIt SearchAutoIt3 PortableAutoIt3WrapperToPragmaAutoItWinGetTitle()/AutoItWinSetTitle()CodingDirToHTML5FileInstallrFileReadLastChars()GeoIP databaseGUI - Only Close ButtonGUI ExamplesGUICtrlDeleteImage()GUICtrlGetBkColor()GUICtrlGetStyle()GUIEventsGUIGetBkColor()Int_Parse() & Int_TryParse()IsISBN()LockFile()Mapping CtrlIDsOOP in AutoItParseHeadersToSciTE()PasswordValidPasteBinPosts Per DayPreExpandProtect GlobalsQueue()Resource UpdateResourcesExSciTE JumpSettings INISHELLHOOKShunting-YardSignature CreatorStack()Stopwatch()StringAddLF()/StringStripLF()StringEOLToCRLF()VSCROLLWM_COPYDATAMore Examples...

Updated: 04/09/2015

Share this post


Link to post
Share on other sites

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
Sign in to follow this  
Followers 0