Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2017.04.16;
Скачать: CL | DM;

Вниз

Как узнать все методы имеющиеся в объекте OleVariant ?   Найти похожие ветки 

 
Той   (2015-08-19 19:42) [0]

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

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


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


 
кгшзх ©   (2015-08-19 19:55) [1]

var Obj: OleVariant;
begin
obj := "оле-вариант еще ни о чем не говорит сам по себе. смотреть надо на то как получен(создан) obj";


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

если оле вариант используется по назначению, то в нем сидит ком-объект. а у него есть библиотека типов. а в библиотеке той полный список методов и свойств.

а так можно сказать, что в гараже(олевариант) есть белая машина (объект или нечто) и спросить какой бензин ей нужен.

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


 
Той   (2015-08-19 21:05) [3]

Кажется это называется "позднее связывание", если я так понял.
Создан Obj до меня (получен извне) работает нормально.
Я могу вызывать например:

Obj.SetA(10);
Obj.SetB(30);
Obj.Go();


И оно работает. Но мне известны лишь несколько методов, а их в нём точно больше.
Ну вот и спрашиваю - можно ли программно "спросить" Obj какие методы в нём имеются?


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

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


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

 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 22:21) [6]

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

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

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


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

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

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


 
ухты ©   (2015-08-20 02:19) [8]

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


 
кгшзх ©   (2015-08-20 08:23) [9]

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

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


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

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

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


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

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

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


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

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


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

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

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


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

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


 
ухты ©   (2015-08-20 20:47) [15]


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


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

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


 
Palladin ©   (2015-08-21 16:56) [17]

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


 
icWasya ©   (2015-08-21 21:27) [18]

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


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

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

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

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

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


 
Inovet ©   (2015-08-22 02:50) [20]

> [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 23:04) [21]

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


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

Брутфорс длится жутко долго. Можно ли как-то распараллелить на несколько компов (так чтоб и без пропусков и без повторов)?
А то от 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-28 17:06) [23]

алес капут :)



Страницы: 1 вся ветка

Текущий архив: 2017.04.16;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.004 c
2-1441016318
lerandivan
2015-08-31 13:18
2017.04.16
Загрузка данных из текстового файла в StringGrid


2-1439881198
shunya
2015-08-18 09:59
2017.04.16
Ошибка в Twebbrowser


2-1439826143
igel888
2015-08-17 18:42
2017.04.16
Вопрос по Locate


2-1440748056
АИК
2015-08-28 10:47
2017.04.16
Отправка документа на отдельный принтер


2-1440917515
K-1000
2015-08-30 09:51
2017.04.16
BOOL -> Boolean