Critical Error: Invalid memory read/write Topic is solved

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

KHA
Posts: 263
Joined: 21 Aug 2018, 11:11

Critical Error: Invalid memory read/write

23 Sep 2020, 09:58

Hallo zsm,
Was bedeutet die Meldung "Critical Error: Invalid memory read/write"?
Nach der Meldung, wird mein Script beendet.
Mein Script macht ein Backup aus der letzten 20 Einträge aus meiner Zwischenablage
Habe versucht, mit Try Catch den Fehler aufzufangen, hat aber nicht geholfen.

Komplette Fehlermeldung:

Spoiler





Die entsprechende Funktion:

Code: Select all

OnClipboardChange("ZwischenablageG")

ZwischenablageG(Type)
{
   If !(Type = 1)
      Return

   Loop, 10 {
	Try
	{
	   ClipAlt := Clipboard
	}
	Catch
	{
 	  Sleep, 1000
	  continue
	}
break
   }

   If FileExist(ClipAlt)
      Return




vorhanden := 0
	For i, v in Gis
	{
		If (v = ClipAlt)
		{
		
		FileDelete, % "Data\" Ner[i]
		 FileAppend, %ClipAlt%, Data\%A_Now%.txt
		Vorhanden := 1
		break
		}		
		
	}

   if (vorhanden = 0)
   FileAppend, %ClipAlt%, Data\%A_Now%.txt


;Dateien Löschen, die mehr als 20 sind
Dateiliste := DateiListeHolen()

	If (Ersten20 := InStr(Dateiliste, "`n", 0, 1, 20))
	DieErsten20 := SubStr(Dateiliste, Ersten20) 

	Loop, Parse, DieErsten20 , `n
	{
		    if (A_LoopField = "")
		        continue
	FileDelete, Data\%A_LoopField%
	}

GoSub, ListBox_Laden


}



Danke und schöne Grüße
User avatar
haichen
Posts: 561
Joined: 09 Feb 2014, 08:24

Re: Critical Error: Invalid memory read/write

24 Sep 2020, 03:35

Hier mal ein Versuch. Vielleicht hift der dir weiter.

Code: Select all

#Persistent
clipboard :=
OnClipboardChange("ZwischenablageG")

ZwischenablageG(Type)
{
	If (Type = 1)
	{
		If !FileExist(Clipboard)
		{
			/*
			vorhanden := 0
			For i, v in Gis
			{
				If (v = Clipboard)
				{				
					FileDelete, % "Data\" Ner[i]
					FileAppend, %Clipboard%, Data\%A_Now%.txt
					Vorhanden := 1
					break
				}			
			}
			
			if (vorhanden = 0)
				FileAppend, %Clipboard%, Data\%A_Now%.txt
			*/	
			FileAppend, %Clipboard%, Data\%A_Now%.txt
			tooltip, % "type:" type " filename: " clipboard
			
			sleep, 100
			clipboard :=
			
			;der rest von deinem Code
		}		
	}	
}
Last edited by haichen on 25 Sep 2020, 01:38, edited 1 time in total.
just me
Posts: 7574
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Critical Error: Invalid memory read/write

24 Sep 2020, 05:44

Moin,

Try / Catch wird Dir in diesem Fall nicht helfen, weil es ein 'Critical Error' ist.

Kannst Du mal etwas genauer beschreiben, was die Funktion konkret tun soll? Einige Variabennamen weisen darauf hin, dass Du im Clipboard einen Dateinamen erwartest. Ist das so?

Innerhalb einer OnClipboardChange() Funktion in größeren Zeitabständen mehrfach auf das Clipboard zuzugreifen, halte ich nicht für eine gute Idee.
KHA
Posts: 263
Joined: 21 Aug 2018, 11:11

Re: Critical Error: Invalid memory read/write

24 Sep 2020, 12:26

Hier ist das ganze Script:
Ein Suchfeld, für Inhalt suche
Ein ListBox für die letzte 20 Zwischenablagen
Noch ein ListBox für die Favoriten.

Code: Select all

#NoEnv
#SingleInstance, force
SetBatchLines, -1

Gui, -Caption +AlwaysOnTop +hwndListBoxClipViewer
Gui +Delimiterµ
Gui, Margin , 0, 0
Gui, Font, s12 w500, Verdana
Gui, Color, FFFF00


Menu, Tray, NoStandard
Menu, tray, Icon, Data\icon.ico
Menu, tray, Tip, ZwischenAblage verwalten



Menu, Tray, Add  ; Erstellt eine Trennlinie.
Menu, Tray, Add, Öffnen, Oeffnen
Menu, Tray, Add, Automatisch mit Window starten, MitWindowStarten
Menu, Tray, Add, Hotkey definieren, HotKeyFestlegen
Menu, Tray, Add, Beenden, Beenden
Menu, Tray, Default, Öffnen


	If !FileExist(A_Startup "\" A_ScriptName ".lnk")
	Menu, Tray, UnCheck, Automatisch mit Window starten
	Else
	Menu, Tray, Check, Automatisch mit Window starten


Menu, ZwischenAblageKontextMenü, Add, In die Zwischenablage, InZwischenAblage
Menu, ZwischenAblageKontextMenü, Add, Zu Favoriten hinzufügen, inFavoriten
Menu, ZwischenAblageKontextMenü, Add, Löschen, Delete
Menu, ZwischenAblageKontextMenü, Default, In die Zwischenablage


Menu, FavoritenKontextMenü, Add, In die Zwischenablage, Fv_InZwischenAblage
Menu, FavoritenKontextMenü, Add, Löschen, Fv_Delete
Menu, FavoritenKontextMenü, Default, In die Zwischenablage


Gui, Add, Edit, vSuchWert gSuchEreignis w200, Suchen
Gui, Add, Text, w200 h1 0x7
Gui, Add, ListBox, r20 w200 vZwischenAblage gZwischenAblage_g +HwndZwischenAblageHWND,
Gui Add, Button, +Default gEnter_g Hide w1, ZwEnter

GoSub, ListBox_Laden
Gui, Add, Text, w200 h1 0x7
Gui, Add, ListBox, r10 w200 xm vFavoriten gFavoriten_g +HwndFavoritenHWND , 
GoSub, Favoriten_Laden
Gui Add, Button, +Default gFvEnter_g Hide w1, FvEnter
Gui, Font, s8 w400, Verdana
Gui, Add, StatusBar,, % "Zwischenablage: " Ner.length() " Favoriten: " StrSplit(favoriten, "µ", "`n").MaxIndex() - 1
Gui, Font, Default

WinSet, TransColor, FFFF00
WinSet, Transparent, 0 , ahk_id %ListBoxClipViewer%


Gui, Show , Autosize Hide ,  ListBox Viewer

OnClipboardChange("ZwischenablageG")
OnMessage( 0x200, "WM_MOUSEMOVE" ) 
OnMessage(0x201, "WM_LBUTTONDOWN")


IniRead, GespeicherteHotKey, Data\Settings.ini, HotKey, DefaultHotKey
Hotkey, IfWinNotExist, ahk_id %ListBoxClipViewer%
Hotkey, %GespeicherteHotKey% , FensterZeigen
Hotkey, IfWinNotExist
Return



FensterZeigen:
Gui, Show
Return

/*
#If WinExist("ahk_id " ListBoxClipViewer)
^Down::
;GuiControl, Focus, ZwischenAblage
GuiControl, Choose, ZwischenAblage, 1
#If
Return
*/


Enter_g:
Gui +OwnDialogs
GuiControl, -AltSubmit, ZwischenAblage
GuiControlGet, AusgeWaehlteZeile, , Zwischenablage
Clipboard := AusgeWaehlteZeile
Gui, Hide
Return

FvEnter_g:
GuiControl, -AltSubmit, ZwischenAblage
GuiControlGet, AusgeWaehlteZeile, , Favoriten
Clipboard := AusgeWaehlteZeile
Gui, Hide
Return

InZwischenAblage:
Gui +OwnDialogs
GuiControl, -AltSubmit, ZwischenAblage
GuiControlGet, AusgeWaehlteZeile, , Zwischenablage
if (AusgeWaehlteZeile = "")
Return

Clipboard := AusgeWaehlteZeile
Gui, Hide
Return

InFavoriten:
GuiControl, -AltSubmit, ZwischenAblage
GuiControlGet, AusgeWaehlteZeile, , Zwischenablage
if (AusgeWaehlteZeile = "")
Return

FileAppend, %AusgeWaehlteZeile%µ, Data\favoriten.diz
GoSub, Favoriten_Laden
Return

Delete:
GuiControl, +AltSubmit, ZwischenAblage
GuiControlGet, Position ,, ZwischenAblage
if (Position = "")
Return

	;if (A_GuiEvent = "DoubleClick") && (SuchWert = "")
	if (SuchWert = "")
	{
	Control, Delete, %Position% , , ahk_id %ZwischenAblageHWND%
	Geloescht := Ner[Position]
	FileDelete, Data\%Geloescht%
	EntfernterWert := Ner.RemoveAt(Position)

	}

	;if (A_GuiEvent = "DoubleClick") && (SuchWert != "")
	if (SuchWert != "")
	{
	Control, Delete, %Position% , , ahk_id %ZwischenAblageHWND%
	DateiAusSucheLoeschen := Fi[Position]
	FileDelete, Data\%DateiAusSucheLoeschen%
	IndexAusSucheLoeschen := Fi.RemoveAt(Position	)
	}

GuiControl, -AltSubmit, ZwischenAblage
Return


Fv_InZwischenAblage:
GuiControl, -AltSubmit, Favoriten

GuiControlGet, AusgeWaehlteZeile, , Favoriten
if (AusgeWaehlteZeile = "")
Return
Clipboard := AusgeWaehlteZeile
Gui, Hide

Return



Fv_Delete:
GuiControlGet, AusgeWaehlteZeile, , Favoriten
if (AusgeWaehlteZeile = "")
Return

FileRead, loescheFav, Data\favoriten.diz
NewFavoriten := StrReplace(loescheFav, AusgeWaehlteZeile "µ", "", WieVielTreffer)
if (WieVielTreffer > 0)
{
FileDelete, Data\favoriten.diz
FileAppend, %NewFavoriten%, Data\favoriten.diz
}Else {
MsgBox, Kann keinen entsprechenden Eintrag finden.
}
GoSub, Favoriten_Laden
Return

ZwischenAblage_g:
GuiControl, +Default, ZwEnter

	if (A_GuiEvent = "DoubleClick")
	{
	GuiControl, -AltSubmit, ZwischenAblage
	GuiControlGet, AusgeWaehlteZeile, , Zwischenablage
	if (AusgeWaehlteZeile = "")
	Return

	Clipboard := AusgeWaehlteZeile
	Gui, Hide

	}
Return

Favoriten_g:
GuiControl, +Default, FvEnter

	if (A_GuiEvent = "DoubleClick")
	{
	GuiControl, -AltSubmit, Favoriten
	GuiControlGet, AusgeWaehlteZeile, , Favoriten
	if (AusgeWaehlteZeile = "")
	Return

	Clipboard := AusgeWaehlteZeile
	Gui, Hide

	}

Return

SuchEreignis:
Gui, Submit, NoHide
Gui +OwnDialogs
GoSub, ListBox_Laden
Fi := []
;ControlGet, ZwischenAblage_ListBox, List,,, % "ahk_id " ZwischenAblageHWND ; holt sich die komplette liste
GuiControlGet, SuchText ,, SuchWert
GuiControl,, ZwischenAblage, µ ;Listbox inhalt löschen

GuiControl, -Redraw, ZwischenAblage
k := 1


	For i, v in Gis
	{
		If (SuchWert = "") || InStr(v, SuchWert)
		{
		GuiControl,, ZwischenAblage, %v%
		Fi[k] := Ner[i]
		k++
		}
		
	}

GuiControl, +Redraw, ZwischenAblage



SB_SetText("Es gibt " . k -1 . " treffer!")

Return



GuiContextMenu:
if (A_GuiControl = "ZwischenAblage")
Menu, ZwischenAblageKontextMenü, Show, %A_GuiX%, %A_GuiY%

if (A_GuiControl = "Favoriten")
Menu, FavoritenKontextMenü, Show, %A_GuiX%, %A_GuiY%

Return

Oeffnen:
WinGet, FensterStyle, Style, ahk_id %ListBoxClipViewer%
	If (FensterStyle = "")
	Gui, Show
	Else
	Gui, Hide
Return


MitWindowStarten:
	If !FileExist(A_Startup "\" A_ScriptName ".lnk")
	{
	FileCreateShortcut %A_ScriptFullPath%, %A_Startup%\%A_ScriptName%.lnk,%A_WorkingDir%, /AutoStart, Startet Zwischenablage Monitor beim start., %A_WorkingDir%\Data\icon.ico,,,7
	Menu, Tray, Check, Automatisch mit Window starten

	}
	Else {
	FileDelete %A_Startup%\%A_ScriptName%.lnk
	Menu, Tray, UnCheck, Automatisch mit Window starten
	}

Return

HotKeyFestlegen:
Gui HotKeyDef: +OwnDialogs
Gui, Submit, NoHide


Gui, HotKeyDef:New, -Caption +ToolWindow, HotKey festlegen
Gui, HotKeyDef: Add, Hotkey, vGewaehlterHotkey w160, %GespeicherteHotKey%
Gui, Add, Button, w80 gHotKeyDefGuiClose, Abbrechen
Gui, Add, Button, Default w80 x+ gHotKeyDefOk, OK

Gui, HotKeyDef:Show, Autosize
Gui, Add, Button, Default w80, OK
Return
HotKeyDefOk:
Gui, HotKeyDef:Default
GuiControlGet, myHotKey ,, GewaehlterHotkey

IniWrite, %myHotKey%, Data\Settings.ini, HotKey, DefaultHotKey
Reload

Return

HotKeyDefGuiClose:
HotKeyDefGuiEscape:
Gui, destroy
Return

GuiEscape:
Gui, Hide
Return
Beenden:
GuiClose:
ExitApp
Return


ListBox_Laden:
Dateiliste := DateiListeHolen()

GuiControl,, ZwischenAblage, µ ;Listbox inhalt löschen
Global Ner := []
Global Gis := []
GuiControl, -Redraw, ZwischenAblage
	Loop, parse, Dateiliste, `n, `r
	{
	FileRead, Inhalt, Data\%A_LoopField%
	Ner[A_index] := A_LoopField
	Gis[A_index] := Inhalt
	GuiControl,, ZwischenAblage , %inhalt%
	}
GuiControl, +Redraw, ZwischenAblage


Return


Favoriten_Laden:
FileRead, favoriten, Data\favoriten.diz
GuiControl,, Favoriten, µ ;Listbox inhalt löschen
GuiControl, -Redraw, Favoriten
GuiControl,, Favoriten, %favoriten%
GuiControl, +Redraw, Favoriten
Return



ZwischenablageG(Type)
{


   If !(Type = 1)
      Return



Loop, 10 {
	Try
	{
	   ClipAlt := Clipboard
	}
	Catch
	{
 	  Sleep, 1000
	  continue
	}
break
	}
   If FileExist(ClipAlt)
      Return




vorhanden := 0
	For i, v in Gis
	{
		If (v = ClipAlt)
		{
		
		FileDelete, % "Data\" Ner[i]
		 FileAppend, %ClipAlt%, Data\%A_Now%.txt
		Vorhanden := 1
		break
		}		
		
	}

   if (vorhanden = 0)
   FileAppend, %ClipAlt%, Data\%A_Now%.txt


;Dateien Löschen, die mehr als 20 sind
Dateiliste := DateiListeHolen()

	If (Ersten20 := InStr(Dateiliste, "`n", 0, 1, 20))
	DieErsten20 := SubStr(Dateiliste, Ersten20) 

	Loop, Parse, DieErsten20 , `n
	{
		    if (A_LoopField = "")
		        continue
	FileDelete, Data\%A_LoopField%
	}

GoSub, ListBox_Laden

}

DateiListeHolen()
{
Dateiliste := ""
	Loop, Files, Data\*.txt
	    Dateiliste .= A_LoopFileName "`n"
	Dateiliste := Trim(Dateiliste, "`n")
Sort, Dateiliste , NR

Return % Dateiliste

}
WM_LBUTTONDOWN() 
{ 
    if (A_GuiControl = "SuchWert") { 
     GuiControl,, SuchWert, 
    } 
}

WM_MOUSEMOVE( wparam, lparam, msg, hwnd )
{
if wparam = 1 ; LButton
PostMessage, 0xA1, 2,,, A ; WM_NCLBUTTONDOWN
}
User avatar
haichen
Posts: 561
Joined: 09 Feb 2014, 08:24

Re: Critical Error: Invalid memory read/write

25 Sep 2020, 02:27

Das hier scheint bei mir zu funktionieren:

Code: Select all

#NoEnv
#SingleInstance, force
SetBatchLines, -1

Gui, -Caption +AlwaysOnTop +hwndListBoxClipViewer
Gui +Delimiterµ
Gui, Margin , 0, 0
Gui, Font, s12 w500, Verdana
Gui, Color, FFFF00


Menu, Tray, NoStandard
Menu, tray, Icon, Data\icon.ico
Menu, tray, Tip, ZwischenAblage verwalten



Menu, Tray, Add  ; Erstellt eine Trennlinie.
Menu, Tray, Add, Öffnen, Oeffnen
Menu, Tray, Add, Automatisch mit Window starten, MitWindowStarten
Menu, Tray, Add, Hotkey definieren, HotKeyFestlegen
Menu, Tray, Add, Beenden, Beenden
Menu, Tray, Default, Öffnen


If !FileExist(A_Startup "\" A_ScriptName ".lnk")
	Menu, Tray, UnCheck, Automatisch mit Window starten
Else
	Menu, Tray, Check, Automatisch mit Window starten


Menu, ZwischenAblageKontextMenü, Add, In die Zwischenablage, InZwischenAblage
Menu, ZwischenAblageKontextMenü, Add, Zu Favoriten hinzufügen, inFavoriten
Menu, ZwischenAblageKontextMenü, Add, Löschen, Delete
Menu, ZwischenAblageKontextMenü, Default, In die Zwischenablage


Menu, FavoritenKontextMenü, Add, In die Zwischenablage, Fv_InZwischenAblage
Menu, FavoritenKontextMenü, Add, Löschen, Fv_Delete
Menu, FavoritenKontextMenü, Default, In die Zwischenablage


Gui, Add, Edit, vSuchWert gSuchEreignis w200, Suchen
Gui, Add, Text, w200 h1 0x7
Gui, Add, ListBox, r20 w200 vZwischenAblage gZwischenAblage_g +HwndZwischenAblageHWND,
Gui Add, Button, +Default gEnter_g Hide w1, ZwEnter

GoSub, ListBox_Laden
Gui, Add, Text, w200 h1 0x7
Gui, Add, ListBox, r10 w200 xm vFavoriten gFavoriten_g +HwndFavoritenHWND ,
GoSub, Favoriten_Laden
Gui Add, Button, +Default gFvEnter_g Hide w1, FvEnter
Gui, Font, s8 w400, Verdana
Gui, Add, StatusBar,, % "Zwischenablage: " Ner.length() " Favoriten: " StrSplit(favoriten, "µ", "`n").MaxIndex() - 1
Gui, Font, Default

WinSet, TransColor, FFFF00
WinSet, Transparent, 0 , ahk_id %ListBoxClipViewer%


Gui, Show , Autosize Hide ,  ListBox Viewer

OnClipboardChange("ZwischenablageG")
OnMessage( 0x200, "WM_MOUSEMOVE" )
OnMessage(0x201, "WM_LBUTTONDOWN")


IniRead, GespeicherteHotKey, Data\Settings.ini, HotKey, DefaultHotKey
Hotkey, IfWinNotExist, ahk_id %ListBoxClipViewer%
Hotkey, %GespeicherteHotKey% , FensterZeigen
Hotkey, IfWinNotExist
Return

esc::
ExitApp
return

FensterZeigen:
Gui, Show
Return

/*
	#If WinExist("ahk_id " ListBoxClipViewer)
	^Down::
	;GuiControl, Focus, ZwischenAblage
	GuiControl, Choose, ZwischenAblage, 1
	#If
	Return
*/


Enter_g:
Gui +OwnDialogs
GuiControl, -AltSubmit, ZwischenAblage
GuiControlGet, AusgeWaehlteZeile, , Zwischenablage
Clipboard := AusgeWaehlteZeile
Gui, Hide
Return

FvEnter_g:
GuiControl, -AltSubmit, ZwischenAblage
GuiControlGet, AusgeWaehlteZeile, , Favoriten
Clipboard := AusgeWaehlteZeile
Gui, Hide
Return

InZwischenAblage:
Gui +OwnDialogs
GuiControl, -AltSubmit, ZwischenAblage
GuiControlGet, AusgeWaehlteZeile, , Zwischenablage
if (AusgeWaehlteZeile = "")
	Return
tooltip, AusgeWaehlteZeile
Clipboard := AusgeWaehlteZeile
Gui, Hide
Return

InFavoriten:
GuiControl, -AltSubmit, ZwischenAblage
GuiControlGet, AusgeWaehlteZeile, , Zwischenablage
if (AusgeWaehlteZeile = "")
	Return

FileAppend, %AusgeWaehlteZeile%µ, Data\favoriten.diz
GoSub, Favoriten_Laden
Return

Delete:
GuiControl, +AltSubmit, ZwischenAblage
GuiControlGet, Position ,, ZwischenAblage
if (Position = "")
	Return

;if (A_GuiEvent = "DoubleClick") && (SuchWert = "")
if (SuchWert = "")
{
	Control, Delete, %Position% , , ahk_id %ZwischenAblageHWND%
	Geloescht := Ner[Position]
	FileDelete, Data\%Geloescht%
	EntfernterWert := Ner.RemoveAt(Position)
	
}

;if (A_GuiEvent = "DoubleClick") && (SuchWert != "")
if (SuchWert != "")
{
	Control, Delete, %Position% , , ahk_id %ZwischenAblageHWND%
	DateiAusSucheLoeschen := Fi[Position]
	FileDelete, Data\%DateiAusSucheLoeschen%
	IndexAusSucheLoeschen := Fi.RemoveAt(Position	)
}

GuiControl, -AltSubmit, ZwischenAblage
Return


Fv_InZwischenAblage:
GuiControl, -AltSubmit, Favoriten

GuiControlGet, AusgeWaehlteZeile, , Favoriten
if (AusgeWaehlteZeile = "")
	Return
Clipboard := AusgeWaehlteZeile
Gui, Hide

Return



Fv_Delete:
GuiControlGet, AusgeWaehlteZeile, , Favoriten
if (AusgeWaehlteZeile = "")
	Return

FileRead, loescheFav, Data\favoriten.diz
NewFavoriten := StrReplace(loescheFav, AusgeWaehlteZeile "µ", "", WieVielTreffer)
if (WieVielTreffer > 0)
{
	FileDelete, Data\favoriten.diz
	FileAppend, %NewFavoriten%, Data\favoriten.diz
}Else {
	MsgBox, Kann keinen entsprechenden Eintrag finden.
}
GoSub, Favoriten_Laden
Return

ZwischenAblage_g:
GuiControl, +Default, ZwEnter

if (A_GuiEvent = "DoubleClick")
{
	GuiControl, -AltSubmit, ZwischenAblage
	GuiControlGet, AusgeWaehlteZeile, , Zwischenablage
	if (AusgeWaehlteZeile = "")
		Return
	
	Clipboard := AusgeWaehlteZeile
	Gui, Hide
	
}
Return

Favoriten_g:
GuiControl, +Default, FvEnter

if (A_GuiEvent = "DoubleClick")
{
	GuiControl, -AltSubmit, Favoriten
	GuiControlGet, AusgeWaehlteZeile, , Favoriten
	if (AusgeWaehlteZeile = "")
		Return
	
	Clipboard := AusgeWaehlteZeile
	Gui, Hide
	
}

Return

SuchEreignis:
Gui, Submit, NoHide
Gui +OwnDialogs
GoSub, ListBox_Laden
Fi := []
;ControlGet, ZwischenAblage_ListBox, List,,, % "ahk_id " ZwischenAblageHWND ; holt sich die komplette liste
GuiControlGet, SuchText ,, SuchWert
GuiControl,, ZwischenAblage, µ ;Listbox inhalt löschen

GuiControl, -Redraw, ZwischenAblage
k := 1


For i, v in Gis
{
	If (SuchWert = "") || InStr(v, SuchWert)
	{
		GuiControl,, ZwischenAblage, %v%
		Fi[k] := Ner[i]
		k++
	}
	
}

GuiControl, +Redraw, ZwischenAblage



SB_SetText("Es gibt " . k -1 . " treffer!")

Return



GuiContextMenu:
if (A_GuiControl = "ZwischenAblage")
	Menu, ZwischenAblageKontextMenü, Show, %A_GuiX%, %A_GuiY%

if (A_GuiControl = "Favoriten")
	Menu, FavoritenKontextMenü, Show, %A_GuiX%, %A_GuiY%

Return

Oeffnen:
WinGet, FensterStyle, Style, ahk_id %ListBoxClipViewer%
If (FensterStyle = "")
	Gui, Show
Else
	Gui, Hide
Return


MitWindowStarten:
If !FileExist(A_Startup "\" A_ScriptName ".lnk")
{
	FileCreateShortcut %A_ScriptFullPath%, %A_Startup%\%A_ScriptName%.lnk,%A_WorkingDir%, /AutoStart, Startet Zwischenablage Monitor beim start., %A_WorkingDir%\Data\icon.ico,,,7
	Menu, Tray, Check, Automatisch mit Window starten
	
}
Else {
	FileDelete %A_Startup%\%A_ScriptName%.lnk
	Menu, Tray, UnCheck, Automatisch mit Window starten
}

Return

HotKeyFestlegen:
Gui HotKeyDef: +OwnDialogs
Gui, Submit, NoHide


Gui, HotKeyDef:New, -Caption +ToolWindow, HotKey festlegen
Gui, HotKeyDef: Add, Hotkey, vGewaehlterHotkey w160, %GespeicherteHotKey%
Gui, Add, Button, w80 gHotKeyDefGuiClose, Abbrechen
Gui, Add, Button, Default w80 x+ gHotKeyDefOk, OK

Gui, HotKeyDef:Show, Autosize
Gui, Add, Button, Default w80, OK
Return
HotKeyDefOk:
Gui, HotKeyDef:Default
GuiControlGet, myHotKey ,, GewaehlterHotkey

IniWrite, %myHotKey%, Data\Settings.ini, HotKey, DefaultHotKey
Reload

Return

HotKeyDefGuiClose:
HotKeyDefGuiEscape:
Gui, destroy
Return

GuiEscape:
Gui, Hide
Return
Beenden:
GuiClose:
ExitApp
Return


ListBox_Laden:
Dateiliste := DateiListeHolen()

GuiControl,, ZwischenAblage, µ ;Listbox inhalt löschen
Global Ner := []
Global Gis := []
GuiControl, -Redraw, ZwischenAblage
Loop, parse, Dateiliste, `n, `r
{
	FileRead, Inhalt, Data\%A_LoopField%
	Ner[A_index] := A_LoopField
	Gis[A_index] := Inhalt
	GuiControl,, ZwischenAblage , %inhalt%
}
GuiControl, +Redraw, ZwischenAblage


Return


Favoriten_Laden:
FileRead, favoriten, Data\favoriten.diz
GuiControl,, Favoriten, µ ;Listbox inhalt löschen
GuiControl, -Redraw, Favoriten
GuiControl,, Favoriten, %favoriten%
GuiControl, +Redraw, Favoriten
Return


ZwischenablageG(Type)
{
	If (Type = 1)
	{
		If !FileExist(Clipboard)
		{		
			vorhanden := 0
			For i, v in Gis
			{
				If (v = Clipboard)
				{
					FileDelete, % "Data\" Ner[i]
					FileAppend, %Clipboard%, Data\%A_Now%.txt
					Vorhanden := 1
					return
				}
			}
			
			if !vorhanden
				FileAppend, %Clipboard%, Data\%A_Now%.txt
			
			;Dateien Löschen, die mehr als 20 sind
			Dateiliste := DateiListeHolen()
			
			If (Ersten20 := InStr(Dateiliste, "`n", 0, 1, 20))
				DieErsten20 := SubStr(Dateiliste, Ersten20)
			
			Loop, Parse, DieErsten20 , `n
			{
				if (A_LoopField = "")
					continue
				FileDelete, Data\%A_LoopField%
			}
			
			GoSub, ListBox_Laden
		}
	}
}


xZwischenablageG(Type)
{
	
	
	If !(Type = 1)
		Return
	
	
	
	Loop, 10 {
		Try
		{
			ClipAlt := Clipboard
		}
		Catch
		{
			Sleep, 1000
			continue
		}
		break
	}
	If FileExist(ClipAlt)
		Return
	
	
	
	
	vorhanden := 0
	For i, v in Gis
	{
		If (v = ClipAlt)
		{
			
			FileDelete, % "Data\" Ner[i]
			FileAppend, %ClipAlt%, Data\%A_Now%.txt
			Vorhanden := 1
			break
		}
		
	}
	
	if (vorhanden = 0)
		FileAppend, %ClipAlt%, Data\%A_Now%.txt
	
	
	;Dateien Löschen, die mehr als 20 sind
	Dateiliste := DateiListeHolen()
	
	If (Ersten20 := InStr(Dateiliste, "`n", 0, 1, 20))
		DieErsten20 := SubStr(Dateiliste, Ersten20)
	
	Loop, Parse, DieErsten20 , `n
	{
		if (A_LoopField = "")
			continue
		FileDelete, Data\%A_LoopField%
	}
	
	GoSub, ListBox_Laden
	
}

DateiListeHolen()
{
	Dateiliste := ""
	Loop, Files, Data\*.txt
		Dateiliste .= A_LoopFileName "`n"
	Dateiliste := Trim(Dateiliste, "`n")
	Sort, Dateiliste , NR
	
	Return % Dateiliste
	
}
WM_LBUTTONDOWN()
{
	if (A_GuiControl = "SuchWert") {
		GuiControl,, SuchWert,
	}
}

WM_MOUSEMOVE( wparam, lparam, msg, hwnd )
{
	if wparam = 1 ; LButton
		PostMessage, 0xA1, 2,,, A ; WM_NCLBUTTONDOWN
}
just me
Posts: 7574
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Critical Error: Invalid memory read/write

25 Sep 2020, 04:18

Moin,

ich denke mal, dass die Originalversion von KHA generell auch funktioniert und der Fehler nur sporadisch auftritt. Deshalb meine Frage, was die Routine konkret tun soll.

Code: Select all

   If FileExist(ClipAlt)
      Return
Was soll das bezwecken?

Code: Select all

   Loop, 10 {
      Try
      {
         ClipAlt := Clipboard
      }
      Catch
      {
        Sleep, 1000
        continue
      }
      break
   }
Weshalb brauchst Du die Schleife und Try/Catch?

Hast Du Zusammenhänge zwischen dem Auftreten des Fehlers und vorhergegangenen Aktionen festgestellt?
User avatar
haichen
Posts: 561
Joined: 09 Feb 2014, 08:24

Re: Critical Error: Invalid memory read/write

25 Sep 2020, 05:18

ClipAlt ist meiner Meinung nach überflüssig. Man kann einfach mit Clipboard arbeiten.
Die ganze 10x Schleife ist unnötig. In meiner Version habe ich sie entfernt. Und damit auch Try und Catch
Da der Fehler genau dort auftritt, ist meine Hoffnung, den sporadischen Fehler so eliminiert zu haben.

Zweck des FileExist scheint mir zu sein, nur Dateipfade in die Zwischenablage aufzunehmen, die es nicht gibt.
Aber das weiß KHA sicher genauer.
just me
Posts: 7574
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Critical Error: Invalid memory read/write

25 Sep 2020, 05:50

Code: Select all

ClipAlt := Clipboard
finde ich besser als wiederholte Zugriffe auf das Clipboard.

Und weil der Zugriff auf das Clipboard normalerweise funktionieren sollte, frage ich nach dem Grund für die Schleife. Die ist ja nicht eigenständig in den Code gerutscht.
User avatar
haichen
Posts: 561
Joined: 09 Feb 2014, 08:24

Re: Critical Error: Invalid memory read/write

25 Sep 2020, 06:13

Warum ist das denn ein Zugriff? Ist das nicht auch nur eine Variable? Hatte ich für mich immer gedacht. Da fehlt mir dann wahrscheinlich die Tiefe im Verständnis. Interessiert mich ernsthaft.
just me
Posts: 7574
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Critical Error: Invalid memory read/write

25 Sep 2020, 06:34

Hallo,

AHK's Clipboard Variable wird prinzipiell bei jedem Zugriff neu mit den passenden Inhalten der Systemablage gefüllt. Möglicherweise gibt es aber zwischen den Zugriffen eine 'Schamfrist' im Millisekundenbereich, während der nicht versucht wird, den Inhalt zu aktualisieren. Ich kann das im Sourcecode nicht eindeutig erkennen.
User avatar
haichen
Posts: 561
Joined: 09 Feb 2014, 08:24

Re: Critical Error: Invalid memory read/write

25 Sep 2020, 07:00

Aaah. OK. Dann macht das wohl Sinn. Super, wieder etwas gelernt. Danke.

Aber die Schleife gehört da sicher nicht hin. Die Änderung des Clipboards wurde ja schon mit OnClipboardChange festgestellt. Auch, dass darin nur Text ist (Type). Dann müßte man den Inhalt von Clipboard der Variable ClipAlt zuweisen und gut.
Da die Schleife (meistens) nicht stört, ist sie bestimmt nur eine Überbleibsel von Experimenten.
KHA
Posts: 263
Joined: 21 Aug 2018, 11:11

Re: Critical Error: Invalid memory read/write

25 Sep 2020, 12:13

Das Script läuft bei mir Permanent im Hintergrund, die Fehlermeldung erscheint, wenn ich 8Std. am PC gearbeitet habe mindestens einmal.
Einen Zusammenhang zwischen erscheinen des Fehlers und einen bestimmten Aktion konnte ich nicht feststellen.


Code: Select all

If FileExist(ClipAlt)
      Return 
Was soll das bezwecken?
Der Zweck ist, wenn ich Dateien kopiere, werden die Pfade in Clipboard gespeichert, aber danach kann ich die Dateien nirgend wo einfügen, d.h. in Clipboard befinden sich nur noch strings. Damit will ich bezwecken, wenn es sich um Dateienpfade handelt, dann soll es nichts weitermachen.

Code: Select all

   Loop, 10 {
      Try
      {
         ClipAlt := Clipboard
      }
      Catch
      {
        Sleep, 1000
        continue
      }
      break
   }
Weshalb brauchst Du die Schleife und Try/Catch?
War ein Verzweiflungsakt, habe gehofft dadurch den Kritischen Fehler zu umgehen, nahm an Clipboard sei aus irgendwelchen gründen gesperrt /blockiert was auch immer.

Zweck des FileExist scheint mir zu sein, nur Dateipfade in die Zwischenablage aufzunehmen, die es nicht gibt.
Ich möchte nur Text also keine Bilder oder Dateien usw.
Später möchte mit StrReplace und RegExReplace gewisse Text stellen durch andere ersetzen.
User avatar
haichen
Posts: 561
Joined: 09 Feb 2014, 08:24

Re: Critical Error: Invalid memory read/write

26 Sep 2020, 03:01

Ich habe mal versucht dein Skript zum Absturz zu bringen..
Ob der Ansatz dafür geeignet ist weiß ich nicht wirklich, aber damit ist es mir jedenfalls nicht gelungen!

Code: Select all

#Persistent
#NoEnv
#SingleInstance, force
SetBatchLines, -1

p::
i:=0
loop, 10000
{
	send, ^c
	x:=clipboard
	tooltip % i++
}
return
Stürzt es denn bei der Benutzung ab? Also wenn du gerade etwas kopierst, oder unabhängig davon? Oder sogar wenn du mal ein paar Tage nichts machst? Hast du noch einen zweiten Rechner um das auf dem mal zu testen?
KHA
Posts: 263
Joined: 21 Aug 2018, 11:11

Re: Critical Error: Invalid memory read/write

26 Sep 2020, 04:44

@haichen Guten morgen,
habe jetzt dein Script laufen lassen, beim ersten mal habe ich nur ein Satz aus Forum markiert, das Script lief bis 9999.
beim zweiten mal habe ich unterschiedliche stellen markiert, so das jedes mal etwas anderes kopiert wird. Beim 4489 ist dann mein Script abgestürzt mit der obigen Meldung.
KHA
Posts: 263
Joined: 21 Aug 2018, 11:11

Re: Critical Error: Invalid memory read/write

26 Sep 2020, 04:51

Hier noch antworten auf deine Fragen:
Also wenn du gerade etwas kopierst, oder unabhängig davon?
Das Script stürzt immer ab, unmittelbar nachdem ich etwas kopiert habe
Oder sogar wenn du mal ein paar Tage nichts machst?
Da ich ein Copy&Paste junkie bin :), hat das Script einen Tag ohne Absturz noch nicht überstanden
Hast du noch einen zweiten Rechner um das auf dem mal zu testen?
Habe zu Hause nur einen PC (Win10 x64, version 2004), zum Ausprobieren, könnte ich es mit auf die Arbeit nehmen
User avatar
haichen
Posts: 561
Joined: 09 Feb 2014, 08:24

Re: Critical Error: Invalid memory read/write

26 Sep 2020, 06:05

"Beim zweiten mal habe ich unterschiedliche stellen markiert, so das jedes mal etwas anderes kopiert wird. Beim 4489 ist dann mein Script abgestürzt mit der obigen Meldung."
Damit habe ich bei mir die Abstürze auch reproduzieren können.
Die Fehlermeldung ist identisch, bezog sich aber auf das 10000x-Schleifenskript!
Vermeiden konnte ich das mit einem Sleep,10 NACH der Zuweisung x:=clipboard.
Daher mal mein Vorschlag, das auch in dein Skript einzubauen. Also

Code: Select all

	ClipAlt := Clipboard
	Sleep, 10
Wenn du das dann mit dem 1000-Loop testen willst: das ging bei mir nicht - da mußte ich den Rechner neustarten :?
KHA
Posts: 263
Joined: 21 Aug 2018, 11:11

Re: Critical Error: Invalid memory read/write

26 Sep 2020, 08:46

@haichen vielen Dank!
scheint zu funktionieren, ich arbeite jetzt paar Tage damit, dann habe ich Gewissheit
KHA
Posts: 263
Joined: 21 Aug 2018, 11:11

Re: Critical Error: Invalid memory read/write

26 Sep 2020, 10:10

kriEro.jpg
kriEro.jpg (31.06 KiB) Viewed 235 times
Leider zu früh gefreut, soeben poppte die Meldung wieder auf.
just me
Posts: 7574
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Critical Error: Invalid memory read/write

27 Sep 2020, 05:00

Moin,

das Systemclipboard kann unterschiedliche Daten enthalten, die durch unterschiedliche Formatbezeichner gekennzeichnet sind. Dazu gehören die Textformate (CF_TEXT, CF_UNICODETEXT, CF_OEMTEXT) und das Format CF_HDROP für das Drag&Drop von Dateien. Einer OnClipboardChange() Funktion wird als Typ die 1 übergeben, wenn das Systemclipboard ein Textformat oder CF_HDROP enthält. Die AHK-Variable Clipboard liefert bevorzugt den Text. Wenn kein Text vorhanden ist, werden die Dateinamen aus CF_HDROP als Text geliefert.

Wenn man Letzteres unterbindet, kannst Du Dir schon mal die FileExist() Prüfung für das Aussondern von Dateien sparen. Dafür reicht bereits der Aufruf einer API-Funktion:

Code: Select all

Clipboard_HasText() {
   Static CF_NATIVETEXT := A_IsUnicode ? 13 : 1 ; CF_UNICODETEXT = 13, CF_TEXT = 1
   Return DllCall("IsClipboardFormatAvailable", "UInt", CF_NATIVETEXT, "UInt")
}
Wenn Du die in ZwischenablageG() aufrufst kannst Du die Dateien blocken:

Code: Select all

ZwischenablageG(Type) {
   If !(Type = 1) Or !Clipboard_HasText()
      Return
Du kannst das ja mal probieren. Wenn es nicht hilft, habe ich noch etwas für einen weiteren Versuch.
User avatar
haichen
Posts: 561
Joined: 09 Feb 2014, 08:24

Re: Critical Error: Invalid memory read/write

27 Sep 2020, 07:06

:thumbup: Clipboard_HasText(). Super. Kommt sofort in meine Sammlung interessanter, potentiell nützlicher Funktionen. Danke.
@KHA Schade. Du könntest das Sleep evtl. noch vergrößern. Oder vielleicht hilft der Vorschlag von just me.

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: Google [Bot] and 1 guest