Wozu? Wenn es auf deinem PC jetzt läuft und du damit leben kannst ist doch alles in bester Ordnung. ![]()
Beiträge von Yjuq
-
-
Zitat von bazii
[...] In der Autoithilfe habe ich nichts mit "Strg" gefunden [...]
Glaub ich dir nicht
https://www.autoit.de/dokumentation/functions/Send.htm
Und jetzt lies es dir nochmal in ruhe durch. Da steht alles drin wie du ein [Strg]-Tastendruck sendest.
Und dann schau dir mal die Funktionen TimerInit() und TimerDiff() an.Viel Glück

-
Fehler beim Verbinden mit der Tastatur. Bitte [Enter] drücken um fortzufahren.
Gesendet von meinem HTC Desire HD A9191 mit Tapatalk 2
-
Naja, ich finde es nicht so gut, genauso wie die drz. angezeigten punkte in den profilen. Dadurch besteht eine gefahr dass früher oder später eine art "wettkampf" raus wird. Merke ich schon langsam an mir selbst. Ich versuche drz. Andy in sachen assembler durchaus nachzueifern und "besser" als er zu werden. Mittlerweile bin ich schon fast abhängig vin dem forum hier, mind. jede stunde muss ich gucken was hier das drz. thema ist und ob ich was dazu beitragen kann. Wenn jetzt auch noch diese like geschichte dazu kommt könnte ich dazu neigen überheblicher zu werden.
Ich habe das jetzt nur aus meiner perspektive beschrieben weil ich nicht für andere sprechen kann. Aber vllt. Weiß ja der eine oder andere user wie und was ich damit meine.
Naja, ich bin dagegen weils sich auf mich negativ auswirken könnte.

