我先后装了Visual C++ 和MSDN Library (July 2005). 请问如何正确关联VC和MSDN?
也就是在VC中按F1正确跳转到NSDN library.
也就是在VC中按F1正确跳转到NSDN library.
解决方案 »
- 关于MFC数据库应放在文件夹哪个位置的问题
- VC6.0调用VS 2005动态库
- 控件,组件和构件
- 怎么动态生成picture控件,然后设置位图?谢谢
- 自己写一个通用的串口类值不值?
- 在打印时怎样换行?在线等候!
- 我昨天通过OICQ显IP版找了几十个IP,可是发现绝大多数都是假的,ping失败,不知道为什么?
- 关于把文本写入编辑框中的问题!
- 如何使TreeCtrl和ListCtrl的图标颜色变淡?
- 还是关于send返回值的问题
- ~~~~~想做一个在网页上播放自定义文件格式文件的ACTIVEX,请大家给些建议~~~~
- 500分求HTML编程实例!取IE内核浏览器中显示的所有文字,替换某些字符串后,再显示!
没有其它办法,是不是要修改某个registry键值啊?
我的也和楼主一样
当时我把注册表和tools->help system都统统试了几次,都失败了
最后只能单独使用MSDN了
要不你就装配套的MSDN
VC6的要用2001年10最后版的才能关联
我找了一个星期,终于找到这个版本了,lol,
共享一下,bt下载,速度还不错,种子很稳定
http://bbs.btchina.net/showthread.php?threadid=713857
http://howard.whxr.com/FILES/VS6MSDN
楼主要找2001年或者以前发布的MSDN,安装后会自动关联的。
After Oct. 2001, you cannot get help by pressing F1 in VC6 with latest MSDN. Microsoft has changed the help format from CHM to document explorer.Is it possible to use the latest MSDN in VC6?
The answer is YES!
Details
First, we must know how VC6 brings up the help after you press F1. This is easy if you have a debugger such as Soft-ICE.If you don't install MSDN, after you press F1, VC6 will popup a message box which says you haven't installed MSDN. Set a breakpoint at MessageBox. Press F1 and the debugger will popup. Look at the stack. You will see this function was called from "C:\Program Files\Common Files\Microsoft Shared\VS98\vshelp.dll".Then we use Dependency Walker ("depends" in Visual Studio Tools) to see what functions are exported. We will see DllRegisterServer and DllUnregisterServer. It's obviously a COM.Use VC6 to create a simple console project. Add the following line to your .cpp file.#import "C:\Program Files\Common Files\Microsoft Shared\VS98\vshelp.dll"
And build your project. Open the Debug directory, and you will find "vshelp.tlh" and "vshelp.tli". Open "vshelp.tlh", you will see:struct __declspec(uuid("854d7ac0-bc3d-11d0-b421-00a0c90f9dc4"))
IVsHelpSystem : IUnknown
{
//
// Wrapper methods for error-handling
// HRESULT KeywordSearch (
LPWSTR pszKeyword,
long dwFlags,
long dwReserved );
HRESULT ALinkSearch (
LPWSTR pszALink,
long dwFlags,
long dwReserved );
...
The function KeywordSearch was called when you press F1. So if we replace this function and call the latest MSDN's help function, it should work.Then how to do this? Since it's a COM interface, it's easy to hook it.Basically a COM interface is a C++ class with a virtual table. It has a pointer to a table that contains the address of all virtual functions. And this table is shared by all instances. So we only need to change the function address in the table. And this interface will look like:struct _IVsHelpSystemVtbl{
HRESULT (STDMETHODCALLTYPE *QueryInterface)(IUnknown * This,
REFIID riid, void **ppvObject);
ULONG (STDMETHODCALLTYPE *AddRef)(IUnknown * This);
ULONG (STDMETHODCALLTYPE *Release)(IUnknown * This);
HRESULT (STDMETHODCALLTYPE *KeywordSearch)(IUnknown * This,
LPWSTR pszKeyword, long dwFlags, long dwReserved);
};struct _IVsHelpSystem
{
struct _IVsHelpSystemVtbl *lpVtbl;
};
What we need to do now is create an instance of this COM. And we will get the address of the table. Now we need to know how to bring up the help of the latest MSDN. It seems it's not documented. It's also a COM.Add the following line to your .cpp file. You will get the COM definition.#import "C:\Program Files\Common Files\Microsoft Shared\MSEnv\vshelp.tlb"
In "vshelp.tlh", you can find function:HRESULT DisplayTopicFromF1Keyword ( _bstr_t pszKeyword );
Obviously, this is what we need. So in the function KeywordSearch, call DisplayTopicFromF1Keyword which will launch the latest MSDN.Here is the code to hook the function KeywordSearch:HRESULT hr = theHelp.CreateInstance(__uuidof(VsHelp::DExploreAppObj));
if (SUCCEEDED(hr))
{
HRESULT hr = vc6Help.CreateInstance(
__uuidof(VsHelpServices::VsHelpServices));
if (SUCCEEDED(hr))
{
iHelp = (_IVsHelpSystem *)vc6Help.GetInterfacePtr(); TRACE1("iHelp = %x\n", iHelp);
TRACE1("lpVtbl = %x\n", iHelp->lpVtbl);
TRACE1("KeywordSearch = %x\n", iHelp->lpVtbl->KeywordSearch); OldKeywordSearch = iHelp->lpVtbl->KeywordSearch; DWORD dwOldProtect;
if (VirtualProtect(iHelp->lpVtbl, sizeof(
_IVsHelpSystemVtbl), PAGE_READWRITE, &dwOldProtect))
iHelp->lpVtbl->KeywordSearch = MyKeywordSearch;
}
}
mail to me: [email protected]