Wenn ich die Anwendung mit Delphi kompiliere gibt es kein Problem.
Lasse ich sie innerhalb der
IDE laufen gibt es keine Probleme.
Wenn ich diese aber normal starte stürzt die Anwendung beim beenden ab.
Was muss ich besonders beachten wenn ich den Hook für OpenDialog verwende.
Ohne das ich den OpenDialog starte gibt es keine Abstürze.
Der Hook.
ofn.lpfnHook := @DialogHookProc;
Die Flags.
Delphi-Quellcode:
ofn.Flags := OFN_EXPLORER
{ or OFN_ALLOWMULTISELECT } or OFN_FILEMUSTEXIST or OFN_HIDEREADONLY or OFN_PATHMUSTEXIST or
OFN_ENABLEHOOK
Übergabe der Subclass.
Delphi-Quellcode:
WM_NOTIFY:
begin
case (POFNotify(lp)^.hdr.code) of
CDN_INITDONE:
begin
DlgHandle := GetParent(WinHandle);
SubClass(DlgHandle);
Die Subclass.
Delphi-Quellcode:
procedure SubClass(WinHandle: HWND);
begin
FClientInstance := MakeObjectInstance(clProc.ClientWndProc);
FPrevClientProc := Pointer(GetWindowLong(WinHandle, GWL_WNDPROC));
SetWindowLong(WinHandle, GWL_WNDPROC, Integer(FClientInstance));
end;
procedure UnSubClass(WinHandle: HWND);
begin
SetWindowLong(WinHandle, GWL_WNDPROC, Integer(FPrevClientProc));
FreeObjectInstance(FClientInstance);
end;
Durchschleifen der Messagen.
Delphi-Quellcode:
procedure TClientWndProc.ClientWndProc(var Message: TMessage);
begin
with Message do
begin
case Msg of
WM_NOTIFY:
Result := DialogHookProc(DlgHandle, Integer(Msg), Message.WPARAM, Message.LPARAM);
WM_DRAWITEM:
Result := DialogHookProc(DlgHandle, Integer(Msg), Message.WPARAM, Message.LPARAM);
WM_PARENTNOTIFY:
Result := DialogHookProc(DlgHandle, Integer(Msg), Message.WPARAM, Message.LPARAM);
end;
if (Result = 0) then
Result := CallWindowProc(FPrevClientProc, DlgHandle, Msg, WPARAM, LPARAM)
end;
end;
Subclass beenden.
Delphi-Quellcode:
if IsOpenDialog then
begin
if GetOpenFileName(ofn) then
begin
Result := True;
FileName := StrPas(szFile);
end;
SkinEngine.DestroyWindowResource(SKDialogHandle);
if Windows.DestroyWindow(SKDialogHandle) then
Windows.UnRegisterClass(wc.lpszClassName, hInstance);
UnSubClass(DlgHandle);
DlgHandle := 0;
hDefview := 0;
end
Ich wüste jetzt nicht was da falsch läuft das es als eigenständige Anwendung zum Absturz kommt.
EDIT:
Habe jetzt mal zum testen die CommDlg eingebunden (vielleicht liegt es an der eigens zusammengestellten TOpenFilename)
Aber nein mit oder ohne Hook die Anwendung stürzt ab. (aber nicht in der
IDE)
Seltsames Problem.
gruss