Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2017.04.16;
Скачать: [xml.tar.bz2];

Вниз

Как узнать все методы имеющиеся в объекте 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.003 c
2-1438940029
vadim83
2015-08-07 12:33
2017.04.16
Строка, лучший способ сравнения


2-1439629079
RZD
2015-08-15 11:57
2017.04.16
Мерцает (подмаргивает) крупный текст на панели.


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


15-1460099290
DayGaykin
2016-04-08 10:08
2017.04.16
Обнаружение утечек в функции.


2-1441016318
lerandivan
2015-08-31 13:18
2017.04.16
Загрузка данных из текстового файла в StringGrid





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский