![]() |
Handle als Pointer übergeben.
Also ich habe eine Thread-Funktion:
Delphi-Quellcode:
Diese soll den primären Thread des Prozesses anhalten. Als Parameter kann ich nur einen Pointer übergeben. Und es muß der Hnadle des primären Threads sein.
function SecondaryThread(p: Pointer): Integer;
var Thread: THandle; s: string; begin result := 0; Thread := THandle(p); SuspendThread(Thread); s := 'Der primäre Thread [' + IntToStr(Thread) + '] wurde unterbrochen.' + #13#10; s := s + 'Er reagier weder auf Eingaben noch hat er eine Ausgabe.' + #13#10; s := s + 'Klicken sie OK, um zum primären Thread zurück zukehren '; s := s + 'und den sekundären Thread zu beenden.'; Messagebox(hApp, pointer(s), 'Sekundärer Thread', MB_ICONWARNING); ResumeThread(Thread); CloseHandle(Thread); EnableWindow(hApp, True); end; Ich habe das bis jetzt so probiert:
Delphi-Quellcode:
In der Messagebox sehe ich auch einen Handle bzw. eine Zahl, nur scheint das nicht das Handle des primären Threads des Prozesses zu sein, da der Thread nicht angehlaten wird.
New(PrimaryThreadhandle);
DuplicateHandle(GetCurrentProcess(), GetCurrentThread(), GetCurrentProcess(), PrimaryThreadHandle, THREAD_SUSPEND_RESUME, False, DUPLICATE_SAME_ACCESS); ThreadHandle := BeginThread(nil, 0, @SecondaryThread, PrimaryThreadHandle, 0, ThreadID); if ThreadHandle <> 0 then begin EnableWindow(hDlg, False); Dispose(PrimaryThreadHandle); CloseHandle(ThreadHandle); end; PrimaryThreadHandle habe ich wie folgt deklariert:
Delphi-Quellcode:
Wie übergebe ich jetzt also den Handle als Pointer?
PrimaryThreadHandle: PHandle;
|
Re: Handle als Pointer übergeben.
Du deklarierst erst die Variablen:
Delphi-Quellcode:
Und erhältst dann so den Pointer auf Dein Handle.
var
ThreadHandle: THandle; PThreadHandle: ^THandle;
Delphi-Quellcode:
PThreadHandle übergibst Du dann.
begin
ThreadHandle := THandle(p); PThreadHandle := @ThreadHandle; ... [EDIT: Tippser entfernt] |
Re: Handle als Pointer übergeben.
Äääh :?
Du willst einen Zeiger auf ein Handle übergeben, schön und gut. Aber in der SecondThread-Funktion castest du den Pointer in ein Handle, allerdings ohne ihn zu dereferenzieren. Du hast also dann in deiner Variablen nicht das Handle, sondern die Adresse des Handles. |
Re: Handle als Pointer übergeben.
@Chewie: OK Und wie mache ich das dann richtig?
|
Re: Handle als Pointer übergeben.
Ich würd mal sagen, so:
Delphi-Quellcode:
Handle := THandle(p^);
|
Re: Handle als Pointer übergeben.
Mit
Delphi-Quellcode:
sollte es eigentlich gehen.
Thread := THandle(p^);
[EDIT: ersten war Chewie schneller und zweitens kommt das ^ tatsächlich hinter das p, nicht davor :oops: ] |
Re: Handle als Pointer übergeben.
Scheint immer noch nicht das Handle vom Thread zu sein. Ich bekomme auch jedes mal die gleiche Zahl zu Gesicht, was ja eigentlich nicht sein kann.
|
Re: Handle als Pointer übergeben.
Bei der erten version von Phoenix bekomme ich folgende fehlermeldung bei DuplicateHandle:
Zitat:
|
Re: Handle als Pointer übergeben.
Du übergibst auch direkt das Handle, und nicht einen Pointer auf das Handle:
ThreadHandle := BeginThread(nil, 0, @SecondaryThread, @PrimaryThreadHandle, 0, ThreadID); Somit übergibst Du tatsächlich einen Pointer, den Du dann mit p^ dereferenzieren kannst und das Handle erhältst. |
Re: Handle als Pointer übergeben.
Das war's. :spin:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:06 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz