Я преобразовал DLL с 32-битного в 64-разрядный без проблем, но когда я загружаю эту DLL из 64-разрядного приложения, которое занимает большой объем памяти, приложение падает и закрывается при загрузке DLL.Delphi 64-разрядная DLL: проблемы с событиями OleCtrls
DLL - это простая форма с TWebBrowser на нем. Я использую Delphi 10 Seattle.
После отладки я обнаружил проблему в 64 разрядное преобразование в блоке VCL «Vcl.OleCtrls.pas» решена таким образом:
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;
Это решает проблему аварии, но TWebBrowser события не стреляли больше и происходит только на 64-битной основе.
Как исправить события TWebBrowser firig?
У вас есть аналогичная проблема или workaroud для исправления событий?
Благодаря
В этом разделе есть проблема с этим дефектом в 'WebBrowserEx'. Очень сложно идентифицировать проблему без [mcve]. Мой совет заключается в том, что вы разрешаете распределение памяти сверху вниз на системном уровне и устраняете все дефекты. Emba были ужасно плохи в исправлении их сломанного 64-битного кода. –
FWIW, вам не нужно менять 'GetWindowLong', поскольку он реализуется, вызывая' GetWindowLongPtr'. Как и 'SetWindowLong'. Проблема в том, что это просто приведение к «Longint». Фактически вы могли бы использовать 'SetWindowLong (WindowHandle, GWL_WNDPROC, LONG_PTR (@InitWndProc))'. –
['SetWindowSubclass()'] (https://msdn.microsoft.com/en-us/library/windows/desktop/bb762102.aspx) [лучше и безопаснее] (https://blogs.msdn.microsoft. com/oldnewthing/20031111-00 /? p = 41883) для использования, чем 'SetWindowLongPtr (GWL_WNDPROC)' –