Unicode Problem mit Kill Programm

Für allgemeine Fragen zur Programmierung mit PureBasic.
Graffiti
Beiträge: 173
Registriert: 30.08.2004 08:34
Wohnort: Thailand

Unicode Problem mit Kill Programm

Beitrag 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

Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Unicode Problem mit Kill Programm

Beitrag 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"
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: Unicode Problem mit Kill Programm

Beitrag 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 
Graffiti
Beiträge: 173
Registriert: 30.08.2004 08:34
Wohnort: Thailand

Re: Unicode Problem mit Kill Programm

Beitrag von Graffiti »

Danke an euch für die schnelle Hilfe

funktioniert perfekt
Antworten