Hallo,
folgendes Problem:
Diese Datenstruktur:
Delphi-Quellcode:
type TDeviceInfo =
packed record
PIDL: PItemIDList;
GUID: PGUID;
Result: boolean;
end;
PDeviceInfo = ^TDeviceInfo
wird in meinem Hauptprogramm (
nonVCL) in der WndProc an einen Thread übergeben:
(Hier ist DeviceInfo sauber belegt!)
Delphi-Quellcode:
...
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);
...
Die Threadfunktion liegt in einer anderen
Unit. Die
Unit kennt PDeviceChange natürlich auch.
Ich habe keine Fehlermeldung zur Designzeit!
Delphi-Quellcode:
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;
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.
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.