powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / IVSSVersions (MS VSS)
10 сообщений из 10, страница 1 из 1
IVSSVersions (MS VSS)
    #32364936
locky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кто-нибудь может привести эквивалентный OP код для VB кода:
For Each objVSSVersion In objVSSObject.Versions
.....
Заранее спасибо
...
Рейтинг: 0 / 0
IVSSVersions (MS VSS)
    #32364996
Фотография ну я
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Построение эквивалента for each примерно такое:

1) uses ActiveX;
2) const
IID_IEnumVariant: TGUID = '{00020404-0000-0000-C000-000000000046}';
3) var
Iterator: IInterface;
Users: IEnumVariant;
Fetched: Cardinal;
User: OleVariant;
4) Iterator := VSSDatabase1.Users._NewEnum;
Iterator.QueryInterface( IID_IEnumVariant, Users);
Fetched := 0;
while( Users.Next( 1, User, Fetched) = S_OK) do
begin
// ...
end;
...
Рейтинг: 0 / 0
IVSSVersions (MS VSS)
    #32366238
aag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот тебе кусочек, который строит дерево (точнее его ветви). Несколько проще чем у "ну я" :)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
function TFVSSBrowseForm.BuiltTreeSibling(VSSDatabase :TVSSDatabase; AParentNode: TTreeNode; const Spec :String) :TTreeNode;
var  VSSItem :IVSSItem;
     ANode :TTreeNode;
     J,I,N :Integer;
     S, S1, S2 :String;
     INo :OleVariant;
begin
  Result := nil;
  try
    Screen.Cursor := crHourglass;
    c_Tree.Items.BeginUpdate;
    ASpecList.Objects[Integer(AParentNode.Data) -  1 ] := TObject( 1 ); // was expanded

    try
      VSSItem := VSSDatabase.VSSItem[Spec, False];
    except
      on E :Exception do
      begin
        ShowMessage(E.Message + CR + LF + ' Spec:' + Spec + CR + LF + 'Node:' + S);
        raise;
      end;
    end;
    for I :=  1  to VSSItem.Items[False].Count do
    begin
      INo := OleVariant(I);
      if VSSItem.Items[False].Item[INo].Type_ = VSSITEM_PROJECT then
      begin
        N := ASpecList.Add(VSSItem.Items[False].Item[INo].Spec + '/');
        S1 := VSSItem.Items[False].Item[INo].Name;
        if Result = nil then
          Result := c_Tree.Items.AddChildObject(AParentNode, S1, TObject(N +  1 ))
        else c_Tree.Items.AddChildObject(AParentNode, S1, TObject(N +  1 ));
      end;
    end;

    if Result <> nil then
    begin
      S := Spec;
      for I :=  0  to AParentNode.Count -  1  do
      begin
        ANode := AParentNode.Item[I];
        S := Spec + ANode.Text + '/';  // LocalSpec

        VSSItem := VSSDatabase.VSSItem[S, False];
        // ANode.HasChildren := (VSSItem.Items[False].Count >  0 );
        if (ItemTreshold >  0 ) and (VSSItem.Items[False].Count > ItemTreshold) then
          Break;

        for J :=  1  to VSSItem.Items[False].Count do
        begin
          INo := OleVariant(J);
          if VSSItem.Items[False].Item[INo].Type_ = VSSITEM_PROJECT then
          begin
            ANode.HasChildren := True;
            Break;
          end;
        end;
        if c_Tree.Items.Count >  1024  then Break;
      end;
    end;
  finally
    c_Tree.Items.EndUpdate;
    Screen.Cursor := crDefault;
  end;
end;


Nobody faults but mine... (LZ)
...
Рейтинг: 0 / 0
IVSSVersions (MS VSS)
    #32366773
Фотография ну я
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На самом деле вопрос правильный - в этом долбаном VSS часть функционала доступна только через индексированные свойства, часть только через IEnumVariant. Чем думают программисты серверных программ микрософт - большая загадка. Сколько сталкивался с их серверными творениями - ничего кроме желания заменить не возникало. Абидна, да? Хотя и хотелось бы иметь работающую альтернативу в лице микрософта.
...
Рейтинг: 0 / 0
IVSSVersions (MS VSS)
    #32367125
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2ну я

Чем думают программисты серверных программ микрософт - большая загадка.

Вообще-то советую почитать про различия в программировании для COM на С++ и VB - так что MS просто приходится предоставлять два варианта методов - по-одному для этих языков - и так было всегда в COM
...
Рейтинг: 0 / 0
IVSSVersions (MS VSS)
    #32367225
aag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Беда в том, что в приведенном мной примере, получение каждого Item-а идет через вызов COM. Который, как я понимаю, довольно затратный. В результате, когда в проекте (в дереве) порядка 200-700 узлов, работает еще более-менее нормально. Но когда этих узлов более 1000, начинается висяк. Пробовал отлаживать, мерять время - все потихоньку на эти вызовы и уходит.
Хотя сам VSS Explorer работает шустро. Или он у них построен не на COM, или есть какие-то недокументированные возможности, которые я не нашел.

Nobody faults but mine... (LZ)
...
Рейтинг: 0 / 0
IVSSVersions (MS VSS)
    #32367228
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 aag

А зачем обрабатывать все дерево сразу?
...
Рейтинг: 0 / 0
IVSSVersions (MS VSS)
    #32367685
Фотография ну я
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Про различия в COM для C++ и VB я в курсе, спасибо за заботу.
Речь о реализации в VSS методов доступа к различным его частям - в нем действительно часть функционала выполнена только под IEnumVariant. Или Ваша мысль не закончена или я не понял поста.
...
Рейтинг: 0 / 0
IVSSVersions (MS VSS)
    #32368479
aag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 funikovyuri

С новым Годом! :)

Да так в принципе и сделано - строятся ветви "по раскрытию". Но в этом случае большая выгода, если бы узлы-ветви были распределены более-менее равномерно, а у меня всего несколько узлов наверху, под которым относительно немного веток, а вот под которыми куча листвы. Потому это "размазывание" посторения не сильно помогает.
Вся проблема именно в скорости вызовов через COM.


Nobody faults but mine... (LZ)
...
Рейтинг: 0 / 0
IVSSVersions (MS VSS)
    #32368800
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2aag

С новым Годом! :)
Спасибо, Вас также

ну что еще приходит в голову
- для inproc серверов цена вызова обычно достаточно не значительна
- показывать и загружать в разных потоках
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / IVSSVersions (MS VSS)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]