ITravelLogStg :: TravelTo失败,错误0x80004002

时间:2011-10-29 20:54:51

标签: c# internet-explorer webbrowser-control mshtml

我有两种方法可以获取当前的旅行日志条目,并通过调用GetTravelLogEntry方法转到检索的日志条目:

    public static ITravelLogEntry GetTravelLogEntry(WebBrowser webBrowser)
    {
        int HRESULT_OK = 0;

        SHDocVw.IWebBrowser2 axWebBrowser = (SHDocVw.IWebBrowser2)webBrowser.ActiveXInstance;
        IServiceProvider psp = axWebBrowser as IServiceProvider;
        if (psp == null) throw new Exception("Could not get IServiceProvider.");

        IntPtr oret = IntPtr.Zero;            
        int hr = psp.QueryService(ref SID_STravelLogCursor, ref IID_ITravelLogStg, out oret);            
        if ((oret == IntPtr.Zero) || (hr != HRESULT_OK)) throw new Exception("Failed to query service.");

        ITravelLogStg tlstg = Marshal.GetObjectForIUnknown(oret) as ITravelLogStg;
        if (null == tlstg) throw new Exception("Failed to get ITravelLogStg");            
        ITravelLogEntry ptle = null;
        hr = tlstg.GetRelativeEntry(0, out ptle);
        if (hr != HRESULT_OK) MessageBox.Show("Failed to get travel log entry with error " + hr.ToString("X"));
        Marshal.ReleaseComObject(tlstg);
        return ptle;
    }

    public static void TravelToTravelLogEntry(WebBrowser webBrowser, ITravelLogEntry travelLogEntry)
    {
        int HRESULT_OK = 0;

        SHDocVw.IWebBrowser2 axWebBrowser = (SHDocVw.IWebBrowser2)webBrowser.ActiveXInstance;
        IServiceProvider psp = axWebBrowser as IServiceProvider;
        if (psp == null) throw new Exception("Could not get IServiceProvider.");

        IntPtr oret = IntPtr.Zero;
        int hr = psp.QueryService(ref SID_STravelLogCursor, ref IID_ITravelLogStg, out oret);
        if ((oret == IntPtr.Zero) || (hr != HRESULT_OK)) throw new Exception("Failed to query service.");

        ITravelLogStg tlstg = Marshal.GetObjectForIUnknown(oret) as ITravelLogStg;
        if (null == tlstg) throw new Exception("Failed to get ITravelLogStg");            
        hr = tlstg.TravelTo(travelLogEntry);
        if (hr != HRESULT_OK) MessageBox.Show("Failed to travel to log entry with error " + hr.ToString("X"));
        Marshal.ReleaseComObject(tlstg);
    }

这里的WebBrowser是一个.NET WebBrowser控件。在ITravelLogStg::TravelTo方法中调用TravelToTravelLogEntry时,我收到的是0x80004002,根据this页面的错误是Interface not supported。我做错了吗?

PD:我从here获取了大部分代码。

2 个答案:

答案 0 :(得分:1)

那么你正试图导航到旅行日志中的当前条目,因为你已经在那里没有多大意义。我可以为这个特定情况重现错误,并发现它也没有用。

但是使用其他任何内容然后0作为GetRelativeEntry的第一个参数,然后调用TravelTo按预期工作。

  

ITravelLogStg :: GetRelativeEntry返回由...指定的条目   偏移。正偏移量返回当前条目后的条目;一个   负偏移量返回当前条目之前的条目。零   返回当前条目。

(资料来源:MSDN

尝试修改hr = tlstg.GetRelativeEntry(0, out ptle); - 第一个参数指定您要导航的方向。使用除0以外的其他值应该起作用,例如你可以使用-1向后移动一个条目。

答案 1 :(得分:0)

我认为您的问题在于您传递给TravelTo方法的内容。您是否尝试过普通的整数值来查看是否可以通过它?