2011-10-29 19 views
6

tengo estos dos métodos para obtener la entrada del registro de viaje actual y viajar a una entrada de registro recuperado llamando al método GetTravelLogEntry:ITravelLogStg :: travelto falla con el error 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); 
    } 

El WebBrowser aquí es una. NET WebBrowser control. Cuando llamo al ITravelLogStg::TravelTo dentro del método TravelToTravelLogEntry recibo un 0x80004002, que según la página this es un error Interface not supported. ¿Estoy haciendo algo mal?

PD: Tomé la mayor parte de este código desde here.

+0

¿Has probado sin utilizar Marshal.ReleaseComObject (tlstg)? –

+0

@Simon: Acabo de probar esto, a veces falla. – Juan

Respuesta

1

Bueno, está tratando de navegar a la entrada actual en el registro de viaje que no tiene mucho sentido ya que usted ya está allí. Podría reproducir el error para este caso específico y encontrarlo no muy útil también.

Pero utilizando cualquier otra cosa, entonces 0 como primer parámetro para GetRelativeEntry y luego llamar al TravelTo funcionó como se esperaba.

ITravelLogStg :: GetRelativeEntry devuelve la entrada especificada por el desplazamiento . Un desplazamiento positivo devuelve una entrada después de la entrada actual; un offset negativo devuelve una entrada antes de la entrada actual. Zero devuelve la entrada actual.

(Fuente: MSDN)

intente modificar hr = tlstg.GetRelativeEntry(0, out ptle); - el primer parámetro especifica en qué dirección que desea navegar. Usar otros valores distintos a 0 debería funcionar, p. podrías usar -1 para viajar una entrada hacia atrás.

+0

Gracias por responder. En realidad, estoy navegando hacia una página diferente antes de llamar a 'TravelToTravelLogEntry', después de llamar a' GetTravelLogEntry'. – Juan

+0

¿Podría ser ese el problema? ¿Aferrándose a la entrada y luego navegando? Tal vez esto de alguna manera invalide la interfaz. ¿Podrías obtener la entrada después de navegar? –

+0

Bueno, no tiene una forma precisa de saber cuándo se creará una entrada (¡ni siquiera mencione el evento 'DocumentComplete'!). Entonces, realmente no sabes dónde estará la entrada que estás buscando. Lo extraño es que a veces funciona (después de navegar, siempre) y otras veces no. – Juan

0

Creo que su problema es con lo que está pasando en el método TravelTo. ¿Has intentado pasar en valores enteros para ver si puedes superar esto?

Cuestiones relacionadas