![]() |
Pointerübergabe an Thread -> Adresse richtig, Inhalt fals
Hallo,
folgendes Problem: Diese Datenstruktur:
Delphi-Quellcode:
wird in meinem Hauptprogramm (nonVCL) in der WndProc an einen Thread übergeben:
type TDeviceInfo = packed record
PIDL: PItemIDList; GUID: PGUID; Result: boolean; end; PDeviceInfo = ^TDeviceInfo (Hier ist DeviceInfo sauber belegt!)
Delphi-Quellcode:
Die Threadfunktion liegt in einer anderen Unit. Die Unit kennt PDeviceChange natürlich auch.
...
var DeviceInfo: PDeviceInfo; ... function WndProc(wnd: HWND; uMsg: UINT; wp: WPARAM; lp: LPARAM): LRESULT; stdcall; begin Result := 0; case uMsg of WM_CREATE: ... WM_DEVICECHANGE: begin DeviceInfo := CheckWMDeviceChange(wnd,UINT(wp),Pointer(lp)); if DeviceInfo.Result then begin if assigned(DeviceInfo^.GUID) then begin BeginThread(nil,0,@CheckGuid,DeviceInfo,0,ThreadID); end else BeginThread(nil,0,@CheckPIDL,DeviceInfo,0,ThreadID); ... Ich habe keine Fehlermeldung zur Designzeit!
Delphi-Quellcode:
Wenn ich nun zur Laufzeit den Pointer Info auswerte, zeigt er genau auf die gleiche Adresse, wie DeviceInfo aus der Hauptroutine. DevInfo aus der Threadfunktion zeigt nach der Zuweisung auch auf die gleiche Adresse (ist ja logisch), ABER wenn ich mir dann die Strukur von DevInfo anschaue sind die Daten alle zerstört.
function CheckGUID(Info: pointer): integer;
var DevInfo: PDeviceInfo; begin if(CoInitialize(nil) = S_OK) then try DevInfo := Info; if SHGetMalloc(Allocator) = NOERROR then begin ..... //gekürzt da unwichtig end; Allocator.Free(PIDL); end; end; end; finally CoUnInitialize; end; end; Wird die Strukur wohlmöglich im Hauptprogramm wieder freigegeben, bevor ich meine notwendigen Zugriffe gemacht habe ?? Ich habe auch schon eine Flag gesetzt, so dass nur ein thread gestartet wird, hat auch nicht geholfen. |
Re: Pointerübergabe an Thread -> Adresse richtig, Inhalt
Zitat:
|
Re: Pointerübergabe an Thread -> Adresse richtig, Inhalt
CheckWMDeviceChange kann nie nil zurückgeben. Ich lasse CheckWMDeviceChange jetzt einen TDeviceChange zurückgeben und gebe einen Pointer auf diese Struktur dann an die Threadfunktion. Das klappt! :)
Hast du eine Idee, wie ich ich es hinbekomme, dass das globale DeviceInfo erst überschrieben wird, wenn der Thread der die Infos bekommen hat, diese in seine lokalen Variablen kopiert hat und diese somit nicht mehr vernudelt werden ? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:17 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