1С:Предприятие v8, нужно раскопать

Discussion in 'Реверсинг' started by Silvester, 17 Dec 2008.

  1. Silvester

    Silvester New Member

    Joined:
    17 Dec 2008
    Messages:
    5
    Likes Received:
    0
    Reputations:
    0
    Строго говоря, нужен не реверсинг, а небольшое исследование с написанием утилиты. Суть в следующем: хочется программно получить текст окна текстового редактора (редактора кода) Конфигуратора 1С:Предприятия v8. Цель: написание утилит, облегчающих работу программиста-настройщика в этой среде.

    Хорошим решением была бы DLL, которая экспортировала бы необходимые функции. Первое, что нужно - это получение текста текстового редактора по HWND окна этого текстового редактора.

    Задача, как мне кажется, не самая простая, т.к. утилиты типа Winspector Spy, вроде бы, ничего не ловят (впрочем, я не спец, потому и обращаюсь).

    Просто есть идея сделать некоторую автоматизацию работы в Конфигураторе 1С с помощью скриптового языка Autohotkey. Этот язык очень здорово работает с горячими клавишами, текстом, эмуляцией пользовательского ввода и т.п. Помимо прочего он позволяет очень легко получить, например, HWND активного окна. Но дальше затык. Методы получения контролов окна и их содержимого там есть, но в случае с 1С v8 они не срабатывают. Вообще, 1С v8 довольно "гадко" написана в этом плане: там свои библиотеки и всё это вместе - "чёрный ящик", не поддающийся реверсингу. Например, даже экспорта в DLL там толком нет. Но это лирика. А пока что есть задача получить текст окна текстового редактора.
     
  2. ProTeuS

    ProTeuS --

    Joined:
    26 Nov 2004
    Messages:
    1,239
    Likes Received:
    541
    Reputations:
    445
    нужно? стоит зада4а? еще и на конкретном скриптовом языке? тогда вам на фриланс.ру. тут предоставляют только помощь и советы, а не выполняют фор_фри зада4и за кого-то, просьбы о помощи я тут по4ему-то совершенно неувидил, ровно как и просьбы разъяснить какие-то техни4еские моменты
     
  3. Silvester

    Silvester New Member

    Joined:
    17 Dec 2008
    Messages:
    5
    Likes Received:
    0
    Reputations:
    0
    Ну почему же, подойдёт любая инфа и любой совет.

    Могу сформулировать вопрос так: а куда копать, собственно? Как получить текст окна, зная только HWND? Причём это HWND не контрола, в котором происходит редактирование, а всего окна (не главного окна приложения, конечно, но его дочернего окна в MDI интерфейсе). И этот контрол не распознаётся утилитами типа Winspector Spy. Поясню, что значит "не распознаётся". При наведении мышки на разные окна такие утилиты обычно показывают рамку вокруг распознанного окна. Так вот, в данном случае окно текстового редактора воспринимается как единое целое. Я просто не знаю, в каком направлении даже начать.

    Топик этот составлен в надежде, что это интересно ещё кому-нибудь. В конце концов, ведь 1С - популярная программа.
     
    #3 Silvester, 17 Dec 2008
    Last edited: 17 Dec 2008
  4. Silvester

    Silvester New Member

    Joined:
    17 Dec 2008
    Messages:
    5
    Likes Received:
    0
    Reputations:
    0
    Нет, ни в коем случае. Этот конкретный скриптовый язык я привёл только потому, что он хорошо работает с экспортируемымми функциями DLL (например, с Win32 API). А это значит, что если, например, проблема решается путём вызова каких-то API - то дело уже в шляпе.

    Но вопрос пока сводится к следующему: а какими методами, утилитами и т.д. это вообще надо исследовать?
     
  5. neprovad

    neprovad Elder - Старейшина

    Joined:
    19 Oct 2007
    Messages:
    899
    Likes Received:
    274
    Reputations:
    59
    Приведите очередность действий от и до. В духе - Открыли конфигуратор-Новая конфигурация-Создать то-то или то-то- Появилось окно- Надо управлять этим окном-Установить текст ему и т.п. Опишите задачу полностью, я полагаю времени у вас на это найдется. Чем черт не шутит, вдруг это достаточно просто окажется и мне удастся вам помочь.
    upd.
    не знаю как там работает программа, управляющая окнами, но mdi окна находятся на ура. пример:
    далее следуют имена классов окон
    V8TopLevelFramе->V8MDIClient->открыты окна с кодом двух модулей-V8MDILocalFrame(2 штуки соответственно)->V8ViewSplitter->V8Window->V8Window
     
    #5 neprovad, 18 Dec 2008
    Last edited: 18 Dec 2008
  6. ProTeuS

    ProTeuS --

    Joined:
    26 Nov 2004
    Messages:
    1,239
    Likes Received:
    541
    Reputations:
    445
    находим хендл главного окна, пере4исляем все до4ерние, находим координаты либо положение, либо текст и выводим для всех (4тобы найти нужное окно, раз уж выходит 4то его никак "найти" нельзя), когда нашли. запоминаем и тот параметр, по которому нашли и будет нужным параметром поиска. далее аогритм всегда будет таков: ищем хендл мейна, пере4исляем все до4ерние, сравниваем например размеры окна с заданными эталаонными, если совпало - наше окно, в таком слу4ае посылаем ему SetWindowText(hWnd, Text). все
     
  7. Silvester

    Silvester New Member

    Joined:
    17 Dec 2008
    Messages:
    5
    Likes Received:
    0
    Reputations:
    0
    1. Открыли конфигуратор, меню "Конфигурация" - "Открыть конфигурацию".
    2. Команда контекстного меню корневого объекта метаданных в дереве - "Открыть модуль приложения".

    Собственно, и всё. Открывшееся окно имеет ClassNN "V8MDILocalFrame1", если держать курсор мыши над его заголовком. Если держать курсор мыши над текстом самого редактора, ClassNN - "V8Window3". Я не уверен, что цифры в конце ClassNN постоянны. Например, если создать текстовый документ, то второй ClassNN будет уже "V8Window4". (Для определения ClassNN я использовал инструмент AU3_Spy.exe.)

    Далее. Пишем скрипт на AutoHotkey:
    Code:
    #IfWinActive ahk_class V8TopLevelFrame
    
    F12::
    OutputVar =
    
    ; Буква "А" везде означает активное окно.
    
    ;Определяет, на каком контроле (элементе управления) указанного окна находится фокус ввода.
    ControlGetFocus, OutputVar, A
    MsgBox %OutputVar% ; выдаёт "V8Window3"
    
    ; Считывает информацию о контроле, в данном случае - Hwnd
    ControlGet, OutputVar, Hwnd,, V8Window3, A
    MsgBox %OutputVar% ; выдаёт что-то типа "0x2103cc", похоже на правду
    
    ; Считывает текст из контрола
    ControlGetText, OutputVar, V8Window3, A
    MsgBox %OutputVar% ; выдаёт пустую строку, типа текста нет (это неправда)
    
    ; Читает текст указанного окна
    WinGetText, OutputVar, A
    MsgBox, %OutputVar% ; выдаёт заголовок окна типа "Конфигурация: Модуль приложения"
    
    Вобщем, достать текст не выходит. Просмотрите код - он очень простой и прокомментирован.
    Собственно, я не прошу написать рабочий скрипт на AutoHotkey.
    Я лишь прошу ответить на вопрос: получится ли выдрать текст из этого "V8Window3", например, на Си, используя Win API?
    Если да, то какие API и как нужно задействовать?
    Может, есть ещё какие-то способы получить этот текст программно?
    Примечание: программа Kleptomania этот текст читает, но там совсем другая технология.

    Вобщем, если не лень, я прошу вас попробовать практически написать что-то на Си или ещё на чём-то. Советы ProTeuS понятны, но чтобы ими воспользоваться, у меня просто не хватит квалификации. Кроме того, не факт, что эти советы сработают, т.к., как я уже говорил 1С v8 - это чёрный ящик ещё тот. Здесь нужна рука опытного хакера, потому я так "по-наглому" и прошу, поймите пожалуйста правильно :). На данном этапе меня интересует сама возможность подобного действия. Если эта возможность оправдается (в чём я не совсем уверен), тогда уже можно будет подумать, как это прикрутить к моим потребностям и всё такое...
     
  8. neprovad

    neprovad Elder - Старейшина

    Joined:
    19 Oct 2007
    Messages:
    899
    Likes Received:
    274
    Reputations:
    59
    копать в сторону wbase81.dll
    имена функций экспорта имеют весьма и весьма интересные названия. Если сложности с разбором, есть переходники в frame.dll, txtedui.dll и прочие com компоненты.
    p.s. бесплатно только сами знаете что)
     
  9. Silvester

    Silvester New Member

    Joined:
    17 Dec 2008
    Messages:
    5
    Likes Received:
    0
    Reputations:
    0
    Понятно, спасибо.