Я преобразовал DLL из 32-битной в 64-битную без проблем, но когда я загружаю эту DLL из 64-битного приложения, занимающего большой объем памяти, приложение падает и закрывается при загрузке DLL.
DLL представляет собой простую форму с TWebBrowser. Я использую Delphi 10 Сиэтл.
После отладки я обнаружил проблему 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?
Нашли ли вы аналогичную проблему или обходной путь для исправления событий?
Спасибо
WebBrowserEx
этого дефекта гораздо больше. Нам очень сложно определить проблему без минимально воспроизводимого примера. Мой совет: включите распределение памяти сверху вниз на системном уровне и избавьтесь от всех дефектов. Emba ужасно плохо исправила свой сломанный 64-битный код. - person David Heffernan   schedule 27.01.2017GetWindowLong
, поскольку он реализуется путем вызоваGetWindowLongPtr
. Как иSetWindowLong
. Проблема чисто в приведении кLongint
. На самом деле вы могли бы использоватьSetWindowLong(WindowHandle, GWL_WNDPROC, LONG_PTR(@InitWndProc))
. - person David Heffernan   schedule 27.01.2017SetWindowSubclass()
равно лучше и безопаснее использовать, чемSetWindowLongPtr(GWL_WNDPROC)
- person Remy Lebeau   schedule 28.01.2017