Помогите разобраться с интерфейсом IAccessible. Нашел С++ код и решил перевести на C# в итоге ничего хорошего не вышло. код C++ работает отлично, а на C# выдает ошибку. Ниже приведены коды на C++ и C#
#include "oleacc.h" //IAccessible
#include "atlbase.h" //QueryService
#include "atlcom.h"
#include "shlguid.h" //? SID_SWebBrowserApp, SID_STopLevelBrowser
#include "mshtml.h" //IHTMLDocument2, IID_IHTMLElement
HWND hwnd = (HWND)(0x00020784);
BSTR mainstrex;
long maincount;
int _tmain(int argc, _TCHAR* argv[])
{
HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
if(hr == S_OK)
{
IAccessible *iAcc;
hr = AccessibleObjectFromWindow(hwnd, /*OBJID_WINDOW*/OBJID_CLIENT, IID_IAccessible, (void**)&iAcc);
if(hr == S_OK)
{
VARIANT va;
va.vt = VT_I4;
va.lVal = 1;
hr = iAcc->get_accChild(va, (IDispatch**)&iAcc);
if(hr == S_OK)
{
hr = iAcc->get_accChild(va, (IDispatch**)&iAcc);
if(hr == S_OK)
{
hr = iAcc->get_accChild(va, (IDispatch**)&iAcc);
if(hr == S_OK)
{
long lCount;
hr = iAcc->get_accChildCount(&lCount); // lCount равняется 2 - ошибки не вощникает в отличае от C#
if(hr == S_OK)
{
TCHAR *szCount = new TCHAR[256];
_ltow(lCount, szCount, 10);
MessageBox(NULL, szCount, L"ChildCount", MB_OK|MB_ICONASTERISK);
BSTR bstrName;
for(int i = 1; i <= lCount; i++)
{
va.lVal = i;
hr = iAcc->get_accName(va, &bstrName); // Тут работает все замечательно
if(hr == S_OK)
{
MessageBox(NULL, bstrName, L"Name", MB_OK|MB_ICONASTERISK);
}
}
SysFreeString(bstrName);
}
}
}
iAcc->Release();
}
}
CoUninitialize();
return 0;
}
[DllImport("USER32.DLL")]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("oleacc.dll")]
public static extern int AccessibleObjectFromWindow(IntPtr hwnd, uint id, ref Guid iid,
[In, Out, MarshalAs(UnmanagedType.IUnknown)] ref object ppvObject);
[DllImport("oleacc.dll")]
public static extern int AccessibleChildren(IAccessible paccContainer, int iChildStart, int cChildren,
[In, Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2)] object[] rgvarChildren, out int pcObtained);
static void Main(string[] args)
{
try
{
IAccessible acc;
string name;
int num = 0;
IntPtr handle = new IntPtr(132996);
int result = AccessibleObjectFromWindow(handle, OBJID.OBJID_WINDOW, out acc);
name = acc.get_accName(0);
object[] obj = GetAccessibleChildren(acc, out num);
acc = (IAccessible)obj[0];
//////////////////////////////////////////////////////////////////////////
obj = GetAccessibleChildren(acc, out num);
acc = (IAccessible)obj[0];
//////////////////////////////////////////////////////////////////////////
obj = GetAccessibleChildren(acc, out num); // получаем 500 элементов
acc = (IAccessible)obj[0]; // возьмем первый элемент
// по анологии с C++ берем кол-во элементов
int number = data.accChildCount; // тут получаем ошибку: В результате вызова компонента COM возвращена ошибка в формате HRESULT E_FAIL.
// в итоге нечего ждать хорошего и от этой функции
name = acc.get_accName(1);
}
catch (Exception e)
{
return;
}
}
public static int AccessibleObjectFromWindow(IntPtr hwnd, OBJID idObject, out IAccessible acc)
{
Guid guid = new Guid("{618736e0-3c3d-11cf-810c-00aa00389b71}"); // IAccessible
object obj = null;
int num = AccessibleObjectFromWindow(hwnd, (uint)idObject, ref guid, ref obj);
acc = (IAccessible)obj;
return num;
}
private static object[] GetAccessibleChildren(IAccessible ao, out int childs)
{
childs = 0;
object[] ret = null;
int count = ao.accChildCount;
if (count > 0)
{
ret = new object[count];
AccessibleChildren(ao, 0, count, ret, out childs);
}
return ret;
}
public enum OBJID : uint
{
OBJID_WINDOW = 0x00000000,
OBJID_SYSMENU = 0xFFFFFFFF,
OBJID_TITLEBAR = 0xFFFFFFFE,
OBJID_MENU = 0xFFFFFFFD,
OBJID_CLIENT = 0xFFFFFFFC,
OBJID_VSCROLL = 0xFFFFFFFB,
OBJID_HSCROLL = 0xFFFFFFFA,
OBJID_SIZEGRIP = 0xFFFFFFF9,
OBJID_CARET = 0xFFFFFFF8,
OBJID_CURSOR = 0xFFFFFFF7,
OBJID_ALERT = 0xFFFFFFF6,
OBJID_SOUND = 0xFFFFFFF5,
}
Люди добрые любящие .Net подскажите пожалуйста где у меня ошибка. Про интерфейс IAccessible узнал только сегодня и в нем я слаб.
Заранее благодарен за вашу помощь