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. SturmGhost

Beiträge von SturmGhost

  • Mumble Link Struktur auslesen

    • SturmGhost
    • 11. November 2016 um 17:45

    Schön das Ihr euch einigen konntet. :love:

    Während ich mit meinem C#-Code die Werte verglichen habe, ist mir gar nicht aufgefallen das die Funktion _WinAPI_OpenFileMapping("MumbleLink") natürlich nur funktioniert, wenn die Datei "MumbleLink" bereits vorhanden ist. Das ist natürlich zum Start des Programms nicht der Fall. Im C#-Code kann das elegant mit der Funktion MemoryMappedFile.CreateOrOpen gelöst werden, welche es so in AutoIT leider nicht gibt. Stattdessen habe ich die Funktion _WinAPI_CreateFileMapping gefunden. Ich wollte das ganze also nun so lösen:


    AutoIt
    Func _openMumbleLink()
    	if $hMappedFile = 0 Then
    		$hMappedFile = _WinAPI_CreateFileMapping(Null, 5716, "MumbleLink")
    	Else
    		$hMappedFile = _WinAPI_OpenFileMapping("MumbleLink")
    	EndIf
    	$pViewAdress = _WinAPI_MapViewOfFile($hMappedFile)
    	if $pViewAdress = 0 then SetError(2)
    EndFunc

    Leider werden dann keine Werte ausgelesen. :thumbdown: Das ganze funktioniert erst, wenn ich einmalig den C#-Code ausgeführt habe, dann kann ich über die Funktion _WinAPI_OpenFileMapping("MumbleLink") oder auch _WinAPI_CreateFileMapping aus die Daten zugreifen. Bei der Angabe der Größe habe ich verschiedene Sachen probiert. Einmal die Größe meiner Struktur (5460) $sStructure32 und einmal die Größe der C#-Struktur (5716) - vielleicht übersehe ich hier was anderes? ?(

    Edit: Funktioniert nun. Ich musste nur einen "SecurityIdentifier" setzen. Die Lösung fand ich hier:

    http://stackoverflow.com/questions/2291…ss-in-to-winapi

    Einfach Local $sid = _Security__StringSidToSid("S-1-0") erstellen und der _WinAPI_CreateFileMapping übergeben. Die richtige Struktur-Größe war auch wichtig. Ich musste die originale C#-Struktur Größe verwenden (5714) damit es schlussendlich funktionierte. ;)

  • Mumble Link Struktur auslesen

    • SturmGhost
    • 11. November 2016 um 09:08

    Es gehört auch zum guten Ton nicht Texte als Zitat von mir auszugeben, die ist nie geschrieben habe - bitte ändern. ;)

    Der Thread wurde geclosed weil die Leute dort auf alles was "game" enthält sofort allergisch reagieren - Blödsinn aber gut.
    Hast Du kein Interesse an einem Austauscht? Ich habe hier keine Anfrage gestellt nach dem Motto: "Mein Name ist ich weiß von nix - bitte codet mir alles komplett" - das sowas ungerne gesehen wird ist klar.

    @Kanashius

    Mittlerweile habe ich das Problem lösen können, indem ich in der Struktur alle Arrays für die Koordinaten aufgespalten habe in x,y und z und dann mit einer For-Schleife durch die Struktur gegangen bin und die enthaltenen Informationen verglichen habe. Dadurch habe ich nun die richtigen offsets bzw. Positionsangaben für die Struktur und kann es korrekt auslesen.

  • Mumble Link Struktur auslesen

    • SturmGhost
    • 10. November 2016 um 22:29

    Habe jetzt in der Struktur-Definition dein FLOAT fAvatarPosition[3] durch FLOAT fAvatarPosition_x; usw. ausgetauscht. Also insgesamt:


    AutoIt
    global $sStructure32="UINT uiVersion;DWORD uiTick;FLOAT fAvatarPosition_x;"& _
    			 "FLOAT fAvatarPosition_y;FLOAT fAvatarPosition_z;"& _
    		     "FLOAT fAvatarFront[3];FLOAT fAvatarTop[3];WCHAR name[256];"& _
    		     "FLOAT fCameraPosition[3];FLOAT fCameraFront[3];FLOAT fCameraTop[3];"& _
    		     "WCHAR identity[256];UINT context_len;BYTE context[256];"& _
    		     "WCHAR description[2048];"


    Hat zur Folge das nun die X-Koordinate und die Y-Koordinate korrekt sind. Als Z-Koordinaten wird jedoch ebenfalls die Y-Koordinate ausgegeben. X/

    Zum Compiler habe ich nur das hier gefunden:

    https://github.com/mumble-voip/mu…2-static/README

    und

    https://wiki.mumble.info/wiki/BuildingWindows

    Scheint demnach 32 Bit und mit Visual Studio 2013 in C++ compiliert worden zu sein.

    Zitat

    Gegebenenfalls mal alles in ein Array aus Bytes lesen, dann mit autoit ausgeben lassen und gucken, wo was steht.

    Wie mache ich das - den Pointer nehmen und dann...? ?(

  • Mumble Link Struktur auslesen

    • SturmGhost
    • 10. November 2016 um 20:26

    Hey Kanashius,

    erstmal vielen vielen Dank das Du dir die Mühe gemacht hast den ganzen Code zu schreiben.

    _WinAPI_CloseHandle benötigt übrigens noch einen #include <WinAPI.au3>, sonst gibt es die Funktion nicht.

    $playerInfo.x usw. habe ich in $playerInfo_x geändert, da es hier Fehler gab (bei den anderen Achsen natürlich auch). Deinen Code habe ich mal ausprobiert und leider bekomme ich keine Koordinaten geliefert (nur 0). Hier dein Code, den ich leicht verändert habe:

    AutoIt
    #include <WinAPIFiles.au3>
    #include <WinAPI.au3>
    ;#include <WinAPIDiag.au3>
    global $hMappedFile=0,$pViewAdress=0
    ;WCHAR may be different (Compilerspecific see: https://en.wikipedia.org/wiki/Wide_character)
    global $sStructure32="UINT32 uiVersion;DWORD uiTick;FLOAT fAvatarPosition[3];"& _
    		     "FLOAT fAvatarFront[3];FLOAT fAvatarTop[3];WCHAR name[256];"& _
    		     "FLOAT fCameraPosition[3];FLOAT fCameraFront[3];FLOAT fCameraTop[3];"& _
    		     "WCHAR identity[256];UINT32 context_len;BYTE context[256];"& _
    		     "WCHAR description[2048];"
    HotKeySet("{#}" , "_end")
    Global $playerInfo_x
    Global $playerInfo_y
    Global $playerInfo_z
    While True
    	_openMumbleLink()
    	_getData()
    	ConsoleWrite($playerInfo_x & @CRLF & $playerInfo_y & @CRLF & $playerInfo_y & @CRLF )
    WEnd
    Func _openMumbleLink()
    	$hMappedFile=_WinAPI_OpenFileMapping("MumbleLink")
    	if $hMappedFile=0 then SetError(1)
    	$pViewAdress=_WinAPI_MapViewOfFile($hMappedFile)
    	if $pViewAdress=0 then SetError(2)
    EndFunc
    Func _getData()
    	if $hMappedFile=0 then _openMumbleLink()
    	if @error then SetError(1)
    	if $pViewAdress=0 then SetError(2)
    	local $tData = DllStructCreate($sStructure32, $pViewAdress);32Bit
    	;Die folgenden abfragen müssen angepasst werden
    	$playerInfo_x = DllStructGetData($tData,"fAvatarPosition",0)
    	$playerInfo_y=DllStructGetData($tData,"fAvatarPosition",1)
    	$playerInfo_z=DllStructGetData($tData,"fAvatarPosition",2)
    	$playerInfo_map=DllStructGetData($tData,"context")
    EndFunc
    Func _end()
    	if $hMappedFile<>0 then _WinAPI_UnmapViewOfFile($hMappedFile)
    	if $pViewAdress<>0 then _WinAPI_CloseHandle($pViewAdress)
    	Exit
    EndFunc
    Alles anzeigen

    Ich habe leider noch nicht rausfinden können wo hier der Fehler liegt. ?(

    Bevor ich deine Antwort gesehen habe, habe ich selbst mal an einer Lösung gearbeitet habe aber zunächst Probleme gehabt, ein Array in eine Struktur zu packen - anscheinend so einfach nicht möglich bei AutoIT. Also habe ich z.b das fAvatarPosition[3] Array in fAvatarPosition_x usw. geändert. Ich bekomme die korrekten Koordinaten ausgeliefert. Probleme gibt es aber bei dem fAvatarFront[3] welches ich wie bei dem anderen Array zerlegt habe. Hier bekomme ich den Y-Winkel nicht ausgeliefert. Bleibt einfach 0. Hier mal mein Code:


    AutoIt
    #include <WinAPI.au3>
    #include <WinAPIFiles.au3>
    #include <WinAPIDiag.au3>
    $LinkedMem = 'UINT uiVersion;DWORD uiTick;float fAvatarPosition_x;float fAvatarPosition_y;float fAvatarPosition_z;float fAvatarFront_x;float fAvatarFront_y;float fAvatarFront_z;float fAvatarTop_x;float fAvatarTop_y;float fAvatarTop_z;WCHAR name[256];float fCameraPosition_x;float fCameraPosition_y;float fCameraPosition_z;float fCameraFront_x;float fCameraFront_y;float fCameraFront_z;float fCameraTop_x;float fCameraTop_y;float fCameraTop_z;WCHAR identity[256];UINT context_len;CHAR context[256];WCHAR description[2048];'
    Local $mumb = _WinAPI_OpenFileMapping("MumbleLink")
    Local $pAddress = _WinAPI_MapViewOfFile($mumb)
    Local $tStruct = DllStructCreate($LinkedMem, $pAddress)
    ConsoleWrite('X is: ' & DllStructGetData($tStruct, "fAvatarPosition_x") *  39.37010 & @CRLF)
    ConsoleWrite('Y is: ' & DllStructGetData($tStruct, "fAvatarPosition_y") *  39.37010 & @CRLF)
    ConsoleWrite('Z is: ' & DllStructGetData($tStruct, "fAvatarPosition_z") *  39.37010 & @CRLF)

    Ich verstehe generell noch nicht so ganz was _WinAPI_OpenFileMapping und _WinAPI_MapViewOfFile überhaupt machen. Die Erklärungen sind sehr kurz. _WinAPI_MapViewOfFile liefert denke ich einen Pointer zu dem Memory mapped file, mit welchem ich eine Struktur baue nach dem definierten Aufbau (bei dir $sStructure32). Verstehe ich das richtig?

    Edit: Wenn ich deine UINT32 in UINT ändere bekomme ich zumindest für die X-Koordinate den richtigen Wert. Allerdings liefert dein $playerInfo_x = DllStructGetData($tData,"fAvatarPosition",0) den Wert 0 und deine $playerInfo_y=DllStructGetData($tData,"fAvatarPosition",1) und $playerInfo_y=DllStructGetData($tData,"fAvatarPosition",2) den richtigen Wet für die x-Koordinate. Allerdings liefern beide Konsolen-Befehle die x-Koordinate aus obwohl hier nach y und z gefragt wurde. Hier stimmt wohl was mit der Struktur nicht.

  • Mumble Link Struktur auslesen

    • SturmGhost
    • 10. November 2016 um 11:20

    Hallo, ich würde gerne auf die Mumble Link Struktur aus einer Software zugreifen. Allerdings weis ich nicht wie man in AutoIT auf das virtual memory mapped file zugreifen kann.

    Ich habe einen funktionierenden C#-Code, den ich gerne in AutoIT-Code umwandeln möchte. Den Ausschnitt für das Abrufen der Mumble Link Daten, ist hier:

    Code
    public static void OpenMumbleLink()
            {
                // Open the mapped memory file
                mappedFile = MemoryMappedFile.CreateOrOpen("MumbleLink", Marshal.SizeOf(data));
                accessor = mappedFile.CreateViewAccessor(0, Marshal.SizeOf(data));
            }
    
    
            public static void GetData()
            {
                // Make sure the map memory file is loaded
                if (mappedFile == null) OpenMumbleLink();
    
    
                // Read mapped memory file
                accessor.Read(0, out data);
    
    
                unsafe
                {
                    fixed (LinkedMem* _data = &data)
                    {
                        // Parse info
                        playerInfo.x = (float)(_data->fAvatarPosition[0]) * InchesPerMeter;
                        playerInfo.y = (float)(_data->fAvatarPosition[1]) * InchesPerMeter;
                        playerInfo.z = (float)(_data->fAvatarPosition[2]) * InchesPerMeter;
                        playerInfo.map = (int)_data->context[28] + ((int)_data->context[29] * 256);
                    }
                }
            }
    Alles anzeigen

    Wie setze ich den Abruf uns das speichern der Mumble Link Struktur-Daten in meine eigene Struktur um?


    Danke schon mal.


    EDIT BugFix:
    Es gehört zum guten Ton, dass man Crosspostings bekannt gibt. :rolleyes:

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™