Форум: "Начинающим";
Текущий архив: 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