Activex

  • Автор темы Lena_ki
  • Дата начала
Статус
Закрыто для дальнейших ответов.
L

Lena_ki

Как осуществить следующее:
При нажатии на кнопку, надо вывести в список все зарегистрированные на компьютере ActiveX. Спасибо.
 
L

Lena_ki

Список AxtiveX получить и загрузить удалось.
Кто знает, подскажите, как можно загрузить в отдельный список методы объекта ActiveX загруженного в OleConteiner?
 
B

Barmutik

Как вариант ... стоит несколько адаптировать к Вашему случаю ...

Код:
procedure ListTypeInfo(ClassID: TGUID; List: TStrings); 
var 
Obj: IDispatch; 
TypeInfo: ITypeInfo; 
TypeAttr: PTypeAttr; 
iCnt: integer; 
begin 
Obj := CreateComObject(ClassID) as IDispatch; 
Obj.GetTypeInfoCount(iCnt); 
if iCnt > 0 then 
begin 
Obj.GetTypeInfo(0, 0, TypeInfo); 
OleCheck(TypeInfo.GetTypeAttr(TypeAttr)); 
try 
if (TypeAttr.typeKind in [TKIND_DISPATCH, TKIND_INTERFACE]) then 
LoadInterface(TypeInfo, TypeAttr, List); 
finally 
TypeInfo.ReleaseTypeAttr(TypeAttr); 
end; 
end; 
end;

Код:
procedure LoadInterface(TypeInfo: ITypeInfo; TypeAttr: PTypeAttr; List: 
TStrings); 
var 
AName: WideString; 
ADocString: WideString; 
AHelpContext: LongInt; 
FuncDesc: PFuncDesc; 
i, j: Integer; 
Names: PBStrList; 
cNames: Integer; 
strItem: string; 
begin 
TypeInfo.GetDocumentation(-1, @AName, @ADocString, @AHelpContext, nil); 


New(Names); 
try 
// load functions 
for i := 0 to TypeAttr.cFuncs - 1 do 
begin 
TypeInfo.GetFuncDesc(i, FuncDesc); 
try 
TypeInfo.GetDocumentation(FuncDesc.memid, @AName, @ADocString, 
@AHelpContext, nil); 

strItem := AName; 

if FuncDesc.cParams > 0 then 
begin 
// load parameters 
TypeInfo.GetNames(FuncDesc.memid, Names, SizeOf(TBStrList), 
cNames); 
strItem := strItem + '('; 


// Skip Names[0] - it's the function name 
for j := 1 to FuncDesc.cParams do 
if j < 2 then 
strItem := strItem + Names[j] 
else 
strItem := strItem + ', ' + Names[j]; 
strItem := strItem + ')'; 
end; 

if (ADocString <> '') then 
strItem := strItem + #9 + ADocString; 
list.Add(strItem); 
finally 
TypeInfo.ReleaseFuncDesc(FuncDesc); 
end; 
end; 
finally 
Dispose(Names); 
end; 
end;


Может несколько придётся переиначить.. но общий смысл таков ...
 
L

Lena_ki

Большое спасибо за помощь!
Попробую разобраться и перевести код на С++ Builder.
 
B

Barmutik

Удачи! Всё больше девушек(женщин) вступает в ряды программистов :)
 

Kmet

Well-known member
25.05.2006
904
8
BIT
0
<!--QuoteBegin-Barmutik+8:09:2006, 13:40 -->
<span class="vbquote">(Barmutik @ 8:09:2006, 13:40 )</span><!--QuoteEBegin-->Удачи! Всё больше девушек(женщин) вступает в ряды программистов
[snapback]43464" rel="nofollow" target="_blank[/snapback]​
[/quote]

К сожелению в моем отделе это не ощущается =(
 
L

Lena_ki

Barmutik, подскажите, а то не могу разобраться в справке, что делает ф-ция GetTypeInfo?
А GetTypeInfoCount что считает кол-во интерфейсов в объекте COM?
 
B

Barmutik

Привожу выдержку из MSDN...

This method retrieves the type information for the dual interface.

Получает информацию о типе для dual интерфейса.. в нашем случае мы получаем информацию о IDIspatch..
 
L

Lena_ki

Не получается разобраться с кодом выше. :(
Не могу понять логику получения методов ActiveX.
У меня есть ActiveX загруженный в OleConteiner. Какова последовательность действий по пунктам:
1. Создаю указатель на объект ActiveX на его часть IDispatch
//С++ Builder 6
IDispatch * pDispU = NULL;
pDispU->CreateOleObject(NameOfClass); // NameOfClass имя класса моего ActiveX
2. Надо получить доступы к интерфейсам в этом ActiveX
3. Потом просмотреть методы, содержащиеся в этих интерфейсах и вывести их в список.
Для пункта 2 что надо сделать?
Спасибо.
 
L

Lena_ki

Вот, может кому пригодиться:
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!