Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Activex
Форум программистов > Системное программирование > C, С++ и С Builder > Borland C++ Builder & Kylix
Lena_ki
Как осуществить следующее:
При нажатии на кнопку, надо вывести в список все зарегистрированные на компьютере ActiveX. Спасибо.
Lena_ki
Список AxtiveX получить и загрузить удалось.
Кто знает, подскажите, как можно загрузить в отдельный список методы объекта ActiveX загруженного в OleConteiner?
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;



Может несколько придётся переиначить.. но общий смысл таков ...
Lena_ki
Большое спасибо за помощь!
Попробую разобраться и перевести код на С++ Builder.
Barmutik
Удачи! Всё больше девушек(женщин) вступает в ряды программистов cool.gif
Kmet
Цитата(Barmutik @ 8:09:2006, 13:40 )
Удачи! Всё больше девушек(женщин) вступает в ряды программистов
*


К сожелению в моем отделе это не ощущается =(
Barmutik
У нас на фирме тоже smile.gif
Lena_ki
Barmutik, подскажите, а то не могу разобраться в справке, что делает ф-ция GetTypeInfo?
А GetTypeInfoCount что считает кол-во интерфейсов в объекте COM?
Barmutik
Привожу выдержку из MSDN...

Цитата
This method retrieves the type information for the dual interface.


Получает информацию о типе для dual интерфейса.. в нашем случае мы получаем информацию о IDIspatch..
Lena_ki
Не получается разобраться с кодом выше. sad.gif
Не могу понять логику получения методов ActiveX.
У меня есть ActiveX загруженный в OleConteiner. Какова последовательность действий по пунктам:
1. Создаю указатель на объект ActiveX на его часть IDispatch
//С++ Builder 6
IDispatch * pDispU = NULL;
pDispU->CreateOleObject(NameOfClass); // NameOfClass имя класса моего ActiveX
2. Надо получить доступы к интерфейсам в этом ActiveX
3. Потом просмотреть методы, содержащиеся в этих интерфейсах и вывести их в список.
Для пункта 2 что надо сделать?
Спасибо.
Lena_ki
Вот, может кому пригодиться: ]]>http://www.rsdn.ru/article/com/typeinfo.xml]]>
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2008 IPS, Inc.