Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / IVSSVersions (MS VSS) / 10 сообщений из 10, страница 1 из 1
26.12.2003, 19:41
    #32364936
locky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IVSSVersions (MS VSS)
кто-нибудь может привести эквивалентный OP код для VB кода:
For Each objVSSVersion In objVSSObject.Versions
.....
Заранее спасибо
...
Рейтинг: 0 / 0
26.12.2003, 21:50
    #32364996
ну я
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IVSSVersions (MS VSS)
Построение эквивалента 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
29.12.2003, 17:11
    #32366238
aag
aag
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IVSSVersions (MS VSS)
вот тебе кусочек, который строит дерево (точнее его ветви). Несколько проще чем у "ну я" :)

Код: 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
30.12.2003, 12:03
    #32366773
ну я
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IVSSVersions (MS VSS)
На самом деле вопрос правильный - в этом долбаном VSS часть функционала доступна только через индексированные свойства, часть только через IEnumVariant. Чем думают программисты серверных программ микрософт - большая загадка. Сколько сталкивался с их серверными творениями - ничего кроме желания заменить не возникало. Абидна, да? Хотя и хотелось бы иметь работающую альтернативу в лице микрософта.
...
Рейтинг: 0 / 0
30.12.2003, 16:11
    #32367125
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IVSSVersions (MS VSS)
2ну я

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

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

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

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

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

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


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

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

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


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