Ich würde vorschlagen, dass du deinen Code mal postet! Dann können wir mehr sehen und dir besser helfen!
Gruß,
UEZ
Ich würde vorschlagen, dass du deinen Code mal postet! Dann können wir mehr sehen und dir besser helfen!
Gruß,
UEZ
Dem Bytecode sollte das egal sein, was allerdings sein kann, daß der "Assembler" in 64Bit-Umgebung nicht funktioniert.
[autoit]
Teste mal das folgende Script pls$tCodeBuffer = DllStructCreate("byte[20]") ;Speicher für den assemblercode belegen
[/autoit]
DllStructSetData($tCodeBuffer, 1, "0xC7C007000000C3")
$ret = DllCall("user32.dll", "int", "CallWindowProcW", "ptr", DllStructGetPtr($tCodeBuffer), "int", 0, "int", 0, "int", 0, "int", 0);bytecode aufrufen, rückgabe in a[0]
msgbox(0,"Returncode",$ret[0])Es sollte normalerweise der Returncode 7 zurückgeben, funzt das auch unter 64Bit?
Die Zoomstufen funktionieren, und das Speichern auch, beim Rest wird "Coming soon :o)" angezeigt
Unter x64 ist der Return Code genau dann 7, wenn der Code als x32 ausgeführt wird!
Ansonsten:
Problemsignatur:
Problemereignisname: BEX64
Anwendungsname: autoit3_x64.exe
Anwendungsversion: 3.3.4.0
Anwendungszeitstempel: 4b509369
Fehlermodulname: StackHash_c82e
Fehlermodulversion: 0.0.0.0
Fehlermodulzeitstempel: 00000000
Ausnahmeoffset: 0000000002240240
Ausnahmecode: c0000005
Ausnahmedaten: 0000000000000008
Betriebsystemversion: 6.1.7600.2.0.0.256.1
Gebietsschema-ID: 1031
Zusatzinformation 1: c82e
Zusatzinformation 2: c82e7933df2e59f70824ea0efe276023
Zusatzinformation 3: 6fae
Zusatzinformation 4: 6fae1bf06560f26c1ef29c48e79861c2
Gruß,
UEZ
Warum Kaspersky die Seite als "gefährlich" einstuft, weiß ich nicht! Schau' mal in #post1 - dort habe ich das Zip File angehängt!
Gruß,
UEZ
Alles anzeigenNaja, ehrlich gesagt, ist das die einfachste Sprache überhaupt^^. Sie kommt mit ca. 10-20 Befehlen aus. Und GDI+ ist auch kein Problem, da (wie im Script zu lesen) die erzeugte Bitmap mit GDI+-Befehlen bearbeitbar ist.
Mal ein Pseudocodebeispiel zum Umwandeln einer Farbgrafik in Graustufen:
- -Startlabel erstellen für die Schleife: Anfang:
-Lade den Anfang der Bitmapgrafik in ein 32Bit-Register , z.B. EDI mov EDI,[Speicheradresse erstes Pixel der Bitmap]
-schreibe 0 in das EAX-Register, mit EAX arbeiten wir mov EAX,0
-lese das Farbbyte AABBGGRR der Grafik an dieser Position in einzelne 1-Byte Register z.B. ah ein: mov ah,[EDI+1] ;das 1. Byte an [EDI] ist der Alphakanal des Pixels AA, an [EDI+1] ist BB an EDI+2 GG und an EDI+3 steht RR
-EAX ist aus den folgenden Registern aufgebaut. 4 Byte bilden das EAX-Register, die 16 niedrigen Bit sind das AX-Register , welches sich wiederum in ein Highbyte AH und ein Lowbyte AL unterteilt. Also 32Bit EAX= obere16 Bit+ 16Bit AX = obere 16Bit + 8Bit AH + 8 Bit AL , wenn man also ein mov al,3 schreiben würde, dann sähe das EAX-Register so aus 00000000000000000000000000000011 die letzten 2 Bits wären gesetzt, der Rest ist 0. Pixelbeispiel: mov EAX,[EDI] dann steht im Byte AL der Farbcode RR, in AH der Farbcode GG und im oberen Teil von EAX AABB. Aber wir lesen die Speicherstellen nacheinander aus (langsam aber nachvollziehbar^^) Durch mov al,[EDI+1] steht jetzt die Farbe für Blau im AL-Register
-add ax,[EDI+2] ;dazu wird die Farbe Grün addiert
-add ax,[EDI+3] ; und Rot auch noch
-div ax,3 ;Integerdivision durch 3 => ax=int(ax/3) =arithmetisches Mittel aus den 3 Bytes
-mov [EDI+1],ah ;das byte in den Speicher schreiben an die blaue, grüne und rote Position
-mov [EDI+2],ah
-mov [EDI+3],ah ;alle bytes sind geschrieben, haben RR, GG und BB die gleiche Farbe, dann ist das ein Grauton
-add EDI,4 ;speicheradresse um 4 byte erhöhen, hier steht das nächste pixel
-cmp EDI,[ende der Bitmap] ;vergleiche, ob das letzte Pixel erreicht wurde
-jl @anfang ;jl=Jump if Lower , springe, wenn das letzte Pixel noch nicht erreicht ist, zum Anfang
-ret ;ansonsten Ende des ProgrammsDas ist natürlich ULTRALANGSAM durch die vielen Speicheranforderungen, aber um mal eine Hausnummer zu nennen:
Wenn jeder der Befehle 10 Takte bräuchte und 10 Befehle gebraucht werden, dann dauert der Spass bei einer 2Ghz-CPU (2*10^9 Takte pro Sekunde) nur 0.5*10^-7 Sekunden pro Pixel, eine 1000x1000 Pixel große Bitmap wäre dann in 0,05 Sekunden umgewandelt!
Gleich mit GDI+ anfangen ist doch zu hoch gegriffen! Erstmal einfache Sachen machen, damit ich wieder das ASM Denken bekomme und die Befehle verstehe.
Wenn die Labels besser implementiert wären, wäre der Aufwand geringer! Vielleicht kommt das ja bald -> http://www.autoitscript.com/forum/index.php?showtopic=110794!
Als Einsteig stelle ich mir die Erstellung der Primzahlen vor. Nun ja, schau ich mal, ob ich das hinbekomme... ![]()
Gruß,
UEZ
Breakpoint 2010 ist vom 02.04.2010 - 05.04.2010 in Bingen am Rhein (Nähe Mainz)!
UEZ
SSSSSSSSSSSSSSSUUUUUUUUUUUUUUUUUUUUUUUUUUUPPPPPPPPPPPPPPPPPPPPPPEEEEEEEEEEEEEEEEEEEEEERRRRRRRRRRRRRRRRRR ![]()
Jetzt muss man nur noch ASM verstehen, um auch andere Dinge wie z.B. GDI+ Berechnungen zu beschleunigen!!!
Mach' doch auch einen Thread im engl. Forum auf!
Hut ab!
Gruß,
UEZ
Sowas machen Gruppen von 3-4 Personen ;).
Alles, was du siehst, ist live generiert.
GDI+ ist nur Schritt 1 in die Richtung :D. Da kommt noch sehr viel krasserer Stoff zum Einsatz ;).Johannes
Mit GDI+ wirst du wohl nicht sehr weit kommen... ![]()
UEZ
Hi, habe eine ATI-Karte im Rechner, läuft auch.
Ja, das sind fraktale Landschaften , während der Anzeige des "Videos" berechnet. Wenn dich so etwas wundert, dann solltest du mal in Bingen auf der Breakpoint einschlagen, btw. da könnten wir zusammen hin ^^. Etwas fetteres in Sachen Computergrafik wird weltweit so konzentriert nicht zu finden sein. Und was die Jungs und Mädels dort aus uralten Kisten (Amiga, C64) rausholen ist wirklich atemberaubend.
Genau
Faszinierend, was da aus den Kisten noch herausgeholt wird!
Ich war noch nie auf der Breakpoint und würde gerne dort mal hin, zumal das auch noch fast um die Ecke ist
Wann ist die Breakpoint 2010 eigentlicht?
Da können wir gerne zusammen hin ![]()
Gruß,
UEZ
UEZ
Ist das alles Live ohne Vorlagen gerendert?![]()
Das hört sich jetzt vielleicht Kitschig an aber:Soeine Grafik habe ich im PC-Bereich noch NIE gesehen
![]()
Das ist echt Atemberaubend!!!Wenn so die Grafik von PC-Spielen (zB meinem UT3) wäre, Ich glaube dann würde ich Unfallen!
Noch eine Frage:
Hat das eine Firma oder eine Privatperson erstellt?
Wenn die die Dateien herunterlädst und eine der Exe Dateien (4kb groß) startest, dann werden erstmal die ganzen Daten generiert und die Show fängt dann an! In den 4kb sind die Grafiken und der Sound!
Es gibt jährlich Demo Wettbewerbe, wo Gruppen ihre Werke vorstellen -> Breakpoint, und ich finde auch, dass diese Demo mit nur 4kb echt der Hammer ist - ja sogar unglaublich!
Gruß,
UEZ
Sieht gut aus!
Ich habe mal das Sortieren hinzugefügt, wenn die Spaltenfelder gedrückt werden:
[autoit]
Func _WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView, $B_ASCENDING
$hWndListView = $hLV ; ID des LV
$hWndListView2 = $hLVEditHeader ; ID des LV
If Not IsHWnd($hWndListView) Then $hWndListView = GUICtrlGetHandle($hWndListView)
If Not IsHWnd($hWndListView2) Then $hWndListView2 = GUICtrlGetHandle($hWndListView2)
$tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
$hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
$iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
$iCode = DllStructGetData($tNMHDR, "Code")
Switch $hWndFrom
Case $hWndListView
Switch $iCode
Case $NM_DBLCLK
Local $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
_GUICtrlListView_EditItem($hWndListView, DllStructGetData($tInfo, "Index"), DllStructGetData($tInfo, "SubItem"))
$hActive = $hWndListView
Case $NM_CLICK
GUICtrlSetState($hInput, $GUI_HIDE)
Case $LVN_COLUMNCLICK ; A column was clicked -> sort ascendend
Local $tInfo = DllStructCreate($tagNMLISTVIEW, $ilParam)
_GUICtrlListView_SimpleSort($hWndListView, $B_ASCENDING, DllStructGetData($tInfo, "SubItem"))
EndSwitch
Case $hWndListView2
Switch $iCode
Case $NM_DBLCLK
Local $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
_GUICtrlListView_EditItem($hWndListView2, DllStructGetData($tInfo, "Index"), DllStructGetData($tInfo, "SubItem"))
$hActive = $hWndListView2
Case $NM_CLICK
GUICtrlSetState($hInput, $GUI_HIDE)
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>_WM_NOTIFY
Kannst ja noch verfeinern...
Performance:
für eine CSV mit 18663 Zeilen und 5 Spalten benötigt meine Kiste ca. 60 Sekunden, um die Datei anzuzeigen! Eine Progressbar wäre da nicht schlecht!
Das Sortieren nach einer Spalte dauert 50% länger als das Laden!
Gruß,
UEZ
Sieht jetzt gut aus! ![]()
Gruß,
UEZ
Sieht sehr gut aus - gefällt mir!
Weiter so!
Gruß,
UEZ
Ich habe noch Probleme mit meinen 2 Skripten gefunden:
Eilt nicht, da du ja heute Geburtstag hast ![]()
Gruß,
UEZ
Ich war mal so frei und habe deinen Code etwas verkürzt!
#NoTrayIcon
#include <Date.au3>
#include <GDIPlus.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Opt("TrayMenuMode", 1)
$Form1 = GUICreate("GDI+ Summencode-Led Uhr", 215, 250, @DesktopWidth-215, @DesktopHeight-280, $WS_POPUP, $WS_EX_TOPMOST)
GUISetBkColor(0x000000)
$Label1 = GUICtrlCreateLabel("", 0, 0, 215, 250, Default, $GUI_WS_EX_PARENTDRAG)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
GUISetState(@SW_SHOW)
$context = GUICtrlCreateContextMenu($Label1)
$hide = GUICtrlCreateMenuItem("Ausblenden", $context)
GUICtrlCreateMenuItem("", $context)
$exit = GUICtrlCreateMenuItem("Beenden", $context)
$show = TrayCreateItem("Anzeigen")
TrayCreateItem("")
$exittray = TrayCreateItem("Exit")
_GDIPlus_Startup()
$grafik = _GDIPlus_GraphicsCreateFromHWND($Form1)
$brushledoff = _GDIPlus_BrushCreateSolid(0xFF441A00)
$brushledon =_GDIPlus_BrushCreateSolid(0xFFFFA100)
Do
$msg = GUIGetMsg()
$tmsg = TrayGetMsg()
Select
Case $msg = $hide
WinMove($Form1, "", @DesktopWidth, @DesktopHeight-280, Default, Default, 5)
TraySetState(1)
GUISetState(@SW_HIDE)
Case $msg = $exit
Ende()
Case $tmsg = $exittray
Ende()
Case $tmsg = $show
GUISetState(@SW_Show)
WinMove($Form1, "", @DesktopWidth-215, @DesktopHeight-280, Default, Default, 5)
TraySetState(2)
EndSelect
$stu1 = Stringmid(_Nowtime(), 1, 1)
$stu2 = Stringmid(_Nowtime(), 2, 1)
$min1 = Stringmid(_Nowtime(), 4, 1)
$min2 = Stringmid(_Nowtime(), 5, 1)
$sek1 = Stringmid(_Nowtime(), 7, 1)
$sek2 = Stringmid(_Nowtime(), 8, 1)
_LedColDrawActive(30, $stu1)
_LedColDrawActive(50, $stu2)
_LedColDrawActive(90, $min1)
_LedColDrawActive(110, $min2)
_LedColDrawActive(150, $sek1)
_LedColDrawActive(170, $sek2)
Until $msg = $GUI_EVENT_CLOSE
Ende()
Func Ende()
_GDIPlus_GraphicsDispose($grafik)
_GDIPlus_BrushDispose($brushledoff)
_GDIPlus_BrushDispose($brushledon)
Exit
EndFunc
Func _Update()
$mp = WinGetPos("GDI+ Summencode-Led Uhr")
While $mp[0] And $mp[1] < -10
$mp = WinGetPos("GDI+ Summencode-Led Uhr")
$stu1 = Stringmid(_Nowtime(), 1, 1)
$stu2 = Stringmid(_Nowtime(), 2, 1)
$min1 = Stringmid(_Nowtime(), 4, 1)
$min2 = Stringmid(_Nowtime(), 5, 1)
$sek1 = Stringmid(_Nowtime(), 7, 1)
$sek2 = Stringmid(_Nowtime(), 8, 1)
_LedColDrawActive(30, $stu1)
_LedColDrawActive(50, $stu2)
_LedColDrawActive(90, $min1)
_LedColDrawActive(110, $min2)
_LedColDrawActive(150, $sek1)
_LedColDrawActive(170, $sek2)
WEnd
EndFunc
Func _LedColDrawActive($x, $num)
[/autoit] [autoit][/autoit] [autoit]Switch $num
Case 0
Zeichne_Ellipse("000000000", $x)
Case 1
Zeichne_Ellipse("000000001", $x)
case 2
Zeichne_Ellipse("000000011", $x)
case 3
Zeichne_Ellipse("000000111", $x)
case 4
Zeichne_Ellipse("000001111", $x)
case 5
Zeichne_Ellipse("000011111", $x)
case 6
Zeichne_Ellipse("000111111", $x)
case 7
Zeichne_Ellipse("001111111", $x)
case 8
Zeichne_Ellipse("011111111", $x)
case 9
Zeichne_Ellipse("111111111", $x)
EndSwitch
EndFunc
Func Zeichne_Ellipse($bits, $x)
Local $aBits = StringSplit($bits, "", 2), $c
For $c = 0 To UBound($aBits) - 1
If $aBits[$c] = 0 Then
_GDIPlus_GraphicsFillEllipse($grafik, $x, 40+(20*$c), 12, 12, $brushledoff)
Else
_GDIPlus_GraphicsFillEllipse($grafik, $x, 40+(20*$c), 12, 12, $brushledon)
EndIf
Next
EndFunc
Gruß,
UEZ
Herzlichen Glückwunsch zum Geburtstag und alles Gute GDI+ Meister ![]()
Gruß,
UEZ
Danke für das Update!
Ich finde 2 farbig schöner:
1stColor=0xFFFFFF
2ndColor=0xF0F0F0
Ist Geschmack Sache!
Aber könnten die Farben nicht durchgehend sein? Ein Raster a la Excel wäre auch noch schön!
Apropos schön: Tooltip finde ich auch super!
Ein Export in CSV könnte auch hilfreich sein, bzw. Import von einer CSV (Semikon getrennt)!
Gruß,
UEZ
Nette Umsetzung!
Was mir fehlt, ist ein Kontextmenu und Key Shortcuts, um schneller Daten hinzuzufügen bzw. zu löschen! Um die Einträge besser zu unterscheiden, wären farbliche Zeilen (2 Farben sollten reichen) von Vorteil.
Gruß,
UEZ
Hier der verbesserte Code bzgl.>= Win7:
#AutoIt3Wrapper_UseX64=y
#AutoIt3Wrapper_Change2CUI=y
Global $PID
Global Const $Process_All_Access = 0x1F0FFF
$PID = ProcessExists(@AutoItPID)
If $PID = 0 Then
ConsoleWrite(@CRLF & "ERROR! Process " & $PID & " not found! Aborting..." & @CRLF)
Exit
EndIf
$ProcHandle = DllCall("kernel32.dll", "hwnd", "OpenProcess", "dword", $Process_All_Access, "int", False, "dword", $PID)
$ProcHandle = $ProcHandle[0]
MsgBox(0, "PrivateUsage Size", Round(_ProcessGetMem($ProcHandle) / 1024, 0) & " kb")
[/autoit] [autoit][/autoit] [autoit]DllCall("psapi.dll", "int", "CloseHandle", "hwnd", $ProcHandle)
DllCall("kernel32.dll", "int", "CloseHandle", "int", $ProcHandle)
Exit
Func _ProcessGetMem($ProcessHandle) ;get physical memory of the process -> http://msdn.microsoft.com/en-us/library/…28VS.85%29.aspx
Local $structPROCESS_MEMORY_COUNTERS, $structPROCESS_MEMORY_COUNTERS_EX, $nSize, $aRet
If @OSBuild < 7600 Then
$structPROCESS_MEMORY_COUNTERS = DllStructCreate("dword cb; dword PageFaultCount; dword_ptr PeakWorkingSetSize; ulong_ptr WorkingSetSize; " & _
"dword_ptr QuotaPeakPagedPoolUsage; dword_ptr QuotaPagedPoolUsage; dword_ptr QuotaPeakNonPagedPoolUsage; " & _
"dword_ptr QuotaNonPagePoolUsage; dword_ptr PagefileUsage; dword_ptr PeakPagefileUsage") ;http://msdn.microsoft.com/en-us/library/…28VS.85%29.aspx
$nSize = DllStructGetSize($structPROCESS_MEMORY_COUNTERS)
$aRet = DllCall("psapi.dll", "int", "GetProcessMemoryInfo", "hwnd", $ProcessHandle, "ptr", DllStructGetPtr($structPROCESS_MEMORY_COUNTERS), "dword", $nSize) ;call GetProcessMemoryInfo
If $aRet[0] = 0 Then
ConsoleWrite("(" & @ScriptLineNumber & ") : = Error in GetProcessMemoryInfo call" & @LF)
SetError(1, 0, $aRet[0])
EndIf
Return DllStructGetData($structPROCESS_MEMORY_COUNTERS, "WorkingSetSize")
Else
$structPROCESS_MEMORY_COUNTERS_EX = DllStructCreate("dword cb; dword PageFaultCount; dword_ptr PeakWorkingSetSize; dword_ptr WorkingSetSize; " & _
"dword_ptr QuotaPeakPagedPoolUsage; dword_ptr QuotaPagedPoolUsage; dword_ptr QuotaPeakNonPagedPoolUsage; " & _
"dword_ptr QuotaNonPagePoolUsage; dword_ptr PagefileUsage; dword_ptr PeakPagefileUsage; " & _
"ulong_ptr PrivateUsage") ;http://msdn.microsoft.com/en-us/library/…28VS.85%29.aspx
$nSize = DllStructGetSize($structPROCESS_MEMORY_COUNTERS_EX)
$aRet = DllCall("Kernel32.dll", "int", "K32GetProcessMemoryInfo", "hwnd", $ProcessHandle, "ptr", DllStructGetPtr($structPROCESS_MEMORY_COUNTERS_EX), "dword", $nSize) ;call GetProcessMemoryInfo
If $aRet[0] = 0 Then
ConsoleWrite("(" & @ScriptLineNumber & ") : = Error in GetProcessMemoryInfo call" & @LF)
SetError(1, 0, $aRet[0])
EndIf
ConsoleWrite("WorkingSetSize: " & Round(DllStructGetData($structPROCESS_MEMORY_COUNTERS_EX, "WorkingSetSize"), 0) & @CRLF & _
"PageFaultCount: " & Round(DllStructGetData($structPROCESS_MEMORY_COUNTERS_EX, "PageFaultCount"), 0) & @CRLF & _
"PeakWorkingSetSize: " & Round(DllStructGetData($structPROCESS_MEMORY_COUNTERS_EX, "PeakWorkingSetSize"), 0) & @CRLF & _
"QuotaPeakPagedPoolUsage: " & Round(DllStructGetData($structPROCESS_MEMORY_COUNTERS_EX, "QuotaPeakPagedPoolUsage"), 0) & @CRLF & _
"QuotaPagedPoolUsage: " & Round(DllStructGetData($structPROCESS_MEMORY_COUNTERS_EX, "QuotaPagedPoolUsage"), 0) & @CRLF & _
"QuotaPeakNonPagedPoolUsage: " & Round(DllStructGetData($structPROCESS_MEMORY_COUNTERS_EX, "QuotaPeakNonPagedPoolUsage"), 0) & @CRLF & _
"QuotaNonPagePoolUsage: " & Round(DllStructGetData($structPROCESS_MEMORY_COUNTERS_EX, "QuotaNonPagePoolUsage"), 0) & @CRLF & _
"PagefileUsage: " & Round(DllStructGetData($structPROCESS_MEMORY_COUNTERS_EX, "PagefileUsage"), 0) & @CRLF & _
"PeakPagefileUsage: " & Round(DllStructGetData($structPROCESS_MEMORY_COUNTERS_EX, "PeakPagefileUsage"), 0) & @CRLF & _
"PrivateUsage: " & Round(DllStructGetData($structPROCESS_MEMORY_COUNTERS_EX, "PrivateUsage"), 0) & @CRLF & @CRLF)
Return DllStructGetData($structPROCESS_MEMORY_COUNTERS_EX, "PrivateUsage")
EndIf
EndFunc ;==>_ProcessGetMem
Nichts desto trotz liefert PrivateUsage nicht den Speicher zurück, der im Taskmanager (WS Private) erscheint!
Die Suche geht weiter nach einer nicht WMI Lösung...
Gruß,
UEZ