2011-10-29 40 views
6

Tôi có hai phương pháp để có được mục log du lịch hiện nay và đi đến một mục log lấy ra bằng cách gọi phương pháp GetTravelLogEntry:ITravelLogStg :: TravelTo thất bại với lỗi 0x80004002

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); 
    } 

Các WebBrowser ở đây là a. NET WebBrowser kiểm soát. Khi gọi ITravelLogStg::TravelTo bên trong phương thức TravelToTravelLogEntry Tôi nhận được 0x80004002, theo trang this là lỗi Interface not supported. Tôi có làm điều gì sai?

PD: Tôi đã lấy hầu hết mã này từ here.

+0

Bạn đã thử mà không thực hiện Marshal.ReleaseComObject (tlstg) chưa? –

+0

@Simon: Tôi vừa thử điều này, đôi khi nó vẫn thất bại. – Juan

Trả lời

1

Bạn đang cố gắng điều hướng đến mục nhập hiện tại trong nhật ký du lịch không có ý nghĩa nhiều như bạn đã ở đó. Tôi có thể tạo lại lỗi cho trường hợp cụ thể này và thấy nó cũng không hữu ích lắm.

Nhưng sử dụng bất kỳ thứ gì khác thì 0 làm thông số đầu tiên cho GetRelativeEntry và sau đó gọi số TravelTo hoạt động như mong đợi.

ITravelLogStg :: GetRelativeEntry trả về mục nhập được chỉ định bởi khoản bồi hoàn . Một bù đắp dương trả về một mục nhập sau mục nhập hiện tại; a offset âm trả về một mục nhập trước mục nhập hiện tại. Zero trả về mục nhập hiện tại.

(Nguồn: MSDN)

Hãy thử thay đổi hr = tlstg.GetRelativeEntry(0, out ptle); - các tham số đầu tiên xác định theo hướng nào bạn muốn di chuyển. Sử dụng các giá trị khác hơn 0 sẽ hoạt động, ví dụ: bạn có thể sử dụng -1 để di chuyển một mục trở lại.

+0

Cảm ơn bạn đã trả lời. Thực ra, tôi đang điều hướng đến một trang khác trước khi gọi 'TravelToTravelLogEntry', sau khi gọi 'GetTravelLogEntry'. – Juan

+0

Có thể đó là vấn đề? Giữ mục nhập và sau đó điều hướng? Có lẽ điều này bằng cách nào đó làm mất hiệu lực giao diện. Bạn có thể nhận được mục nhập sau khi điều hướng không? –

+0

Vâng, bạn không có một cách chính xác để biết khi một mục sẽ được tạo ra (thậm chí không đề cập đến sự kiện 'DocumentComplete'!). Vì vậy, bạn không thực sự biết nơi mà bạn đang tìm kiếm sẽ được. Điều kỳ lạ là đôi khi nó hoạt động (sau khi điều hướng, luôn luôn) và đôi khi không. – Juan

0

Tôi nghĩ vấn đề của bạn là với những gì bạn đang chuyển sang phương thức TravelTo. Bạn đã thử vượt qua các giá trị số nguyên đơn giản để xem liệu bạn có thể vượt qua điều này không?

Các vấn đề liên quan