Seite 1 von 1

Unicode Problem mit Kill Programm

Verfasst: 09.04.2012 13:36
von Graffiti
Hallo
ich habe ein Problem mit Unicode
den ich leider brauche wegen der blöden Thai Schrift

die untere Procedure funktioniert ohne Unicode 1a
mit aktiviertem Unicode wird die z.B. vlc.exe nicht mehr beendet
und PB 4.51 (mit JaPBe) meldet einen Polink Error - Datei nicht gefunden

ich denke mal durch den Unicode Modus wird der Dateiname nicht richtig übertragen,
aber eine Lösung habe ich trotzden nicht gefunden :(

ich habe schon mehrere Kill Codes getestet aus dem Forum, immer das gleiche wie bei mir
wo liegt mein bzw. der Fehler ?

Danke schonmal für eure Hilfe
Gerhard

Code: Alles auswählen

  #PROCESS_TERMINATE = $1 
  #PROCESS32LIB = 9999 
  #TH32CS_SNAPPROCESS = $2 

Procedure KillPrg(ProcessName.s) 
 Debug ProcessName
  
  If OpenLibrary (#PROCESS32LIB, "kernel32.dll") 
    snap= CallFunction (#PROCESS32LIB, "CreateToolhelp32Snapshot", #TH32CS_SNAPPROCESS, 0) 
    If snap 
      Define.PROCESSENTRY32 Proc32 
      Proc32\dwSize = SizeOf (PROCESSENTRY32) 
      If CallFunction (#PROCESS32LIB, "Process32First", snap, @Proc32) 
        Repeat 
          If PeekS(@Proc32 + 36, 296) = ProcessName.s 
            phandle = OpenProcess_ (#PROCESS_TERMINATE, #False, PeekL(@Proc32 + 8)) 
            If phandle <> #Null 
                 If TerminateProcess_ (phandle, 1) : result = #True:  EndIf 
              CloseHandle_ (phandle) 
            EndIf 
          EndIf 
        Until CallFunction (#PROCESS32LIB, "Process32Next", snap, @Proc32) = 0 
      EndIf 
      CloseHandle_ (snap) 
    EndIf 
    CloseLibrary (#PROCESS32LIB) 
  EndIf 
EndProcedure 

KillPrg("vlc.exe")      ; VLC Player


Re: Unicode Problem mit Kill Programm

Verfasst: 09.04.2012 14:00
von Danilo
Warum benutzt Du nicht direkt Process32First_()?

Da Du CallFunction nimmst, mußt Du bei Unicode dann "Process32FirstW" aufrufen.
Wenn Du direkt Process32First_() nimmst, geschieht das automatisch.

Ein anderes Problem war die Struktur PROCESSENTRY32 - aber nur bei 64bit PB Compiler.
Die Struktur für 64bit ist ab PB 4.61 beta1 gefixt.

Siehe:
- Unicode Process32First
- [Done] WinAPI structure PROCESSENTRY32 wrong for PB/Win x64
- PureBasic 4.61 beta 1 - WinAPI structure changes

Die Lösung ist also:
Wenn Du 64bit Compiler benutzt -> eigene, gefixte Struktur oder PB4.61beta1+ nehmen.
Wenn Du 32bit Compiler benutzt -> direkt Process32First_() nehmen oder CallFunction mit "Process32FirstW" für Unicode


Das Gleiche gilt für Process32Next -> Process32NextW.

Code: Alles auswählen

"PeekS(@Proc32 + 36, 296)" solltest Du nach         "PeekS(@Proc32\szExeFile, #MAX_PATH)" ändern.
"PeekL(@Proc32 + 8)"       kannst Du direkt nutzen: "Proc32\th32ProcessID"

Re: Unicode Problem mit Kill Programm

Verfasst: 09.04.2012 14:15
von edel
Wenn du Callfunction benutzt, musst du auch die Unicodefunktionen ansprechen (in der Regel sind das die Funktionen mit dem W am Ende). So wie du es jetzt hast, rufst du in beiden Modi nur die normalen Funktionen auf.
Das kann so natuerlich nicht funktionieren.

Versuch es mal so :

Code: Alles auswählen

Procedure KillPrg(ProcessName.s) 
		
	Protected snapshot.i
	Protected prinfo.PROCESSENTRY32
	Protected pname.s	
	Protected phandle.i
	Protected pexitc.i
	
	prinfo\dwSize = SizeOf(PROCESSENTRY32)
	
	snapshot = CreateToolhelp32Snapshot_(#TH32CS_SNAPPROCESS, 0)
	
	If snapshot
		
		If Process32First_(snapshot, prinfo)
			
			Repeat
				pname = PeekS(@prinfo\szExeFile)
				
				If ProcessName = pname
					
					phandle = OpenProcess_(#PROCESS_TERMINATE, #False, prinfo\th32ProcessID) 
					
					If phandle 
						TerminateProcess_(phandle, @pexitc)						
						CloseHandle_(phandle)
					EndIf
					
				EndIf
				
			Until Process32Next_(snapshot, prinfo) = 0
			
		EndIf
		
		CloseHandle_(snapshot)
		
	EndIf
	
	
	ProcedureReturn pexitc
EndProcedure 

Re: Unicode Problem mit Kill Programm

Verfasst: 09.04.2012 14:54
von Graffiti
Danke an euch für die schnelle Hilfe

funktioniert perfekt