Реализую класс для работы с историей 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);
}