Помогите правильно перевести с языка C++ на C#
От: Аноним  
Дата: 11.10.09 15:09
Оценка:
Помогите разобраться с интерфейсом 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 узнал только сегодня и в нем я слаб.
Заранее благодарен за вашу помощь
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.