Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как узнать все методы имеющиеся в объекте OleVariant ? [D7, XP]


Страницы:   1 2

Той ©   (2015-08-19 19:42:00) 

Добрый вечер! Имеется:

Var Obj: OleVariant;
.....
Obj.SomeProc();
.....


Есть ли какой-то способ получить список всех доступных у Obj методов?


ухты   (2015-08-28 17:06:00) [1]

алес капут :)


Той   (2015-08-28 16:18:00) [2]

Брутфорс длится жутко долго. Можно ли как-то распараллелить на несколько компов (так чтоб и без пропусков и без повторов)?
А то от 1 до 6 символов дождался, а 7 всё считается и считается. Что же дальше будет...

var
     Disp: IDispatch;
const
     GUID_NULL: TGUID = (D1: 0; D2: 0; D3: 0; D4: (0, 0, 0, 0, 0, 0, 0, 0));
     Letters: array [0..36] Of Char = (
     '_','1','2','3','4','5','6','7','8','9','0',
     'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t', 'u','v','w','x','y','z'
     );

function MethodExists(MethodName: String): BooLean;
var Ret: HResult; NameCount: Integer; WideNames: array [0..0] Of WideString; DispIDs: array [0..0] Of Integer;
begin
Result:=False;
NameCount:=1;
WideNames[0]:=WideString(MethodName);
Ret:=Disp.GetIDsOfNames(GUID_NULL, @WideNames, NameCount, LOCALE_SYSTEM_DEFAULT, @DispIDs);
if Ret=S_OK then
     Result:=True;
end;

procedure Brutforce(Prev: String; Depth: Integer);
var i: Integer;
begin
if Depth=0 then
     begin
     if MethodExists(Prev) then
           begin
           Form1.Memo1.Lines.Add(Prev);
           Form1.Memo1.Lines.SaveToFile('MethodExists.~txt');
           end;
     end
else
     for i:=Low(Letters) to High(Letters) do
           Brutforce(Prev+Letters[i], Depth-1);
end;

