1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. Trolleule1337

Beiträge von Trolleule1337

  • Dictionary übergeben ByRef Problem

    • Trolleule1337
    • 13. Mai 2014 um 17:43

    Ja habe ich auch getestet. Dein Beispiel funktioniert bei mir auch...

    In meinem Szenario funktioniert es nicht, die Frage ist wieso?

    Der Code kann so ausgeführt werden, könnt ihr mal drüber schauen, muss ja einen Grund haben warum ich es nicht einfach in eine Variable kopieren kann ?(

  • Dictionary übergeben ByRef Problem

    • Trolleule1337
    • 13. Mai 2014 um 15:03

    Hi,
    ich hab mal einen Auszug aus meinem Projekt gemacht um das Problem anschaulich zu machen:

    [autoit]

    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <GuiListView.au3>
    #include <String.au3>

    [/autoit][autoit][/autoit][autoit]

    Opt("GUIOnEventMode", 1) ; enable OnEvent functions notifications
    Global $oOnEventDict = ObjCreate("Scripting.Dictionary")

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Example()

    [/autoit][autoit][/autoit][autoit]

    Func Example()
    Local $WimData = ObjCreate("Scripting.Dictionary")
    Local $comDict = ObjCreate("Scripting.Dictionary")
    Local $aArray = [$comDict, $WimData]

    [/autoit][autoit][/autoit][autoit]

    ; Create a GUI with various controls.
    Local $hGUI = GUICreate("Example")
    Local $iOK = GUICtrlCreateButton("OK", 310, 370, 85, 25)
    Local $iset = GUICtrlCreateButton("Set", 210, 370, 85, 25)
    Local $ishow = GUICtrlCreateButton("Show", 110, 370, 85, 25)

    [/autoit][autoit][/autoit][autoit]

    ; set on event
    GUICtrlSetOnEventEx($iOK, "SetComDict", $comDict)
    GUICtrlSetOnEventEx($iset, "SetWimData", $aArray, 1)
    GUICtrlSetOnEventEx($ishow, "_ArrayListDisplay", $WimData)

    [/autoit][autoit][/autoit][autoit]

    ; Display the GUI.
    GUISetState(@SW_SHOW, $hGUI)

    [/autoit][autoit][/autoit][autoit]

    ; Loop until the user exits.
    While 1
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    ExitLoop

    [/autoit][autoit][/autoit][autoit]

    EndSwitch
    WEnd

    [/autoit][autoit][/autoit][autoit]

    ; Delete the previous GUI and all controls.
    GUIDelete($hGUI)
    EndFunc ;==>Example

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Func SetWimData(ByRef $comDict, ByRef $WimData)
    _ArrayListDisplay($comDict)
    _ArrayListDisplay($WimData)
    ;~ $WimData = $comDict ; Warum funktioniert das so nicht?

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    For $k in $comDict.Keys
    $WimData.add($k, $comDict($k)) ; Warum funktioniert es so?
    Next

    [/autoit][autoit][/autoit][autoit]

    _ArrayListDisplay($WimData)
    EndFunc

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Func SetComDict(ByRef $comDict)
    $comDict.add("1", "Hier1")
    $comDict.add("2", "Hier2")

    [/autoit][autoit][/autoit][autoit]

    Local $newDict = ObjCreate("Scripting.Dictionary")
    $newDict.add("10", "test10")
    $newDict.add("11", "test11")

    [/autoit][autoit][/autoit][autoit]

    $comDict.add("Dict", $newDict)
    EndFunc

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    ; helper function for debug
    Func _ArrayListDisplay(ByRef $ArrayList, $isDict = 0, $hParent = 0)
    If Not IsObj($ArrayList) Then Return MsgBox(64, "Object Error", "No object to process.") ; verify object
    If $isDict = 1 And Not IsArray($ArrayList.Keys) Then Return MsgBox(64, "Dictionary Error", "Dictionary is empty.") ; verify keys
    Local $Opt_OnEventMode, $counter = 1
    If $hParent Then
    $Opt_OnEventMode = Opt("GUIOnEventMode", 1)
    Else
    $Opt_OnEventMode = Opt("GUIOnEventMode", 0)
    EndIf
    Opt("GUICoordMode", 1) ; absolute position
    Local $GUI = GUICreate("ArrayList", 572, 536, -1, -1, -1, -1, $hParent)
    Local $ListView = GUICtrlCreateListView("ID|Element", 8, 8, 553, 536-8*2)

    [/autoit][autoit][/autoit][autoit]

    ; if object is a dict, read elements and values
    If $isDict = 1 And $hParent Then
    _GUICtrlListView_AddColumn($ListView, "Value")
    ControlMove($GUI, "", $ListView, 8, 8, 553, 481)
    Local $showBtn = GUICtrlCreateButton("Display", 8, 536-30-8, 60, 30)
    Local $test = [$ArrayList, $ListView, $GUI]
    GUICtrlSetOnEventEx($showBtn, "_DataDisplay", $test, 1)
    For $key In $ArrayList.Keys
    Local $val = $ArrayList($key) ; value
    GUICtrlCreateListViewItem($counter & '|' & $key & '|' & $val, $ListView)
    $counter += 1
    Next
    ; if object is list, read elements only
    Else
    For $e In $ArrayList
    GUICtrlCreateListViewItem($counter & '|' & $e, $ListView)
    $counter += 1
    Next
    EndIf
    GUISetState(@SW_SHOW)
    If Not $hParent Then
    Do
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    ExitLoop
    EndSwitch
    Until 0
    GUIDelete($GUI)
    EndIf
    Opt("GUIOnEventMode", $Opt_OnEventMode) ; undo changes
    EndFunc

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    ; #FUNCTION# ====================================================================================================================
    ; Name...........: GUICtrlSetOnEventEx
    ; Description ...: Ruft eine benutzerdefinierte Funktion mit Parametern auf, wenn das GUI-Control angeklickt wurde.
    ; Syntax.........: GUICtrlSetOnEventEx($controlID,[$Function,[$aParameter]])
    ; Parameters ....: $controlID - ID des Controls
    ; $Function - Der Name der Funktion als String
    ; $aParameter - Die Parameter als eindimensionales Array
    ; Author ........: Zeitriss
    ; ===============================================================================================================================
    Func GUICtrlSetOnEventEx($controlID, $Function = Default, $aParameter = Default, $AssignFlag = 0)
    If $Function <> Default Then
    Local $Data = ObjCreate("Scripting.Dictionary")
    If $aParameter = Default Then
    GUICtrlSetOnEvent($controlID, $Function)
    Else
    $Data.add("Parameter", $aParameter)
    EndIf
    $Data.add("Function", $Function)
    $Data.add("AssignFlag", $AssignFlag)
    If $oOnEventDict.Exists(String($controlID)) Then $oOnEventDict.remove(String($controlID))
    $oOnEventDict.add(String($controlID), $Data)
    Local $DataDict = $oOnEventDict(String($controlID))
    GUICtrlSetOnEvent($controlID, "GUICtrlSetOnEventBuffer")
    Else
    If $oOnEventDict.Exists(String($controlID)) Then $oOnEventDict.remove(String($controlID))
    EndIf
    EndFunc

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Func GUICtrlSetOnEventBuffer()
    If Not $oOnEventDict.Exists(String(@GUI_CtrlId)) Then Return
    Local $Data = $oOnEventDict(String(@GUI_CtrlId))
    Local $params = $Data("Parameter")
    If $Data("AssignFlag") = 1 Then
    If IsArray($params) Then _ArrayInsert($params, 0, "CallArgArray")
    If IsObj($params) Then $params.Insert(0, "CallArgArray")
    EndIf
    Call($Data("Function"), $params)
    EndFunc

    [/autoit]

    Die Funktion _ArrayListDisplay könnt ihr ignorieren, die funktioniert wie _ArrayDisplay nur mit Objekten!


    Ich verknüpfe mit GUICtrlSetOnEventEx (Wie GUICtrlSetOnEvent, nur das ich hier mehrere Parameter übergeben kann) die Buttons mit bestimmten Funktionen und übergebe bei der Funktion "SetWimData" das leere Dictionary $WimData. Das möchte ich dann in einer anderen Funktion die ich auch mit einem Button verknüpft habe mit Daten füllen um es dann bei der letzten Funktion (GUICtrlSetOnEventEx($ishow, "_ArrayListDisplay", $WimData)) darzustellen.

    Hat jemand eine Idee warum ich in der "SetWimData" Funktion nicht einfach

    [autoit]

    $WimData = $comDict

    [/autoit]

    schreiben kann sondern das machen muss damit es klappt??

    [autoit]

    For $k in $comDict.Keys
    $WimData.add($k, $comDict($k)) ; Warum funktioniert es so?
    Next

    [/autoit]

    Danke schonmal!

  • Von ListView Header handle, listeview handle ermitteln

    • Trolleule1337
    • 19. März 2014 um 23:33

    stark jung, klappt super. Vielen Dank! :thumbup:

  • Von ListView Header handle, listeview handle ermitteln

    • Trolleule1337
    • 15. März 2014 um 12:49

    Hi,
    ist es möglich vom ListView header handle das handle vom parent, also vom listview zurückzugeben?

    Danke!

  • Shell Interface: IShellFolder

    • Trolleule1337
    • 1. März 2014 um 02:29

    hey Leute,
    ich folge gerade dieser Anleitung:
    msdn

    Es geht im Text darum wie ich Informationen über ein folder Objekt erhalte, indem ich das IShellFolder interface benutze.

    Zitat

    To retrieve a pointer to a namespace object's IShellFolder interface, you must first call SHGetDesktopFolder.


    Hab ich erledigt. Als Return habe ich nun einen pointer zum IShellFollder interface erhalten. Danach

    Zitat

    If you already have the PIDL of the folder you are interested in—for instance, by calling SHGetFolderLocation—you can retrieve its IShellFolder interface by calling the desktop's IShellFolder::BindToObject method. If you have the path of a file system object, you must first obtain its PIDL by calling the desktop's IShellFolder::ParseDisplayName method and then call IShellFolder::BindToObject. If neither of these approaches is applicable, you can use other IShellFolder methods to navigate the namespace. For more information, see Navigating the Namespace.

    Ich hab zwar auch eine PIDL (absolute), aber verstehe den Zweck des zuvorerhaltenen pointers nicht. Was kann ich mit pointer zu interfaces machen? Ich habe bisher keine Funktion gesehen, die z.B. aus einem pointer eines interfaces ein Objekt macht?!

    Wenn ich das ganze richtig verstanden habe, dann muss ich doch erstmal ein Objekt erstellen um auf die Methoden zugreifen zu können und das kann man mit

    Zitat

    ObjCreateInterface ( "CLSID" , "IID" [, "interface_description",[flag = True]] )

    Dort gebe ich irgendeine CLSID eines COM objektes rein, welches das Interface implementiert hat, auf dessen Methoden ich zugreifen möchte, also hier IShellFolder, die Interface ID und den Funktions-tag und erhalte ein objekt welches mir erlaubt die Methoden zu benutzen, hab ich doch richtig verstanden oder?

    Also wofür ist der pointer auf ein interface zu gebrauchen? Und was macht die BindToObject Methode, als ouput gibts wieder einen pointer auf das angefragte interface, man gibt ja wieder eine interface id rein^, wobei ich die anderen parameter auch nicht verstehe.

    Am Ende des Tages möchte ich nur die Methode 'GetDisplayNameOf' des IShellFolder interfaces anwenden. Allerdings versteh ich die auch nicht weil ich aktuell eine PIDLIST_ABSOLUTE (Returns a PIDL that specifies the location of the selected folder relative to the root of the namespace.) habe und als parfameter muss ich PCUITEMID_CHILD (PIDL that uniquely identifies the file object or subfolder relative to the parent folder.) übergebn, aber ich weiß nicht woher ich die bekomme

    Zitat

    HRESULT GetDisplayNameOf(
    [in] PCUITEMID_CHILD pidl,
    [in] SHGDNF uFlags,
    [out] STRRET *pName
    );

    Ich lese mich seit tagen ein, aber ich raff das vorne und hinten nicht, kann mir das mal bitte jemand erklären?
    Danke

  • Erklärung Shell32.dll Funktion

    • Trolleule1337
    • 28. Februar 2014 um 01:23

    Hi,
    ich versteh nicht wie ich die ShouldShow Funktion, hier einsetzen muss.
    Ich gebe 3 Parameter mit und bekomme entweder 0 zurück, wenns angezeigt werden soll oder 1 wenn nicht. Aber wie beeinflusse ich denn überhaupt, was die Funktion returned?

    Zitat

    HRESULT ShouldShow(
    [in] IShellFolder *psf,
    [in] PCIDLIST_ABSOLUTE pidlFolder,
    [in] PCUITEMID_CHILD pidlItem
    );

    Danke schonmal!!

  • Select Folder/File (_WinAPI_BrowseForFolderDlg()) mit Filter Option: PIDL (IDLIST) auslesen

    • Trolleule1337
    • 23. Februar 2014 um 18:11

    Hey Leute,
    ich bin auf die Funktion _WinAPI_BrowseForFolderDlg() gestoßen, welche deutlich mehr Optionen hat als FileSelectFolder() oder FileOpenDialog(), denn man kann ein flag setzen, um auch Files auszuwählen. Leider fehlt ein Parameter, der es erlaubt die files zu filtern.

    Die Definition der Funktion sieht so aus:

    [autoit]

    Func _WinAPI_BrowseForFolderDlg($sRoot = '', $sText = '', $iFlags = 0, $pBrowseProc = 0, $lParam = 0, $hParent = 0)
    Local Const $tagBROWSEINFO = 'hwnd hwndOwner;ptr pidlRoot;ptr pszDisplayName; ptr lpszTitle;uint ulFlags;ptr lpfn;lparam lParam;int iImage'
    Local $tBROWSEINFO = DllStructCreate($tagBROWSEINFO & ';wchar[' & (StringLen($sText) + 1) & '];wchar[260]')
    Local $PIDL = 0, $Result = ''

    [/autoit][autoit][/autoit][autoit]

    If StringStripWS($sRoot, 3) Then
    Local $Path = _WinAPI_PathSearchAndQualify($sRoot, 1)
    If @error Then
    $Path = $sRoot
    EndIf
    $PIDL = _WinAPI_ShellILCreateFromPath($Path)
    If @error Then
    ; Nothing
    EndIf
    EndIf

    [/autoit][autoit][/autoit][autoit]

    DllStructSetData($tBROWSEINFO, 1, $hParent)
    DllStructSetData($tBROWSEINFO, 2, $PIDL)
    DllStructSetData($tBROWSEINFO, 3, DllStructGetPtr($tBROWSEINFO, 10))
    DllStructSetData($tBROWSEINFO, 4, DllStructGetPtr($tBROWSEINFO, 9))
    DllStructSetData($tBROWSEINFO, 5, $iFlags)
    DllStructSetData($tBROWSEINFO, 6, $pBrowseProc)
    DllStructSetData($tBROWSEINFO, 7, $lParam)
    DllStructSetData($tBROWSEINFO, 8, 0)
    DllStructSetData($tBROWSEINFO, 9, $sText)

    [/autoit][autoit][/autoit][autoit]

    Local $Ret = DllCall('shell32.dll', 'ptr', 'SHBrowseForFolderW', 'struct*', $tBROWSEINFO)
    If @error Or Not $Ret[0] Then Return SetError(@error, @extended, '')
    ; If Not $Ret[0] Then Return SetError(1000, 0, '')

    [/autoit][autoit][/autoit][autoit]

    $Result = _WinAPI_ShellGetPathFromIDList($Ret[0])
    _WinAPI_CoTaskMemFree($Ret[0])
    If $PIDL Then
    _WinAPI_CoTaskMemFree($PIDL)
    EndIf
    If Not $Result Then Return SetError(10, 0, '')

    [/autoit][autoit][/autoit][autoit]

    Return $Result
    EndFunc ;==>_WinAPI_BrowseForFolderDlg

    [/autoit]

    Dahinter steckt die Shell Funktion "SHBrowseForFolder" der man ein "BROWSEINFO" struct mitgibt.

    So weit alles verständlich. In der Beschreibung von "SHBrowseForFolder" ist erklärt, wie man den Inhalt im TreeView filtert und an dieser Stelle weiß ich nicht mehr weiter:

    Zitat

    Custom Filtering
    As of Windows XP, SHBrowseForFolder supports custom filtering on the contents of the dialog box. To create a custom filter, follow these steps.
    1. Set the BIF_NEWDIALOGSTYLE flag in the ulFlags member of the BROWSEINFO structure pointed to by the lpbi parameter.
    2. Specify a callback function in the lpfn member of that same BROWSEINFO structure.
    3. Code the callback function to receive the BFFM_INITIALIZED and BFFM_IUNKNOWN messages. On receipt of the BFFM_IUNKNOWN message, the callback function's lParam parameter contains a pointer to the dialog box's implementation of IUnknown. Call QueryInterface on that IUnknown to obtain a pointer to an instance of IFolderFilterSite.
    4. Create an object that implements IFolderFilter.
    5. Call IFolderFilterSite::SetFilter, passing to it a pointer to your IFolderFilter. IFolderFilter methods can then be used to include and exclude items from the tree.
    6. Once the filter is created, the IFolderFilterSite interface is no longer needed. Call IFolderFilterSite::Release if you have no further use for it.

    Alles anzeigen

    Punkte 1-3 sind erledigt, sieht dann so aus:

    [autoit]

    #include <WinAPIDlg_test.au3>
    #include <APIDlgConstants.au3>
    #include <WinAPISys.au3>
    #include <MsgBoxConstants.au3>

    [/autoit][autoit][/autoit][autoit]

    Global Const $InitDir = @ProgramFilesDir

    [/autoit][autoit][/autoit][autoit]

    Local $hBrowseProc = DllCallbackRegister('_BrowseProc', 'int', 'hwnd;uint;lparam;ptr')
    Local $pBrowseProc = DllCallbackGetPtr($hBrowseProc)

    [/autoit][autoit][/autoit][autoit]

    Local $pText = _WinAPI_CreateString($InitDir)
    Local $Path = _WinAPI_BrowseForFolderDlg(_WinAPI_PathStripToRoot($InitDir), 'Select a folder from the list below.', BitOR($BIF_EDITBOX, $BIF_BROWSEINCLUDEFILES, $BIF_NEWDIALOGSTYLE), $pBrowseProc, $pText)
    _WinAPI_FreeMemory($pText)

    [/autoit][autoit][/autoit][autoit]

    If $Path Then
    ConsoleWrite('--------------------------------------------------' & @CRLF)
    ConsoleWrite($Path & @CRLF)
    EndIf

    [/autoit][autoit][/autoit][autoit]

    DllCallbackFree($hBrowseProc)

    [/autoit][autoit][/autoit][autoit]

    Func _BrowseProc($hWnd, $iMsg, $wParam, $lParam)
    Local $Path
    Switch $iMsg
    Case $BFFM_INITIALIZED
    _WinAPI_SetWindowText($hWnd, 'MyTitle')
    _SendMessage($hWnd, $BFFM_SETSELECTIONW, 1, $lParam)
    Case $BFFM_SELCHANGED
    $Path = _WinAPI_ShellGetPathFromIDList($wParam)
    If Not @error Then
    ConsoleWrite($Path & @CRLF)
    EndIf
    Case $BFFM_VALIDATEFAILED
    MsgBox(BitOR($MB_ICONERROR, $MB_SYSTEMMODAL), 'Error', _WinAPI_GetString($wParam) & ' is invalid.', 0, $hWnd)
    Return 1
    Case $BFFM_IUNKNOWN
    ConsoleWrite($lParam & @CRLF)
    EndSwitch
    Return 0
    EndFunc ;==>_BrowseProc

    [/autoit]


    Ich weiß, dass ich mit ObjCreateInterface ( "CLSID" , "IID" [, "interface_description",[flag = True]] )
    das IUnknown interface erstellen kann, aber nicht wie. Dann versteh ich nicht was ich bei QueryInterface als Parameter übergeben muss

    Zitat

    HRESULT QueryInterface(
    [in] REFIID riid,
    [out] void **ppvObject
    );

    Wo finde ich die 'riid'?

    Habt ihr da eine Idee wie ich das definieren muss?
    Danke Leute!

  • Variable vom Typ Object nach compile Int32 in WinPE_SE

    • Trolleule1337
    • 6. November 2013 um 16:22

    ok das löst das Problem. Aber dann steh ich vor dem Problem davor, dass der map drive nicht funktioniert:

    [autoit]

    Global $letter = DriveMapAdd("*", "\\192.168.0.10\network_share", 0, "Administrator", "test")
    Switch @error
    Case 1
    MsgBox(0, "MapDrive", "Undefined / Other error. @extended set with Windows API return." & @extended)
    Case 2
    MsgBox(0, "MapDrive", "Access to the remote share was denied.")
    Case 3
    MsgBox(0, "MapDrive", "The device is already assigned.")
    Case 4
    MsgBox(0, "MapDrive", "Invalid device name.")
    Case 5
    MsgBox(0, "MapDrive", "Invalid remote share.")
    Case 6
    MsgBox(0, "MapDrive", "Invalid password.")
    EndSwitch

    [/autoit]

    Er landet dann immer bei Case 1.

    Ich hab das Programm als x86 kompiliert und wende es in einer x64 Umgebung an. Ich dachte zuerst es liegt daran, wie ich es kompiliere, da es mit x64 kompilieren funktioniert. Egal was ich mache immer Case 1 Fehler. Bug?

  • Variable vom Typ Object nach compile Int32 in WinPE_SE

    • Trolleule1337
    • 5. November 2013 um 18:54

    Hey,
    komischerweise funktioniert das Script nicht, wenn ich es in meiner WinPE_SE starte (x64). Dort wandelt er nämlich das Object $AList in den Typ Int32 (MsgBox(0, "Typ", VarGetType($AList))) um.
    Hat jemand ne Idee, warum das so ist? Oder liegt das daran, dass die Umgebung in der PE 64bit ist und die meines Desktops 32bit?

    [autoit]

    Global $AList = ObjCreate("System.Collections.ArrayList")
    MsgBox(0, "dfsf", "adad")
    For $i = 65 To 90 ; ASCII digits
    If Not FileExists(Chr($i) & ':\') Then
    MsgBox(0, "dfsf", VarGetType($AList))
    $AList.add(Chr($i) & ':')
    EndIf
    Next

    [/autoit]
  • Speicherstelle auslesen. AutoIT stürzt ab

    • Trolleule1337
    • 1. Oktober 2013 um 23:12

    kein Unterschied Sir, selbe Ausgabe:

    Zitat

    h?t?t?p?:?/?/?g?o?.?m?i?c?r?o?s?o?f?t?.?c?o?m?/?f?w?l?i?n?k???L?i?n?k?I?D?=?

  • Speicherstelle auslesen. AutoIT stürzt ab

    • Trolleule1337
    • 1. Oktober 2013 um 18:16

    So wie es aussieht ist Andy der Gewinner, dieser Challenge...

    So siehts aus:

    [autoit]

    Func GetPCWSTR(ByRef $struct, $sElementName) ; avoids memory access conflicts
    Local $anz = 0 ;anzahl Zeichen
    Local $ptr = DllStructGetData($struct, $sElementName) ; ptr
    ;~ Local $ptr = ptr(DllStructGetData($struct, $sElementName)) ; klappt auch
    Do
    $char_struct = DllStructCreate("WCHAR", $ptr + $anz) ; get memory location
    $anz += 1
    ConsoleWrite(DllStructGetData($char_struct, 1))
    Until DllStructGetData($char_struct, 1) = Chr(0) ; end of string
    Local $string_struct = DllStructCreate("WCHAR[" & $anz / 2 & "]", $ptr) ; create struct with correct amount of bytes
    Return DllStructGetData($string_struct, 1)
    EndFunc

    [/autoit]

    Zwar gibt es keinen Absturz mehr, dafür endet der Link beim selben Zeichen wie bei der doppelt gemoppelt Lösung:

    Zitat

    h?t?t?p?:?/?/?g?o?.?m?i?c?r?o?s?o?f?t?.?c?o?m?/?f?w?l?i?n?k???L?i?n?k?I?D?=?

    Array Ausgabe:

    Zitat

    [1]|SoftBlockLink|http://go.microsoft.com/fwlink?LinkID=|0

    So sollte es aussehen:
    http://go.microsoft.com/fwlink?LinkID=1400092

    Habt ihr ne Idee wieso er die letzten 7 Zeichen nicht aufnimmt?


    EDIT: Sorry Leute, ihr habt beide irgendwie Recht, glaube ich...aber bitte nicht drum streiten.
    Wenn ich

    [autoit]

    $anz += 2

    [/autoit]

    statt

    [autoit]

    $anz += 1

    [/autoit]

    verwende, dann bekomme ich den vollen string und die Fragezeichen zw. den Zeichen sind damit auch Geschichte. Ich denke damit ist die Sache gelöst! Vielen Dank Jungs :thumbup:

  • Speicherstelle auslesen. AutoIT stürzt ab

    • Trolleule1337
    • 29. September 2013 um 03:24

    Hab den Fehler gefunden :thumbdown:

    [autoit]

    Local $CustomProperty_struct = DllStructCreate($tagDismCustomProperty, DllStructGetPtr($FeatureInfo_struct, DetermineLocation($tagDismCustomProperty, $properties, 1))) ; offset = 1

    [/autoit]


    Richtig ist:

    [autoit]

    Local $CustomProperty_struct = DllStructCreate($tagDismCustomProperty, DllStructGetData($FeatureInfo_struct, "CustomProperty"))

    [/autoit]

    Hab da was durcheinander gebracht. :S
    Naja jetzt bekomme ich als Daten, die, die auch die Kommandozeile zurückgibt...also den Link.

    Edit: Ab und zu stürzt AutoIt immernoch ab. Schau mal bitte, ob ich deine Funktion so richtig übernommen habe:

    [autoit]

    Func GetPCWSTR(ByRef $struct, $sElementName) ; avoids memory access conflicts
    Local $char_struct, $char
    Local $PCWSTR_struct = DllStructCreate("WCHAR [260]", DllStructGetData($struct, $sElementName))
    Local $ptr = DllStructGetPtr($PCWSTR_struct) ; get pointer
    _DISM_Delete($PCWSTR_struct) ; free resources
    ConsoleWrite($sElementName & @crlf)
    Local $i = $ptr ; counter for signs
    ; read memory location until end of string
    Do
    $char_struct = DllStructCreate("WCHAR", $i) ; get memory location
    $i += 1
    $char = DllStructGetData($char_struct, 1) ; read sign at position
    ConsoleWrite($char)
    Until $char = Chr(0) ; end of string
    Local $string_struct = DllStructCreate("WCHAR[" & Int($i - $ptr) & "]", $ptr) ; create struct with correct amount of bytes
    Return DllStructGetData($string_struct, 1)
    EndFunc

    [/autoit]

    $char gibt folgendes aus:

    Zitat

    h?t?t?p?:?/?/?g?o?.?m?i?c?r?o?s?o?f?t?.?c?o?m?/?f?w?l?i?n?k???L?i?n?k?I?D?=?>Exit code: -1073741819 Time: 24.042

    Also auf das 4-letzte Zeichen kann er nicht zugreifen ?(

  • Speicherstelle auslesen. AutoIT stürzt ab

    • Trolleule1337
    • 28. September 2013 um 20:30

    Doch habe Probleme damit, ich weiß nicht weiter. Die anderen Elemente (Name und Path) auszulesen ist kein Problem, dafür habe ich deine Funktion aus dem anderen Thread verwendet.

    Zitat von Andy

    Hi,
    dein Problem ist, dass du auf 260 Byte Speicher mit

    [autoit]

    $struct = DllStructCreate("WCHAR[260]", $ptr)

    [/autoit]

    zugreifen willst, aber garnicht weisst, wie groß deine Struct wirklich ist....
    Angenommen, die Struct hat eine Länge von 53 Bytes, und ab dem 54.Byte fängt eine (vom Speichermanagement geschützte) andere Struct an, dann bekommst du eine Zugriffsverletzung, also Absturz.

    Also musst du für die Struct die GENAUE Anzahl Bytes herausfinden!
    Ich mache das immer so, dass ich die entsprechenden *.h-Dateien bzw. Projekte in das VisualStudio lade und mir dann "rückwärts" die genaue Definition (Datentyp) von bspw. "DismRestartType" hole.
    Dann kommt bspw. heraus, dass jeder Member in dieser Struct ein UINT ist, dann weiss ich, das sind 4 Bytes.....Summe aller Bytes sind bspw. 53.
    Damit erstelle ich dann eine Struct, welche ich an die Position des Startpointers schreibe und somit mit "meiner" Struct die Daten auslesen (und prüfen!!!) kann!

    Wenn man im Falle eines PCWSTR also eines Pointers auf einen string unbekannter länge nicht weiss, wie lang der string ist, dann ist

    [autoit]

    $struct = DllStructCreate("WCHAR[260]", $ptr)

    [/autoit]

    suboptimal! Entweder die 260 Bytes (Unicode^^ ) sind zu groß, dann Absturz s.o., oder der angezeigte String ist in der Mitte abgeschnitten...

    Also etwa so:

    [autoit]

    ;wir bekommen den Pointer von einem "unbekannten" String
    $struct = DllStructCreate("WCHAR[260]") ;platz für string reservieren...viel zu viel
    DllStructSetData($struct, 1, "Hallo AutoIt!" & Chr(0)) ;"unbekannten" unicodestring schreiben

    [/autoit] [autoit][/autoit] [autoit]

    $ptr = DllStructGetPtr($struct) ;pointer bekommen

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;ab hier gehts los
    $i = $ptr ;zeichenzähler
    Do ;jede speicherstelle im string durchlaufen, bis stringende
    $char_struct = DllStructCreate("WCHAR", $i) ;speicherstelle auswählen
    $i += 1 ;Zeichenzähler
    $char = DllStructGetData($char_struct, 1) ;char an dieser Position lesen
    Until $char = Chr(0) ;string ende

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $stringstruct = DllStructCreate("WCHAR[" & Int($i - $ptr) & "]", $ptr);struct an stringposition mit genauer anzahl bytes erstellen
    $string = DllStructGetData($stringstruct, 1)
    MsgBox(262144, 'Debug line ~' & @ScriptLineNumber, 'Selection:' & @LF & '$string' & @LF & @LF & 'Return:' & @LF & $string) ;### Debug MSGBOX

    [/autoit]
    Alles anzeigen


    Aber Value, keine Chance, immer Absturz sobald ich mit DllStructGetData auf den Pointer zugreifen will.

    [autoit]

    Local $curElement = DllStructGetData(DllStructCreate("WCHAR", DllStructGetData($FeatureInfo_struct, "Value")), 1)

    [/autoit]

    Wenn ich DISM in der Befehlszeile verwenden bekomme ich als "Custom Properties"/"Benutzerdefinierte Eigenschaften" folgendes:

    Zitat

    Tool zur Abbildverwaltung fr die Bereitstellung
    Version: 6.1.7600.16385

    Abbildversion: 6.1.7601.17514

    Funktionsinformationen:

    Funktionsname : MediaCenter
    Anzeigename : Windows Media Center
    Beschreibung : Windows Media Center
    Neustart erforderlich : Possible
    Status : Aktivierung steht aus

    Benutzerdefinierte Eigenschaften:

    SoftBlockLink : http://go.microsoft.com/fwlink?LinkID=152882

    Der Vorgang wurde erfolgreich beendet.

    Alles anzeigen

    Die Daten aus der DLL sehen so aus (aus meinem Array kopiert):

    Zitat

    [0]|FeatureName|FeatureState|DisplayName|Description|RestartRequired
    [1]|MediaCenter|InstallPending|Windows Media Center|Windows Media Center|Possible


    Custom Properties (ohne Value):

    Zitat

    [0]|Name|Path|
    [1]|MediaCenter|Windows Media Center

    Hab das Bild von dem Custom Property struct nochmal angehangen...

    Könnte im fehlenden Value, vllt. der Link stehen, andernfalls unterscheiden sich die Daten aus der DLL mit denen der Befehlszeile bzw. sind unvollständig?
    Hast du nicht eine Idee?

    Dateien

    dfg.png 53,42 kB – 0 Downloads
  • Speicherstelle auslesen. AutoIT stürzt ab

    • Trolleule1337
    • 27. September 2013 um 22:57

    ich bin Fachinformatiker für Systemintegration :D :D :D

    wieso Speicherstelle, die juckt doch gar nicht. Der Wert ist 5. Aber es hapert an der Umsetzung, also wie ich die Daten richtig auslesen kann?

    Edit: So... habe nochmals ausgiebig getestet und viele Berechnungen durchgeführt und ich bin zum Ergebnis gekommen, dass ich ohne euch verloren bin. Was ich auch mache, AutoIT stürzt ab. Jetzt brauch ich euch Leute, bitte helft mir: Bitte nur aufzeigen wie ich den Wert auslesen kann!?

    Danke Freunde!

  • Speicherstelle auslesen. AutoIT stürzt ab

    • Trolleule1337
    • 27. September 2013 um 20:52

    oki

    [autoit]

    Func _DISM_GetFeatureInfo($Session, $FeatureName, ByRef $CustomProperty, $Identifier = 0, $PackageIdentifier = 0, $OutputFormat = 0)

    [/autoit][autoit][/autoit][autoit]

    ; control param passing
    Local $sType = "WSTR"
    If Not IsString($Identifier) And $Identifier = 0 Then $sType = "PTR"

    [/autoit][autoit][/autoit][autoit]

    Local $aResult = DllCall($ghdismapi, "LONG", "DismGetFeatureInfo", _
    "PTR", $Session, _
    "WSTR", $FeatureName, _
    $sType, $Identifier, _
    "INT", $PackageIdentifier, _
    "PTR*", 0 _
    )
    If @error Then Return SetError(@error, @extended, 0)
    If IsArray($aResult) = 1 Then
    If $aResult[0] <> $S_OK Then Return SetError(@error, @extended, $aResult[0])
    EndIf

    [/autoit][autoit][/autoit][autoit]

    Local $FeatureInfo = $aResult[5]

    ; get custom property data
    Local $CustomPropertyCount = DllStructGetData($FeatureInfo_struct, "CustomPropertyCount")
    If $CustomPropertyCount <> 0 Then
    Local $oCustomProperty_list = ObjCreate("System.Collections.ArrayList")
    ConsoleWrite("hier5" & @CRLF)
    For $properties = 1 To $CustomPropertyCount
    Local $oCustomProperty_dict = ObjCreate("Scripting.Dictionary") ; store custom property data in dictionay
    ; create DismCustomProperty Structure
    Local $CustomProperty_struct = DllStructCreate($tagDismCustomProperty, DllStructGetPtr($FeatureInfo_struct, DetermineLocation($tagDismCustomProperty, $properties, 1))) ; offset = 1
    Local $struct = DllStructCreate("WCHAR", DllStructGetData($CustomProperty_struct, "Value"))
    ConsoleWrite("hier" & DllStructGetData($struct, 1) & @CRLF) ; hier Fehler wegen Speicherzugriffsverletzung
    Next

    [/autoit]

    So sieht $CustomProperty_struct aus, siehe Anhang.

  • DLLCall und Absturz: Exit Code -1073741819

    • Trolleule1337
    • 27. September 2013 um 20:08

    Danke Chef, werde das mal als gelöst markieren :thumbup:

  • Speicherstelle auslesen. AutoIT stürzt ab

    • Trolleule1337
    • 27. September 2013 um 20:03

    Hey,
    ich hab einen Pointer den ich einfach nicht ausgelesen bekomme.


    [autoit]

    Local $struct = DllStructCreate("WCHAR [4]", DllStructGetData($CustomProperty_struct, "Value"))

    [/autoit]

    $struct-Pointer: 0x00000005

    Hat jemand eine Idee mit welchem Dateityp bzw. mit welcher Größe ich den Wert auslesen kann?

    Hier die Struktur: http://msdn.microsoft.com/en-us/library/…p/hh824746.aspx

  • DLLCall und Absturz: Exit Code -1073741819

    • Trolleule1337
    • 17. September 2013 um 21:27

    gern geschehen!

    AutoIt hat doch einen Debugger, also für mich ist die console schon debug genug, naja außer in diesem Fall, eine genauere Fehlermeldung wäre echt ne feine sache, aber übermäßig dafür mein Gehirn zu benutzen hab ich nicht vor, dann mach ich lieber traditionell weiter. Hast mal ne Anleitung wie man den einsetzt, ist der schwer zu benutzen? Wenns nicht einfach ist, dann egal....

    Danke Andy!

  • DLLCall und Absturz: Exit Code -1073741819

    • Trolleule1337
    • 17. September 2013 um 19:49

    super danke für deine Hilfe und auch danke an die anderen! habe versucht einen error handler zu registrieren, habs aber net auf die reihe bekommen. Da kam nie eine besondere Ausgabe, nur der standard autoit text exit code...

    was meinst du mit botter und ollydbg, ok ollydbg für gamehack, ist das ein "must have". Was käme denn dann für ne special Meldung raus wenn ich das habe?

  • DLLCall und Absturz: Exit Code -1073741819

    • Trolleule1337
    • 17. September 2013 um 18:37

    Klingt plausibel, aber wie erklärst du dir den Umstand, das es manchmal klappt egal welchen datentyp ich mit welcher size auch immer verwende? ?(

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™