2016-10-21 6 views
0

я столкнулся два варианта использования Shell из VBA:Explorer.exe в VBA команда Shell

Call Shell("Explorer.exe ""C:\Windows\system32\notepad.exe""",vbNormalFocus) и Call Shell("C:\Windows\system32\notepad.exe",vbNormalFocus). Они оба работают, поэтому я бы всегда старался использовать второй пример, он проще и понятнее. Может быть, я что-то упустил, но есть ли причина, по которой можно использовать первый пример?

+0

Это Explorer.exe приложение для файлового менеджера, но не веб-браузер. – Mak

+0

Это не ответило на мой вопрос. – DaveU

+0

1-й открывает проводник Windows и открывает файл, как если бы он помещал полный путь к файлу в браузере. 2-й открывает блокнот, честно говоря, Shell help должен объяснить, попробуйте shell («Explorer.exe»), а затем что-то вроде этой оболочки («Notepad.exe» «C: \ TEST \ JUNK \ test.txt» «») открывает файл test.txt, вторая часть - аргумент оболочки, поэтому в этом случае какой файл открыть. Не 100%, но я думаю, что это было сделано для лучшей практики, чтобы сообщить об открытии приложения, которое будет сделано через Windows Explorer. –

ответ

0

Это объяснит, что он открывает 2 экземпляра блокнота, первый путь проводника, второй блокнот, затем вторая половина кода просматривает экземпляры блокнота и проводника и показывает соответствующие идентификаторы процесса. Можно видеть, что Проводник открыл версия соединяется с Windows Explorer, как процесс, а второй Notepad как процесс

Sub Shell_Example() 

Dim o1 As Long 
Dim o2 As Long 

'From Shell Help 
'Runs an executable program and returns a Variant (Double) representing the 
'program's task ID if successful, otherwise it returns zero. 

o1 = Shell("Explorer.exe ""C:\Windows\system32\notepad.exe""", vbNormalFocus) 
o2 = Shell("Notepad.exe") 

Debug.Print "Via Explorer : " & o1 & " - Via Notepad : " & o2 

Dim objServices As Object, objProcessSet As Object, Process As Object 

Set objServices = GetObject("winmgmts:\\" _ 
     & "." & "\root\CIMV2") 
Set objProcessSet = objServices.ExecQuery _ 
     ("Select Name, ProcessID FROM Win32_Process", , 48) 

For Each Process In objProcessSet 
    If Process.Name Like "*notepad.exe" Or Process.Name Like "*explorer.exe" Then _ 
     Debug.Print Process.Name, Process.ProcessID 
Next 

End Sub 

Мои результаты

Via Explorer : 9932 - Via Notepad : 3776

Мои процессы

explorer.exe 5240 
notepad.exe 4820 
notepad.exe 7092 
notepad.exe 1492 
notepad.exe 11296 
explorer.exe 2616 
notepad.exe 1276 
**explorer.exe 9932** 
**notepad.exe 3776** 
explorer.exe 11552 

Надеюсь, что это поможет.

+0

Спасибо за ответ за процессы. Но я догадываюсь, что мой вопрос по-прежнему остается - скажем, что все, что я хочу сделать, это запустить «Блокнот» из Excel, почему бы мне никогда не использовать синтаксис «Shell» («Explorer.exe» и т. Д.) Кажется совершенно ненужным. – DaveU

+0

Даже если ваш ответ wasn 't совершенно то, что я искал (см. мой комментарий выше), я собираюсь принять его, так как вы передали очень полезную информацию. – DaveU

+0

Что вы ищете? Мой ответ объясняет разницу в том, что происходит, один открывает блокнот через проводник, как если бы вы дважды нажали Notepad.exe в проводнике, так что у вас будет процесс explorer.exe и процесс блокнота, вы не узнаете процесс блокнота из оболочки, а другой откроете файл notepad.exe в оболочка, так что у вас будет идентификатор процесса. –