J'ai converti une DLL de 32 bits en 64 bits sans problème, mais quand je charge cette DLL à partir d'une application 64 bits qui occupe une grande quantité de mémoire l'application se bloque et se ferme lorsque la DLL est chargée.Delphi 64 bits DLL: OleCtrls problèmes d'événements
La DLL est une forme simple avec un TWebBrowser dessus. J'utilise Delphi 10 Seattle.
Après le débogage j'ai trouvé un problème de conversion 64 bits dans l'unité de vlc « Vcl.OleCtrls.pas » résolus de cette façon:
procedure TOleControl.HookControlWndProc;
var
WndHandle: HWnd;
begin
if (FOleInPlaceObject <> nil) and (WindowHandle = 0) then
begin
WndHandle := 0;
FOleInPlaceObject.GetWindow(WndHandle);
if WndHandle = 0 then raise EOleError.CreateRes(@SNoWindowHandle);
WindowHandle := WndHandle;
//DefWndProc := Pointer(GetWindowLong(WindowHandle, GWL_WNDPROC));//OLD
DefWndProc := Pointer(GetWindowLongPtr(WindowHandle, GWL_WNDPROC));
CreationControl := Self;
//SetWindowLong(WindowHandle, GWL_WNDPROC, Longint(@InitWndProc));//OLD
SetWindowLongPtr(WindowHandle, GWL_WNDPROC, LONG_PTR(@InitWndProc));
SendMessage(WindowHandle, WM_NULL, 0, 0);
end;
end;
Cela résout le problème de l'accident, mais les événements TWebBrowser ne sont pas déclenchés plus et arrive sur 64bit seulement.
Comment réparer les événements TWebBrowser?
Avez-vous trouvé un problème similaire ou un problème de travail pour résoudre des événements?
Merci
Il y a une charge plus de ce défaut dans 'WebBrowserEx'. Très difficile pour nous d'identifier le problème sans [mcve]. Mon conseil est que vous activez l'allocation de mémoire descendante au niveau du système et éliminez tous les défauts. Emba a été terriblement mauvais à réparer leur code 64 bits cassé. –
FWIW, vous n'avez pas besoin de changer 'GetWindowLong' car il est implémenté en appelant' GetWindowLongPtr'. Comme 'SetWindowLong'. Le problème est purement le casting à «Longint». En fait vous auriez pu utiliser 'SetWindowLong (WindowHandle, GWL_WNDPROC, LONG_PTR (@InitWndProc))'. –
['SetWindowSubclass()'] (https://msdn.microsoft.com/en-us/library/windows/desktop/bb762102.aspx) est [mieux et plus sûr] (https://blogs.msdn.microsoft. com/oldnewthing/20031111-00 /? p = 41883) à utiliser que SetWindowLongPtr (GWL_WNDPROC) ' –