ITravelLogStg
От: G2 Ниоткуда  
Дата: 15.01.07 13:58
Оценка:
Реализую класс для работы с историей WebControl'a, через ITravelLogStg.
Указатель на ITravelLogStg я получил(не уверен, что правильно), пытаюсь вызвать его методы получаю либо неверный результат, либо exception(см. код.). Что я не так делаю?


    [ComImport]
    [Guid("6d5140c1-7436-11ce-8034-00aa006009fa")]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    public interface IServiceProvider
    {
        void QueryService(ref Guid guidService, ref Guid riid,
            [Out, MarshalAs(UnmanagedType.Interface)] out object ppvObject);
    }

    public BrowserHistory(System.Windows.Forms.WebBrowser webBrowser)
    {
        if (webBrowser == null)
            throw new ArgumentNullException("Параметр webBrowser не проинициализирован");
        
        Guid SID_STravelLogCursor = new Guid("7EBFDD80-AD18-11d3-A4C5-00C04F72D6B8");
        Guid IID_ITravelLogStg = typeof (ITravelLogStg).GUID;
        
        SHDocVw.IWebBrowser2 axWebBrowser = null;

        IServiceProvider pISP = null;            

        axWebBrowser = (SHDocVw.IWebBrowser2)webBrowser.ActiveXInstance;

        pISP = (IServiceProvider) axWebBrowser;
        bool t = axWebBrowser.Visible;
        
        object ppvObject = null;
        pISP.QueryService(ref SID_STravelLogCursor, ref IID_ITravelLogStg, out ppvObject);
        _travelLogStg = (ITravelLogStg) ppvObject;
    }

        /// <summary>
        /// Возвращает количество записей
        /// </summary>
        /// <param name="flag">Значение TLENUMF</param>
        /// <returns>Количество записей</returns>
        public int GetCount(TLENUMF flag)
        {
            int result;
            _travelLogStg.GetCount(flag, out result);
            //Возвращает неверное значение, result очень большое полож. число
            return result;
        }

        /// <summary>
        /// Возвращает список доступных TravelLogEntry
        /// </summary>
        /// <param name="flags">Flag from the TLENUMF enumerated type that defines the enumerator</param>
        /// <param name="maxEntries">Количество экземпляров TravelLogEntry</param>
        /// <returns>Список экземпляров TravelLogEntry</returns>
        public IList<TravelLogEntry> EnumEntries(TLENUMF flags, int maxEntries)
        {
            List<TravelLogEntry> travelLogEntries = new List<TravelLogEntry>();
            IEnumTravelLogEntry enumTravelLogEntry = null;
            //Падает с System.AccessViolationException was unhandled
  Message="Attempted to read or write protected memory. This is often an indication that other memory is corrupt."
            if (_travelLogStg.EnumEntries(flags, out enumTravelLogEntry) == S_FALSE) return null;
        }

    [ComImport()]
    [ComVisible(false)]
    [Guid("7EBFDD80-AD18-11d3-A4C5-00C04F72D6B8")]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    public interface ITravelLogStg
    {

         //Some code

        [PreserveSig]
        int EnumEntries([In(), MarshalAs(UnmanagedType.U4)] TLENUMF flags,
                        [Out(), MarshalAs(UnmanagedType.Interface)] out IEnumTravelLogEntry ppenum);


        [PreserveSig]
        int GetCount([In(), MarshalAs(UnmanagedType.U4)]TLENUMF flags, 
                     [Out(), MarshalAs(UnmanagedType.U4)] out int pcEntries);
    }
Улыбаемся и машем :-)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.