BHO-嵌入资源管理器窗口(64位)

http://blog.csdn.net/ryanbanks/article/details/45868549   最初版本,32位。

 

在32位基础上,修改实现64位机器上的功能实现。

关键点:

1.vs编译时,解决方案平台需设置为64位编译。必须设为64位编译,才能在64位机器上运行,否则无法加载。

2.代码调整。

替换窗口过程函数中,获取原窗口过程函数时,

32位使用【WNDPROC oldWndProc =(WNDPROC)::GetWindowLong(m_hWndShellView, GWL_WNDPROC);//获取原窗口过程】,64位时,需修改为【WNDPROC oldWndProc = (WNDPROC)::GetWindowLongPtr(m_hWndShellView, GWLP_WNDPROC);//获取原窗口过程】

用GetWindowLongPtr 替换 GetWindowLong。 否则在64位下,GetWindowLong获取到的窗口过程函数地址是0.

替换窗口过程函数时,

32位使用【SetWindowLong((HWND)m_hWndShellView, GWL_WNDPROC, (LONG)BrowserWndProc);//替换窗口过程】,64位需修改为【SetWindowLong((HWND)m_hWndShellView, GWL_WNDPROC, (LONG)BrowserWndProc);//替换窗口过程】

 

在实现我们的窗口过程函数:

staticLRESULT CALLBACK BrowserWndProc(HWND hWnd,

              UINT uMsg,

              WPARAM wParam,

        LPARAMlParam);

中,实现功能后都会调用原窗口过程函数一次,即【CallWindowProc(pfnOldWndProc,hWnd, uMsg, wParam, lParam);//调用原窗口过程】。使用这句话的时候,就是在返回时,即【return CallWindowProc(pfnOldWndProc,hWnd, uMsg, wParam, lParam);//调用原窗口过程】。否则被拆分的资源管理器会获取不到焦点,即资源管理器只能看不能用。

 

 

 

 

你可能感兴趣的:(VS)