下面是我截取的一个实现超链接功能的函数,其中有一些不解之处,请指教!
HINSTANCE CHyperLink::GotoURL(LPCTSTR url, int showcmd)
{
    TCHAR key[MAX_PATH + MAX_PATH];    // First try ShellExecute()
    HINSTANCE result = ShellExecute(NULL, _T("open"), url, NULL,NULL, showcmd);//这里是打开一个超链接,什么情况他会失败呢    // If it failed, get the .htm regkey and lookup the program
    if ((UINT)result <= HINSTANCE_ERROR) {        if (GetRegKey(HKEY_CLASSES_ROOT, _T(".htm"), key) == ERROR_SUCCESS) {
            lstrcat(key, _T("\\shell\\open\\command"));//这个路径我怎么没有在注册
表中找到            if (GetRegKey(HKEY_CLASSES_ROOT,key,key) == ERROR_SUCCESS) {
                TCHAR *pos;
                pos = _tcsstr(key, _T("\"%1\""));//这是在查找什么
                if (pos == NULL) {                     // 这又在做什么
                    pos = _tcsstr(key, _T("%1"));      // Check for %1, without quotes 
                    if (pos == NULL)                   // No parameter at all...
                        pos = key+lstrlen(key)-1;
                    else
                        *pos = '\0';                   // 加个'\0'是什么意思
                }
                else
                    *pos = '\0';                       // Remove the parameter                lstrcat(pos, _T(" "));
                lstrcat(pos, url);                USES_CONVERSION;//这句什么意思
                result = (HINSTANCE) WinExec(T2A(key),showcmd);// T2A什么意思
            }

解决方案 »

  1.   

    查找注册表 .htm 关联的打开方式,XP 好像没有这样的路径了#ifndef _DEBUG
    #define USES_CONVERSION int _convert; (_convert); UINT _acp = ATL::_AtlGetConversionACP() /*CP_THREAD_ACP*/; (_acp); LPCWSTR _lpw; (_lpw); LPCSTR _lpa; (_lpa)
    #else
    #define USES_CONVERSION int _convert = 0; (_convert); UINT _acp = ATL::_AtlGetConversionACP() /*CP_THREAD_ACP*/; (_acp); LPCWSTR _lpw = NULL; (_lpw); LPCSTR _lpa = NULL; (_lpa)
    #endif
    #define T2A W2A#define W2A(lpw) (\
    ((_lpw = lpw) == NULL) ? NULL : (\
    _convert = (lstrlenW(_lpw)+1)*2,\
    ATLW2AHELPER((LPSTR) alloca(_convert), _lpw, _convert, _acp)))

    #endif