C++-href为相对路径时,用IHTMLElement::getAttribute()获取url的问题

小组聊天灌水 小组聊天灌水 主题:993 回复:2175

C++-href为相对路径时,用IHTMLElement::getAttribute()获取url的问题

灵芸 发布于 2017-04-14 字数 230 浏览 1372 回复 3

当href为“#”或者相对路径时,有什么办法获得它的绝对路径呢?用IHTMLElement::getAttribute()没办法达到效果,不知道还有什么办法获得绝对路径的url。或者有什么办法可以在OnNewWindow2这个method取得将要打开的url。谢谢!!!

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

支持 Markdown 语法,需要帮助?

评论(3

泛泛之交 2017-10-11 3 楼

在OnNewWindow2中获取href为相对路径时的值的想法暂时放弃了,改变了一下策略,在OnNewWindow2中将ppDisp重定向于一个新的Frame上,代码如下(代码来源于网络,经测试可行):

m_NewWindow = 2;
CWinApp* pApp = AfxGetApp();
CDocTemplate* pDocTemplate;
POSITION pos = pApp->GetFirstDocTemplatePosition();
pDocTemplate = pApp->GetNextDocTemplate(pos);

ASSERT(pDocTemplate);

CFrameWnd* tmp = (CFrameWnd*)::AfxGetMainWnd();
CFrameWnd* pNewFrame = pDocTemplate->CreateNewFrame(GetDocument(),
(CFrameWnd*)AfxGetMainWnd());
ASSERT(pNewFrame);

m_pNewFrame = pNewFrame;

pDocTemplate->InitialUpdateFrame(pNewFrame, NULL);
CMfcieView* pWBVw = (CMfcieView*)pNewFrame->GetActiveView();
ASSERT(pWBVw);
pWBVw->SetRegisterAsBrowser(TRUE);
*ppDisp = pWBVw->GetApplication();

然后在OnBeforeNavigate2中获取对应的URL。因为两个窗口在同一个进程内,所以m_NewWindow作为一个全局int标记,每进入一次OnBeforeNavigate2自减1。而目标URL出现第二次进入OnBeforeNavigate2时,所以当m_NewWindow等于1时的URL即为目标URL,代码如下:

void CXXXView::OnBeforeNavigate2(LPCTSTR lpszURL, DWORD /nFlags/,
LPCTSTR /lpszTargetFrameName/, CByteArray& /baPostedData/,
LPCTSTR /lpszHeaders/, BOOL* pbCancel)
{

if(m_NewWindow == 2)
{
    -- m_NewWindow;
    *pbCancel = VARIANT_TRUE;
}
else if(m_NewWindow == 1)
{
    m_NewWindow = 0;
    AfxMessageBox(lpszURL);
    *pbCancel = VARIANT_TRUE;
}

}

但此方法存在缺陷为会出现一个空白窗体,窗体的CFrameWnd指针为第一段代码中的m_pNewFrame,关键在于不能通过SendMessage发送WM_CLOSE或者WM_COMMAND(ID_FILE_CLOSE)和调用Destroy()来关闭窗口,因此只能隐藏掉(伴随有闪烁,以及New Frame的资源要直到父窗体的关闭才能得以释放的结果)。

晚风撩人 2017-10-10 2 楼

相对路径的话当然只能结合当前路径来解析了。用location.href之类的属性获取当前的绝对路径。
如果是用C#的话,可以直接用System.Uri来解析:
Uri absolute = new Uri(currentUri, relativePath);
C++的话,如果不用第三方库,那就只能自己解析了。
好在合法的URL格式是比较明确比较简单的:
而相对路径就没有前面的部分,后面是一样的:
[用/分隔的路径]?[查询字符串QueryString]#[锚Anchor]
相对路径合法时,从相对路径出发有这样几种情况:
1.相对路径以#开头
这表示相对路径只包含Anchor,于是将绝对路径中的Anchor的部分移除,附上相对路径(包含#在内)

2.相对路径为空
这种情况下,相对路径指向当前文件(包含QueryString),但不包含Anchor。所以将绝对路径中的Anchor部分移除即可。

3.相对路径以?开头
这表示相对路径只包含QueryString和Anchor,将绝对路径的QueryString和Anchor移除,附上相对路径(从?开始)

4.相对路径以/开头
这表示相对路径包含了从域名根出发的路径,移除当前路径中整个路径开始的部分,替换成相对路径/后面的内容。如果需要结果准确,还需要处理替换后路径中的.和..目录,方法和下面相同。

3.其他
这表示相对路径包含了从当前目录出发的相对路径,处理方法和处理文件路径类似,方法如下:
首先从绝对路径中找到最后一个/,去掉之后的内容。
将相对路径中的目录、文件名依次附在路径后面,用/隔开。
有两种情况需要特殊处理:
目录名为. 既包括两个/中间的,也包括最后一段不以/结束的。.目录代表当前目录,因此出现时将这一段去掉即可。如果有后缀的/和后缀的一起去掉;前面一个/保留。
目录名为.. 既包括两个/中间的,也包括最后一段不以/结束的。..目录代表父目录,出现时将当前路径(不包括域名)中最后一个目录去掉。如果当前路径已经是域名根了,则忽略这个..
如果最后有?开头的QueryString和可能的Anchor,附在最后。

整个过程应该不算很复杂。但直接用Path*之类的函数处理会出错,建议用自己专门写的程序或者第三方的专门处理URI的程序。

灵芸 2017-08-12 1 楼

windows api中有 针对URL设计的相对路径转化为绝对路径
InternetCombineUrl
用法自己查 很简单
同样试用于web以外的路径表示