procedure TForm1.Button1Click(Sender: TObject);
var i: Integer;
begin
Application.Minimize;
Application.ProcessMessages;
Disp:=IDispatch(Enj.GetOleObject());
Memo1.Text:='';
for i:=1 to 4 do // 20 do
     begin
     Memo1.Lines.Add('-----------------'#9+IntToStr(i)+#9'-----------------');
     Brutforce('', i);
     Memo1.Lines.Add('-----------------'#9'DONE'#9'-----------------');
     Memo1.Lines.SaveToFile('MethodExists.txt');
     end;
Application.Restore;
Application.ProcessMessages;
ShowMessage('Done!');
end;


Той   (2015-08-22 23:04:00) [3]

Разумеется я читал справку.
Получить Names через функцию GetIDsOfNames нельзя.
Эта функция получает [in] Name и возвращает [out] идентификатор (число).
А мне-то надо наоборот!


Inovet   (2015-08-22 02:50:00) [4]

> [19] Той   (22.08.15 02:16)
> А мне нафик не нужны IDs, мне нужны Names.

Ты справку-то читал?
https://msdn.microsoft.com/en-us/library/windows/desktop/ms221306%28v=vs.85%29.aspx
ну и вообще
https://msdn.microsoft.com/en-us/library/windows/desktop/hh309494%28v=vs.85%29.aspx


Той   (2015-08-22 02:16:00) [5]

> IDispatch распологает методами для получения информации о составе объекта?

Нет, не располагает. Там только GetIDsOfNames. А мне нафик не нужны IDs, мне нужны Names.

> Если там библиотеки нет - то остаётся только гадать

Так библиотеки как раз видимо нету. И инструкций нету.


icWasya   (2015-08-21 21:27:00) [6]

"как это узнаёт импорт" - когда в DLL или EXE находится библиотека типов, то при импорте делается раскодирование этой библиотеки и превращения её в текст на нужном языке программирования. Если там библиотеки нет - то остаётся только гадать(никак не получается - читай инструкцию)


Palladin   (2015-08-21 16:56:00) [7]

те че не понятно то? IDispatch распологает методами для получения информации о составе объекта? это давно тебе сказали. какие еще вопросы?


Той   (2015-08-20 21:45:00) [8]

Это важно? Внешняя функция с недоступными исходниками возвращает мне OleVariant.
Запустил брутфорс.


ухты   (2015-08-20 20:47:00) [9]


> Есть переменная типа OleVariant, в которой неизвестный СОМ-
> объект.
откуда он пришел, если не известен?


Той   (2015-08-20 20:08:00) [10]

Как? Брутфорсить через GetIDsOfNames()? Ну ладно, я думал проще как-то можно...


кгшзх   (2015-08-20 19:55:00) [11]

Мне всё равно как узнать методы.

Узнавай как сказали выше и не тереби никому мозги.


Той   (2015-08-20 19:53:00) [12]

Есть переменная типа OleVariant, в которой неизвестный СОМ-объект. Справки и другой информации по нему нету.
Известны только 8 методов. Ещё 2 я угадал по аналогии. Мне нужно как-то узнать список хотя бы методов.
Если есть информация "как это узнаёт импорт" - то мне пригодится. Если знать как он узнаёт - то и я смогу узнать так же, нет?


кгшзх   (2015-08-20 17:40:00) [13]

сначала хотел узнать "как узнать"
теперь хочешь узнать "как он узнает"

он узнает, потому что сом технология так спроектирована чтобы и он узнал и она тоже.


Той   (2015-08-20 17:10:00) [14]

Какой вопрос? Мне всё равно как узнать методы. Хоть рантайм, хоть из справки. Просто хочу знать чем могу пользоваться. Справки мне не давали.

Там куча всякого, а нужного видимо нету. А как тогда этот "импорт" всё узнаёт?


кгшзх   (2015-08-20 08:23:00) [15]

кроме методов самих, есть еще параметры, про которые идиспатч тебе ничего не скажет.
поэтому проджект->импорт тайп лабрари->выбор->креате юнит.

и вот в нем уже смотртеть и методы и параметры и свойства


ухты   (2015-08-20 02:19:00) [16]

про СОМ и гуглить, про что еще то? а лучше справку открыть про СОМ  почитать, так проще и быстрее
только вопрос, про куку, из [6], все равно остается


Той   (2015-08-20 01:09:00) [17]

Игорь Шевченко, да, оно потомок IDispatch, проверил.  Только что же вы предлагаете? :)
Насколько я понял GetIDsOfNames только проверяет есть ли такой метод, но не даёт списка, не?
Отбрутфорсить что ли?

кгшзх, как это сделать? Я ж даже не знаю точно что за интерфейс там.
COM только начал изучать, да и то срочно по необходимости. Что мне погуглить?


кгшзх   (2015-08-19 22:21:00) [18]

можно ли программно "спросить" Obj какие методы в нём имеются?

ну узнаешь ты на рантайме что есть там метод "куку"
что дальше?
завершаем программу и переписываем с вызовом узнанного метода.

то же самое будет если сразу импортировать библиотеку типов, создав тлб модуль.
и будет тебе и позднее и ранее связывание и полный список.


Игорь Шевченко   (2015-08-19 21:21:00) [19]

 IDispatch = class(IUnknown)
 public
   function GetTypeInfoCount(var ctinfo: Integer): HResult; virtual; stdcall; abstract;
   function GetTypeInfo(itinfo: Integer; lcid: TLCID; var tinfo: ITypeInfo): HResult; virtual; stdcall; abstract;
   function GetIDsOfNames(const iid: TIID; rgszNames: POleStrList;
     cNames: Integer; lcid: TLCID; rgdispid: PDispIDList): HResult; virtual; stdcall; abstract;
   function Invoke(dispIDMember: TDispID; const iid: TIID; lcid: TLCID;
     flags: Word; var dispParams: TDispParams; varResult: PVariant;
     excepInfo: PExcepInfo; argErr: PInteger): HResult; virtual; stdcall; abstract;
 end;


Той   (2015-08-19 21:09:00) [20]

Могу вызвать наугад Obj.ololo(); и оно ругается что мол нету такого метода. Вот и думаю - может быть можно как-то запросить список имеющихся?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо