我注意到一个较旧的应用程序具有
Randomized Base Address
选项设置为No (/DYNAMICBASE:NO)
。 我将其更改为Yes
,然后忘记了它。 几天后回来,以调试模式运行该申请,并在几次成功的电话中发现,它坠毁在通话中。
它一直在使用旧的获取和设置方法GWLP_WNDPROC
,然后回电回到以前的
CallWindowProc(OldWndProc, hwnd, message, wparam, lparam)
中,该方法看起来位于COMCTL32.DLL.INEFUNE。 我花了一段时间来记住我已经更改了该选项,所以我将选项返回
/DYNAMICBASE:NO
SetWindowSubclass()
,这一切都恢复了正常。
最终,我只是将所有内容都更改为Yes (/DYNAMICBASE)
方法,它可以与
WndProc
.一起使用。 但是我想知道,原因是什么原因?
comctl32.dll是否随机移动,那些旧的BOOL CALLBACK MyTreeViewWndProc(HWND htv, UINT message, WPARAM wparam, LPARAM lparam)
地址不再有效? tia !!
20岁以上的代码的问题是定义了回调:
LRESULT CALLBACK MyTreeViewWndProc(HWND htv, UINT message, WPARAM wparam, LPARAM lparam)
该运行x64,返回值被切断。 应该是:
INT_PTR CALLBACK MyTreeViewWndProc(HWND htv, UINT message, WPARAM wparam, LPARAM lparam)
or
SetWindowsSubclass()
新函数允许编译器在新版本中执行回调参数的定义。