<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; VBS: Особенность доступа к элементам коллекций]]></title>
	<link rel="self" href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=12366&amp;type=atom" />
	<updated>2017-02-01T23:17:09Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=12366</id>
		<entry>
			<title type="html"><![CDATA[Re: VBS: Особенность доступа к элементам коллекций]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=111781#p111781" />
			<content type="html"><![CDATA[<p>Как ни странно, если пролистать <strong>wshom.ocx</strong> в hex-редакторе, видны все те же 17 ключей:<br /></p><div class="codebox"><pre><code>00001400  A6 BB 56 06 50 00 72 00 6F 00 67 00 72 00 61 00  ª╗V.P.r.o.g.r.a.
00001410  6D 00 73 00 00 00 00 00 4D 00 79 00 44 00 6F 00  m.s.....M.y.D.o.
00001420  63 00 75 00 6D 00 65 00 6E 00 74 00 73 00 00 00  c.u.m.e.n.t.s...
00001430  46 00 61 00 76 00 6F 00 72 00 69 00 74 00 65 00  F.a.v.o.r.i.t.e.
00001440  73 00 00 00 53 00 74 00 61 00 72 00 74 00 75 00  s...S.t.a.r.t.u.
00001450  70 00 00 00 52 00 65 00 63 00 65 00 6E 00 74 00  p...R.e.c.e.n.t.
00001460  00 00 00 00 53 00 65 00 6E 00 64 00 54 00 6F 00  ....S.e.n.d.T.o.
00001470  00 00 00 00 53 00 74 00 61 00 72 00 74 00 4D 00  ....S.t.a.r.t.M.
00001480  65 00 6E 00 75 00 00 00 4E 00 65 00 74 00 48 00  e.n.u...N.e.t.H.
00001490  6F 00 6F 00 64 00 00 00 46 00 6F 00 6E 00 74 00  o.o.d...F.o.n.t.
000014A0  73 00 00 00 54 00 65 00 6D 00 70 00 6C 00 61 00  s...T.e.m.p.l.a.
000014B0  74 00 65 00 73 00 00 00 50 00 72 00 69 00 6E 00  t.e.s...P.r.i.n.
000014C0  74 00 48 00 6F 00 6F 00 64 00 00 00 41 00 70 00  t.H.o.o.d...A.p.
000014D0  70 00 44 00 61 00 74 00 61 00 00 00 44 00 65 00  p.D.a.t.a...D.e.
000014E0  73 00 6B 00 74 00 6F 00 70 00 00 00 41 00 6C 00  s.k.t.o.p...A.l.
000014F0  6C 00 55 00 73 00 65 00 72 00 73 00 53 00 74 00  l.U.s.e.r.s.S.t.
00001500  61 00 72 00 74 00 75 00 70 00 00 00 41 00 6C 00  a.r.t.u.p...A.l.
00001510  6C 00 55 00 73 00 65 00 72 00 73 00 50 00 72 00  l.U.s.e.r.s.P.r.
00001520  6F 00 67 00 72 00 61 00 6D 00 73 00 00 00 00 00  o.g.r.a.m.s.....
00001530  41 00 6C 00 6C 00 55 00 73 00 65 00 72 00 73 00  A.l.l.U.s.e.r.s.
00001540  53 00 74 00 61 00 72 00 74 00 4D 00 65 00 6E 00  S.t.a.r.t.M.e.n.
00001550  75 00 00 00 41 00 6C 00 6C 00 55 00 73 00 65 00  u...A.l.l.U.s.e.
00001560  72 00 73 00 44 00 65 00 73 00 6B 00 74 00 6F 00  r.s.D.e.s.k.t.o.
00001570  70 00 00 00 53 48 47 65 74 50 61 74 68 46 72 6F  p...SHGetPathFro</code></pre></div>]]></content>
			<author>
				<name><![CDATA[omegastripes]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=29228</uri>
			</author>
			<updated>2017-02-01T23:17:09Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=111781#p111781</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: Особенность доступа к элементам коллекций]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=111779#p111779" />
			<content type="html"><![CDATA[<p>Чтобы убедиться в указанном несоответствии, домен не нужен.</p>]]></content>
			<author>
				<name><![CDATA[Flasher]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27593</uri>
			</author>
			<updated>2017-02-01T19:56:27Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=111779#p111779</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: Особенность доступа к элементам коллекций]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=111778#p111778" />
			<content type="html"><![CDATA[<p>Нет домена чтоб проверить.</p>]]></content>
			<author>
				<name><![CDATA[Malcev]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=26930</uri>
			</author>
			<updated>2017-02-01T19:54:41Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=111778#p111778</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: Особенность доступа к элементам коллекций]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=111777#p111777" />
			<content type="html"><![CDATA[<p>Это в данном описании. А по факту что мы видим? All Users (0), а не (4).</p>]]></content>
			<author>
				<name><![CDATA[Flasher]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27593</uri>
			</author>
			<updated>2017-02-01T19:52:01Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=111777#p111777</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: Особенность доступа к элементам коллекций]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=111776#p111776" />
			<content type="html"><![CDATA[<p>Вроде не дубль:<br /></p><div class="quotebox"><blockquote><p>Desktop (local)<br />powershell (new-object -com WScript.Shell).SpecialFolders.item(0)</p></blockquote></div><div class="quotebox"><blockquote><p>Desktop (domain)&nbsp; - All Users (4) - Specific User (10)<br />powershell (new-object -com WScript.Shell).SpecialFolders.item(4)<br />powershell (new-object -com WScript.Shell).SpecialFolders.item(10)</p></blockquote></div><p><a href="http://trilobite.ch/blog/powershell/24-joomla">http://trilobite.ch/blog/powershell/24-joomla</a></p>]]></content>
			<author>
				<name><![CDATA[Malcev]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=26930</uri>
			</author>
			<updated>2017-02-01T19:38:32Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=111776#p111776</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: Особенность доступа к элементам коллекций]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=111770#p111770" />
			<content type="html"><![CDATA[<p>Сделал на скорую руку проверку соответствия при переборе по индексу с результатом перебора по именам. Видимо и правда просто дубль. Несовпавших элементов не обнаружил. <strong>Flasher</strong> правильно говорит. Можно было и код не писать.<br /></p><div class="codebox"><pre><code>
Option Explicit
Dim oWshShell, _
	cSpecialFolders, _
	aFolderNames, _
	sFolderName, _
	i

Set oWshShell = CreateObject(&quot;WScript.Shell&quot;)

If InStr(1,WScript.FullName,&quot;cscript&quot;,1) &lt;= 0 Then 
	oWshShell.Run(&quot;cscript &quot;&quot;&quot; &amp; WScript.ScriptFullName &amp; &quot;&quot;&quot;&quot;)
	WScript.Quit
End If

Set cSpecialFolders = oWshShell.SpecialFolders

aFolderNames = Array(_
	&quot;AllUsersDesktop&quot;,_
	&quot;AllUsersStartMenu&quot;,_
	&quot;AllUsersPrograms&quot;,_
	&quot;AllUsersStartup&quot;,_
	&quot;Desktop&quot;,_
	&quot;AppData&quot;,_
	&quot;PrintHood&quot;,_
	&quot;Templates&quot;,_
	&quot;Fonts&quot;,_
	&quot;NetHood&quot;,_
	&quot;StartMenu&quot;,_
	&quot;SendTo&quot;,_
	&quot;Recent&quot;,_
	&quot;Startup&quot;,_
	&quot;Favorites&quot;,_
	&quot;MyDocuments&quot;,_
	&quot;Programs&quot;_
)

For i=0 to cSpecialFolders.Count - 1
	For Each sFolderName in aFolderNames
		if cSpecialFolders(i) = cSpecialFolders(sFolderName) Then
			WScript.Echo( Right(&quot;0&quot; &amp; i,2) &amp; &quot;) [&quot; &amp; sFolderName &amp; &quot;] &quot; &amp; cSpecialFolders(i))
		End if
	Next
Next

With WScript
	.StdOut.WriteLine vbCrlf &amp; &quot;Для завершения работы скрипта нажмите ENTER&quot;
	WScript.StdIn.ReadLine
End With
</code></pre></div><p>Вот что говорит:<br /></p><div class="quotebox"><blockquote><p>0) [AllUsersDesktop] C:\Users\Public\Desktop<br />1) [AllUsersStartMenu] C:\ProgramData\Microsoft\Windows\Start Menu<br />2) [AllUsersPrograms] C:\ProgramData\Microsoft\Windows\Start Menu\Programs<br />3) [AllUsersStartup] C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp<br /><strong>4) [Desktop] C:\Users\Developer\Desktop</strong><br />5) [AppData] C:\Users\Developer\AppData\Roaming<br />6) [PrintHood] C:\Users\Developer\AppData\Roaming\Microsoft\Windows\Printer Shortcuts<br />7) [Templates] C:\Users\Developer\AppData\Roaming\Microsoft\Windows\Templates<br />8) [Fonts] C:\Windows\Fonts<br />9) [NetHood] C:\Users\Developer\AppData\Roaming\Microsoft\Windows\Network Shortcuts<br /><strong>10) [Desktop] C:\Users\Developer\Desktop</strong><br />11) [StartMenu] C:\Users\Developer\AppData\Roaming\Microsoft\Windows\Start Menu<br />12) [SendTo] C:\Users\Developer\AppData\Roaming\Microsoft\Windows\SendTo<br />13) [Recent] C:\Users\Developer\AppData\Roaming\Microsoft\Windows\Recent<br />14) [Startup] C:\Users\Developer\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup<br />15) [Favorites] C:\Users\Developer\Favorites<br />16) [MyDocuments] C:\Users\Developer\Documents<br />17) [Programs] C:\Users\Developer\AppData\Roaming\Microsoft\Windows\Start Menu\Programs</p></blockquote></div>]]></content>
			<author>
				<name><![CDATA[Xameleon]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=8836</uri>
			</author>
			<updated>2017-02-01T16:36:49Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=111770#p111770</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: Особенность доступа к элементам коллекций]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=111768#p111768" />
			<content type="html"><![CDATA[<p>Ключ может быть один, а коллекция может содержать объект со ссылкой на этот ключ, как, например, в случае %WinDir%, ведущей в %SystemRoot%.</p>]]></content>
			<author>
				<name><![CDATA[Flasher]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27593</uri>
			</author>
			<updated>2017-02-01T16:15:48Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=111768#p111768</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: Особенность доступа к элементам коллекций]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=111766#p111766" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>Flasher пишет:</cite><blockquote><p>Есть подозрение, что этот элемент просто объединён под одним именем.</p></blockquote></div><p>Следуя данной логике, в коллекции 2 одинаковых ключа?</p>]]></content>
			<author>
				<name><![CDATA[omegastripes]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=29228</uri>
			</author>
			<updated>2017-02-01T16:03:42Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=111766#p111766</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: Особенность доступа к элементам коллекций]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=111760#p111760" />
			<content type="html"><![CDATA[<p><strong>omegastripes</strong><br />Не знаю и особо знать не хочу. Походит на &quot;погоню попа за дешевизной&quot;.<br />Есть подозрение, что этот элемент просто объединён под одним именем.<br /><span style="color: green">Оверквотинг запрещён. Убрано.</span></p>]]></content>
			<author>
				<name><![CDATA[Flasher]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27593</uri>
			</author>
			<updated>2017-02-01T14:49:49Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=111760#p111760</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: Особенность доступа к элементам коллекций]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=111759#p111759" />
			<content type="html"><![CDATA[<p>То что он повторный - это скорее совпадение. Но однозначно элементов в коллекции 18, а ключей известно 17. Каков еще один ключ?</p>]]></content>
			<author>
				<name><![CDATA[omegastripes]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=29228</uri>
			</author>
			<updated>2017-02-01T14:42:16Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=111759#p111759</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: Особенность доступа к элементам коллекций]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=111756#p111756" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>omegastripes пишет:</cite><blockquote><p>в блоке #2 он либо с индексом 4, либо 10</p></blockquote></div><p>Так он идёт 5-м в блоке #3. Зачем повторный?</p>]]></content>
			<author>
				<name><![CDATA[Flasher]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27593</uri>
			</author>
			<updated>2017-02-01T13:18:08Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=111756#p111756</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: Особенность доступа к элементам коллекций]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=111745#p111745" />
			<content type="html"><![CDATA[<p>Поскольку речь зашла о свойстве <strong>SpecialFolders</strong>, хочу поинтересоваться: каким образом можно получить значения всех ключей коллекции, возвращаемой этим свойством? На <a href="https://msdn.microsoft.com/en-us/library/9x9e7edx(v=vs.84).aspx">странице MSDN с описанием WshSpecialFolders Object</a> перечислено 16 пунктов, а в книге <a href="https://books.google.ru/books?id=8775k8sNFCgC&amp;pg=PA59">Stein Borge, Automating Windows Administration</a> - 17 (добавился AppData). Всего же их 18, что видно из вывода нижеследующего кода:</p><div class="codebox"><pre><code>Set oWshShell = CreateObject(&quot;WScript.Shell&quot;)
Set cSpecialFolders = oWshShell.SpecialFolders

sResult = &quot;#1&quot; &amp; vbCrLf &amp; vbCrLf
For Each sSpecialFolder In cSpecialFolders
    sResult = sResult &amp; sSpecialFolder &amp; vbCrLf
Next

sResult = sResult &amp; vbCrLf &amp; &quot;#2&quot; &amp; vbCrLf &amp; vbCrLf
For i = 0 to cSpecialFolders.Count - 1
    sResult = sResult &amp; i &amp; &quot; = &quot; &amp; cSpecialFolders(i) &amp; vbCrLf
Next

aFolderNames = Array(_
	&quot;AllUsersDesktop&quot;,_
	&quot;AllUsersStartMenu&quot;,_
	&quot;AllUsersPrograms&quot;,_
	&quot;AllUsersStartup&quot;,_
	&quot;Desktop&quot;,_
	&quot;AppData&quot;,_
	&quot;PrintHood&quot;,_
	&quot;Templates&quot;,_
	&quot;Fonts&quot;,_
	&quot;NetHood&quot;,_
	&quot;StartMenu&quot;,_
	&quot;SendTo&quot;,_
	&quot;Recent&quot;,_
	&quot;Startup&quot;,_
	&quot;Favorites&quot;,_
	&quot;MyDocuments&quot;,_
	&quot;Programs&quot;_
)

sResult = sResult &amp; vbCrLf &amp; &quot;#3&quot; &amp; vbCrLf &amp; vbCrLf
For Each sFolderName In aFolderNames
    sResult = sResult &amp; sFolderName &amp; &quot; = &quot; &amp; cSpecialFolders(sFolderName) &amp; vbCrLf
Next

WScript.Echo sResult
</code></pre></div><p>У меня результат следующий:<br /></p><div class="codebox"><pre><code>#1

C:\Users\Public\Desktop
C:\ProgramData\Microsoft\Windows\Start Menu
C:\ProgramData\Microsoft\Windows\Start Menu\Programs
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup
C:\Users\DELL\Desktop
C:\Users\DELL\AppData\Roaming
C:\Users\DELL\AppData\Roaming\Microsoft\Windows\Printer Shortcuts
C:\Users\DELL\AppData\Roaming\Microsoft\Windows\Templates
C:\WINDOWS\Fonts
C:\Users\DELL\AppData\Roaming\Microsoft\Windows\Network Shortcuts
C:\Users\DELL\Desktop
C:\Users\DELL\AppData\Roaming\Microsoft\Windows\Start Menu
C:\Users\DELL\AppData\Roaming\Microsoft\Windows\SendTo
C:\Users\DELL\AppData\Roaming\Microsoft\Windows\Recent
C:\Users\DELL\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
C:\Users\DELL\Favorites
C:\Users\DELL\Documents
C:\Users\DELL\AppData\Roaming\Microsoft\Windows\Start Menu\Programs

#2

0 = C:\Users\Public\Desktop
1 = C:\ProgramData\Microsoft\Windows\Start Menu
2 = C:\ProgramData\Microsoft\Windows\Start Menu\Programs
3 = C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup
4 = C:\Users\DELL\Desktop
5 = C:\Users\DELL\AppData\Roaming
6 = C:\Users\DELL\AppData\Roaming\Microsoft\Windows\Printer Shortcuts
7 = C:\Users\DELL\AppData\Roaming\Microsoft\Windows\Templates
8 = C:\WINDOWS\Fonts
9 = C:\Users\DELL\AppData\Roaming\Microsoft\Windows\Network Shortcuts
10 = C:\Users\DELL\Desktop
11 = C:\Users\DELL\AppData\Roaming\Microsoft\Windows\Start Menu
12 = C:\Users\DELL\AppData\Roaming\Microsoft\Windows\SendTo
13 = C:\Users\DELL\AppData\Roaming\Microsoft\Windows\Recent
14 = C:\Users\DELL\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
15 = C:\Users\DELL\Favorites
16 = C:\Users\DELL\Documents
17 = C:\Users\DELL\AppData\Roaming\Microsoft\Windows\Start Menu\Programs

#3

AllUsersDesktop = C:\Users\Public\Desktop
AllUsersStartMenu = C:\ProgramData\Microsoft\Windows\Start Menu
AllUsersPrograms = C:\ProgramData\Microsoft\Windows\Start Menu\Programs
AllUsersStartup = C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup
Desktop = C:\Users\DELL\Desktop
AppData = C:\Users\DELL\AppData\Roaming
PrintHood = C:\Users\DELL\AppData\Roaming\Microsoft\Windows\Printer Shortcuts
Templates = C:\Users\DELL\AppData\Roaming\Microsoft\Windows\Templates
Fonts = C:\WINDOWS\Fonts
NetHood = C:\Users\DELL\AppData\Roaming\Microsoft\Windows\Network Shortcuts
StartMenu = C:\Users\DELL\AppData\Roaming\Microsoft\Windows\Start Menu
SendTo = C:\Users\DELL\AppData\Roaming\Microsoft\Windows\SendTo
Recent = C:\Users\DELL\AppData\Roaming\Microsoft\Windows\Recent
Startup = C:\Users\DELL\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
Favorites = C:\Users\DELL\Favorites
MyDocuments = C:\Users\DELL\Documents
Programs = C:\Users\DELL\AppData\Roaming\Microsoft\Windows\Start Menu\Programs
</code></pre></div><p>В блоках #1 и 2# перечислены все 18 элементов коллекции, перебором и по индексам, в блоке #3 - 17 элементов по найденным ключам, ключ для одного из элементов, который должен располагаться, по сути, между ключами NetHood и StartMenu (в блоке #2 он либо с индексом 4, либо 10) мне найти так и не удалось.</p>]]></content>
			<author>
				<name><![CDATA[omegastripes]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=29228</uri>
			</author>
			<updated>2017-02-01T11:06:57Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=111745#p111745</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: Особенность доступа к элементам коллекций]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=111656#p111656" />
			<content type="html"><![CDATA[<p><strong>Xameleon</strong><br />Спасибо, не ожидал настолько полный ответ.<br />Просто, после первого знакомства с коллекциями решил, что, раз коллекция - стандартный объект Visual Basic, то <a href="https://msdn.microsoft.com/ru-ru/library/yb7y698k(v=vs.90).aspx"><strong>набор стандартных свойств и методов, описанных в документации по языку</strong></a>, должен присутствовать всегда и быть единообразным в любой коллекции. Оказалось, надо было просто <a href="https://msdn.microsoft.com/ru-ru/library/a82kxee5(v=vs.90).aspx"><strong>читать дальше</strong></a>.</p>]]></content>
			<author>
				<name><![CDATA[Михаил Орлов]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=34545</uri>
			</author>
			<updated>2017-01-30T11:34:53Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=111656#p111656</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: Особенность доступа к элементам коллекций]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=111643#p111643" />
			<content type="html"><![CDATA[<p>Решил добавить в эту тему пример создания <strong>WSC</strong> (Windows Script Component) с поддержкой механизмов коллекции.<br />Реализовано:<br />1) Перебор через <strong>For Each Key in object</strong><br />2) Перебор по индексам и именам <strong>object.Item(i)</strong> / <strong>object.Item(&quot;Key&quot;)</strong><br />3) Умолчательное свойство <strong>Item</strong> - <strong>object(&quot;Key&quot;)</strong><br />4) <span class="bbu">Поддержка <strong>Bang</strong> оператора</span> <strong>(!)</strong>. Доступ к элементам в формате <strong>object!key</strong> (Пример на VBA в комплекте)<br />5) События при вызове методов коллекции</p>]]></content>
			<author>
				<name><![CDATA[Xameleon]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=8836</uri>
			</author>
			<updated>2017-01-29T17:24:07Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=111643#p111643</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: Особенность доступа к элементам коллекций]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=111544#p111544" />
			<content type="html"><![CDATA[<p>Всё зависит от того как реализован интерфейс объекта и каким образом интерпретатор реализует выполнение перебора. Для работы перебора через <strong>For Each</strong> в <strong>VBScript</strong>, требуется свойство или метод с <strong><a href="https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms221242(v=vs.85).aspx">dispID</a></strong> = -4, которое(ый) возвращает интерфейс - <strong><a href="https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms691379(v=vs.85).aspx">IUnknown</a></strong>. </p><p>К примеру у <strong>Scripting.Dictionary</strong> и коллекций <strong>Files / Drives</strong> объекта <strong>Scripting.FileSystemObject</strong> он реализован и называется <strong>_NewEnum</strong>.</p><p>Вот пример обращения к нему</p><div class="codebox"><pre><code>
Option Explicit

Dim dict, item

Set dict = CreateObject(&quot;Scripting.Dictionary&quot;)

dict.Add &quot;a&quot;,1

MsgBox TypeName(dict.[_NewEnum])

For Each item in dict
	MsgBox item
Next
</code></pre></div><p>Вот в этой строке <strong>MsgBox TypeName(dict.[_NewEnum])</strong> происходит запрос к нему. Когда интерпретатор работает с <strong>_NewEnum</strong> он на каждой итерации получает следующий элемент коллекции.</p><p>А для перебора по индексам достаточно иметь 2 свойства или метода - одно(ин) для получения элемента по индексу или имени и второе для получения размера коллекции. В случае с <strong>Dictionary</strong> это <strong>Item(Key)</strong> и <strong>Count</strong>. </p><div class="codebox"><pre><code>

Option Explicit

Dim dict, item, Key

Set dict = CreateObject(&quot;Scripting.Dictionary&quot;)

dict(0) = &quot;a&quot;
dict(1) = &quot;b&quot;

Dim i
For i = 0 to dict.Count
	MsgBox dict(i)
Next
</code></pre></div><p>В коде написано <strong>dict(i)</strong>, так как метод <strong>Item</strong> умолчательный (св-во / метод с <strong>dispID</strong> = 0) и поэтому обращение равноценно <strong>dict.Item(i)</strong></p><p>В итоге получается, что реализация остаётся на совести разработчика, который создаёт интерфейс коллекции.<br /><strong>Dictionary</strong> - частный случай реализации максимума. Там есть и <strong>_NewEnum</strong> и <strong>Item</strong> и <strong>Count</strong>.<br />У коллекции <strong>Files</strong> тоже реализован <strong>_NewEnum</strong> и <strong>Item</strong> и <strong>Count</strong> , но перебор по <span class="bbu">индексам не работает</span>, потому что метод <strong>Item</strong> принимает параметр не числовой, а имя файла.</p><div class="codebox"><pre><code>
Option Explicit
Dim fso, folder, file
Set fso = CreateObject(&quot;Scripting.FileSystemObject&quot;)

Set folder = fso.GetFolder(&quot;C:\&quot;)

MsgBox folder.files(&quot;bootmgr&quot;).size
</code></pre></div><p>Но в принципе мог бы быть отдельно только <strong>_NewEnum</strong> без <strong>Item</strong> и <strong>Count</strong></p><p>Вот как-то так. ) Надеюсь ни где не переврал и внёс некую ясность.</p>]]></content>
			<author>
				<name><![CDATA[Xameleon]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=8836</uri>
			</author>
			<updated>2017-01-25T16:50:59Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=111544#p111544</id>
		</entry>
</feed>