Gesendet von meinem HTC Desire HD A9191 mit Tapatalk 2
-
Hey, vielleicht wäre es ganz gut die Suche etwas farblich zu markieren. Man könnte Sie sonst ganz leicht übersehen.- Gefixt -
Sofern du das sleep in der leeren while schleife nicht vergessen hast.
Das kann ich so nicht bestätigen. Hab maximal mal zwischendurch 10%, aber sonst konstant bei ca. 5% wenn man nicht hunderte an prozessen auf hat.
-
Jetzt wo du's sagst, auf das mit MemAlloc bin ich nicht gekommen. Prinzipiell könnte man so 4 byte in der dll reservieren und dort den pointer zu den per MemAlloc reservierten speicher hinein schreiben. So hätte jeder prozess direkt den passenden pointer und man kann locker den speicher dynamisch verändern. Ob das aber dann immernoch so einfach via dllstruct funktioniert, müsste man mal ausprobieren.
€dit: {
Hab's ausprobiert, der reservierte speicher via GlobalAlloc sowie VirtualAlloc wollen zum erbrechen nicht mit dllstruct's angesprochen werden. Auch nicht wenn man den speicher direkt in der dll anforder. Hab sogar aus verzweiflung versucht die prozedur welche den speicher anfordert auch mit shareable zu kennzeichnen. Nützt nichts, aber ich hab's mir sowieso schon gedacht. Naja
}Und das mit dem tool hätte sich dann so auch erledigt, da ja dann nur eine einzige dll mit 4 byte reservierten speicher erforderlich ist. Aber ansonst: paar nullen mehr hinein schreiben (wie du's so schön gesagt hast). Aber trzd. muss man dann den header noch anpassen (wenn ich mich richtig errinnere), sollte aber so gehen.
Achja, mich würde das schon interessieren wenn man 10 mb an daten reserviert aber nur 1 mb nutzt. Bei meiner download geschwindigkeit bin ich froh wenn entwickler bytesparend programmieren würden. xD
[Kann es sein dass wir solangsam vom eigentlichen thema abschweifen?]
-
Der asm code muss mit der FASM.exe (flat assembler -> http://www.flatassembler.net) kompiliert werden. Der benötigte speicherbereich MUSS vor dem kompilieren angegeben werden, das spãter dynamisch zu machen ist so leider nicht möglich. Reserviere dir also genug speicher.
Ich arbeite aber gerade an einem tool der solch eine dll erstellt. Schließlich hat nicht jeder asm erfahrung oder lust das selber zu kompilieren. Das tool wird dann in autoit geschrieben sein, wird aber noch ein bisschen dauern bis es fertig ist. So hat dann jeder die möglichkeit diese art der kommunikation zu nutzen.
-
Ja, das problem hatte ich auch sonst mit der funktion aus der udf immer. Daher hab ich mir selber ne funktion geschrieben, kann die aber erst morgen hochladen. :x
-
In C/C++ kann man solch einen Datenbereich mit #pragma data_seg(".shared") realisieren. Gleiches prinzip den du bei dem Assemblercode angewendet hast.
-
Basierend auf Andy's Assemblercode habe ich selber nun eine kleine einfache DLL geschrieben. In ihr werden 10 Byte an Speicher reserviert (Für eine einfache 10 Zeichen lange Nachricht). Mit der Funktion „GetPtr“ kann der Pointer für den Speicher gelesen werden. Mithilfe einer Struktur lässt sich dies in AutoIt nun ganz simple ansprechen. Der Pointer des Speicherbereiches wird einfach an die Strukur übergeben.
Im Anhang befindet sich ein Beispielskript sowie die nötige DLL + Quelltext. Das Beispielskript ruft sich selber nochmals über den Interpreter auf. Beim ersten Aufruf wird die Nachricht in den Speicherbereich geschrieben, beim zweiten Aufruf in einer MessageBox ausgegeben. Danach geschieht das Selbe nur in anderer Richtung. Das soll verdeutlichen das wirklich nur ein Speicherbereich genutzt wird. Man kann also von mehreren Prozessen problemlos darauf zugreifen.
Andy:
Gute Arbeit von dir, ich habe lediglich ein wenig (oder fast alles :x) bei dir abgeguckt und die kleine Sache mit „shareable“ eingepflanzt. Ziemlich interessant was so alles möglich ist. Die Lorbeeren gehören dir xD -
-
Achso, ich ging davon aus das es möglich sein sollte den speicherplatz dynamisch anzufordern. Das wäre natûrlich eine herausforderung. Aber wenn du sagst "so viel speicher wird bereitgestellt und nicht mehr" dann sollte das einfacher sein. Naja, in den meisten fällen ist 1 MB schon mehr als genug. Bin mal gespannt was dabei herum kommt. Stellst du dann auch den sourcecode der dll zur verfügung?
-
Ach Andy, soll das heißen dass du das mit der DLL in Angriff nehmen willst? Wäre auf jedenfall durchaus interessant das mal umzusetzen. Jedoch wüsste ich nicht wie genau das nun funktionieren soll. Hatte dazu bisher nur mal ein C++ code dazu gesehen. Scheint mir durchaus kompliziert zu sein. Und ob das sinnvoller ist als den benötigten Speicher direkt im Skript zu reservieren (_WinApi_MemGlobalAlloc) sei mal dahingestellt. Aber bestimmt klärst du mich noch auf.

-
Also, du hast nun einen Eimer voll an Möglichkeiten von uns bekommen. Ich glaube auch nicht dass es mehr Möglichkeiten gibt. Was mir noch einfällt wäre "File Mapping" Wenn ich auf MSDN das richtig verstandn habe, dann werden die Daten erst von einer Datei ins RAM geholt, dort wird der Speicher gemeinsam genutzt. Ist z.B. sinnvoll wenn man von einer CD die Daten nur einmal im RAM haben will, und alle Progamme mit den Daten arbeiten können. Dann gibts noch "Shared Memory", da wird der Speicher ebenfalls gemeinsam genutzt, Andy hatte ja schon ein Beispielskript dazu geschrieben. Naja, ansonsten bleibt noch das gedönse über die Standard-Datenströme, TCP und Named Pipe.
Eine Sache gibt's aber noch, ist aber ziemlich kompliziert. Es ist möglich globale Variablen in eine DLL zu verpacken. Da musst du aber erst einen eigenen Datenbereich in der DLL benennen und kannst nur vordefinierte Variablen nutzen. Außerdem sprengt es sowieso den Zweck von DLL's und ist eher eine (ich nenn es jetzt mal so) "abstrakte" Idee. Jedoch möglich.
Nun ja, genug Möglichkeiten hast du ja jetzt, ich glaube auch das wir solangsam alles an Möglichkeiten abgeklappert haben. Such dir was aus und werde zufrieden.

-
Gute Frage, es gibt ja von Windows vordefinierte Umgebungsvariablen. Deren Inhalt lässt sich auch ändern. Daraus schließe ich mal, dass sie auf der Festplatte gespeichert sind. Ob AutoIt das ebenfalls tut weiß ich nicht, aber da gehe ich mal von aus. Vllt. Kann dir jemand anderes mehr dazu sagen.
Zu dem Std-Streams:
Es gibt 3 Standard-Datenströme, den stdin stream, stdout stream und stderr stream. Über diesen 3 Datenströmen ist es möglich Daten zu übergeben. Für weitere Erklärungen siehe Wikipedia. Die Streams kann man für Interprozesskommunikation schön missbrauchen.
[autoit]Hab dazu auch mal hier nen Thread aufgemacht, da müsste sich auch ein Beispielcode dazu befinden. Bin aber gerade suchfaul, aber ich schreib dir vllt. später ein Beispiel.If Not $CmdLine[0] Then ; Prüft ob schon eine Instanz des Skriptes offen ist
[/autoit]
$iPID = Run(@AutoItExe & ' ' & @ScriptFullPath & ' make', '', @SW_HIDE, 0x1) ; Startet eine neue Instanz des Skriptes mit aktivierten Stdin-Stream
StdinWrite($iPID, 'Message ;)') ; Sendet die Nachricht in den Stdin-Stream des anderen Prozesses
StdioClose($iPID) ; Schließt alle Std-Streams
Else
MsgBox(0x40000, '', ConsoleRead()) ; Liest den Stdin-Stream aus
EndIf -
Nun ja, dürfte aber nicht so einfach werden. Das 2te Skript kann nämlich nicht via DllStruct darauf zugreifen. Da müsste dann mit den Funktionen _WinApi_ReadProcessMemory() und _WinApi_WriteProcessMemory hantiert werden.
€dit: @Homer:
Wenn du mit Umgebungsvariablen arbeiten willst, musst du die Skripte die darauf zugreifen sollen mit Run starten. Dann kannst du auch gleich die Std-Streams (hoffentlich heißen die so xd) verwenden. -
Eigentlich braucht man's nicht, aber es gibt da ne simple Möglichkeit sich das Feature selber zu programmieren:
Spoiler anzeigen
[autoit]ConsoleWrite('+ Start' & @CRLF)
[/autoit] [autoit][/autoit] [autoit]AdlibRegisterPlus('f', Default)
[/autoit] [autoit][/autoit] [autoit]Sleep(2500)
[/autoit] [autoit][/autoit] [autoit]If AdlibRegisterPlus('f') Then
[/autoit] [autoit][/autoit] [autoit]
ConsoleWrite(True & @CRLF)
AdlibUnRegister('f')
EndIfSleep(2500)
[/autoit] [autoit][/autoit] [autoit]ConsoleWrite('! Ende' & @CRLF)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]Func AdlibRegisterPlus($sFunction, $iTime = 0)
[/autoit] [autoit][/autoit] [autoit]
Static $asFunction[1] = [0]
Local $iIf $iTime = 0 Then
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
For $i = 1 To $asFunction[0]
If $sFunction = $asFunction[$i] Then Return True
Next
Else
$asFunction[0] += 1
ReDim $asFunction[$asFunction[0] +1]
$asFunction[$asFunction[0]] = $sFunction
Return AdlibRegister($sFunction, $iTime)
EndIf
EndFuncFunc f()
[/autoit] [autoit][/autoit] [autoit]
Static $i$i += 1
[/autoit] [autoit][/autoit] [autoit]ConsoleWrite($i & @CRLF)
[/autoit]
EndFunc -
Schnitzel:
Ich versteh deine Reaktion nicht. Was ist denn so verwerflich daran die registery für globale variablen zu missbrauchen? Es gibt ne eigene sektion extra für softwaren. Da drin kannste alles nach herzenslust ändern, löschen, überschreiben und haste net gesehen. Das nimmt keinen einfluss auf das eigentliche betriebssystem. Nur wenn du an der falschen stelle rumhantierst wir's unter umständen kritisch :p -
Naja, Alternativ einfach die Registery zumüllen. Damit solltes auch getan sein
