ITravelLogStg :: TravelTo завершается с ошибкой 0x80004002 - PullRequest
6 голосов
/ 30 октября 2011

У меня есть два этих метода, чтобы получить текущую запись в журнале путешествий и перейти к записи в журнале, полученной с помощью метода 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, что согласно этой странице является ошибкой Interface not supported.Я что-то не так делаю?

PD: большую часть этого кода я взял у здесь .

Ответы [ 2 ]

1 голос
/ 02 ноября 2011

Ну, вы пытаетесь перейти к текущей записи в журнале путешествий, которая не имеет особого смысла, так как вы уже там.Я мог бы воспроизвести ошибку для этого конкретного случая и найти ее не очень полезной.

Но используя что-то еще, кроме 0, в качестве первого параметра для GetRelativeEntry, а затем вызов TravelTo сработал, как и ожидалось.

ITravelLogStg :: GetRelativeEntry возвращает запись, указанную в смещении.Положительное смещение возвращает запись после текущей записи;отрицательное смещение возвращает запись перед текущей записью.Ноль возвращает текущую запись.

(Источник: MSDN )

Попробуйте изменить hr = tlstg.GetRelativeEntry(0, out ptle); - первый параметр указывает, в каком направлении вы хотите перемещаться.Использование других значений, отличных от 0, должно работать, например, вы можете использовать -1, чтобы переместиться на одну запись назад.

0 голосов
/ 08 ноября 2011

Я думаю, что ваша проблема в том, что вы передаете методу TravelTo. Вы пытались передать простые целочисленные значения, чтобы посмотреть, сможете ли вы обойти это?

...