Shell and ShellExecute function

Opening a file

You can run another application or open a file by using the ShellExecute statement. This is basically the same as entering text into the Run window. First, declare this:

Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hWnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long

Some programs register its name, so that you only have to enter its application name (these also work in the Run window). Some of these are:

Application Name Text Used
Notepad

Notepad

WordPad

Wordpad

Word

Winword

Excel

Excel

Access

MSAccess

Publisher

MSPub

Paint

MSPaint

Explorer

Explorer

Internet Explorer

Iexplore

MSDos Editor edit

So, 

ShellExecute 0&, vbNullString, "WinWord", vbNullString, vbNullString, vbNormalFocus

Runs Word, and

ShellExecute 0&, vbNullString, "C:\test.doc", vbNullString, vbNullString, vbNormalFocus

opens C:\test.doc with its default viewer. Note that if the path you pass contains spaces, you need to surround it by quotes:

ShellExecute 0&, vbNullString, """C:\dir with spaces\test.doc""", vbNullString, vbNullString, vbNormalFocus

which is actually the equivalent of passing this:

" C:\dir with spaces\test.doc "

The fourth parameter specifies any command line parameters you want to pass. For example, if you wanted to run notepad, and get it to open c:\test.doc, then you would do this:

ShellExecute 0&, vbNullString, "notepad", "c:\test.doc", vbNullString, vbNormalFocus

The fifth parameter specifies the startup directory (ie the directory that that will be shown when you click open). This is the same as the StartIn parameter in a Shortcut.

The sixth parameter specifies the startup position, and can be one of the following:

 

Constant Value Description
vbHide 0 Window is hidden and focus is passed to the hidden window.
vbNormalFocus 1 Window has focus and is restored to its original size and position.
vbMinimizedFocus 2 Window is displayed as an icon with focus.
vbMaximizedFocus 3 Window is maximized with focus.
vbNormalNoFocus 4 Window is restored to its most recent size and position. The currently active window remains active.
vbMinimizedNoFocus 6 Window is displayed as an icon. The currently active window remains active.

The ShellExecute function will return 2 if the file is not found.

You can also use this statement for sending an email:

ShellExecute 0&, vbNullString, "mailto:support@vbweb.co.uk", vbNullString, vbNullString, vbNormalFocus

or to open a URL:

ShellExecute 0&, vbNullString, "http://www.vbweb.co.uk", vbNullString, vbNullString, vbNormalFocus

You might also like...

Comments

  1. 11 May 2003 at 19:01

    Nice tutorial, but you seem to have overlooked something. How do I launch My Computer? Explorer with no parameter opens My Documents, Explorer mycomp~1 and Explorer ""My Computer"" both say the directory doesn't exist. (This is on XP Pro BTW.)

  2. 17 Feb 2004 at 21:41

    is there a possibility for me to open a program to another pc. im thinking like a server client program where the server opens the client or other program from the other terminal...??

  3. 24 Nov 2004 at 06:52

    I want my program to wait till Shell or shellexecute command finishes zipping a file of size say 500mb. Please let me know the solution.
    Thanks,

  4. 18 Jan 2005 at 13:56

    Hi,
    very compliments for your tuttorial, it's very clarity.
    I have another question, now.
    The command "sendkeys" send data to the active application
    in this moment.
    I need to send data (key) to an aplication that is just
    running, but in background, in minimize state.


    It's possible to make this?
    Thanks in advantage.


    DaxDax

  5. 10 May 2005 at 16:31
    Hey, I have a memory leak problem. My application has to run different programs. For example, when the user has to run Notepad, he just clicks on the button on my program and my program runs Notepad... Simple and straightforward. The problem is that the user might have to run Notedpad several times throughout the day, and when you look at the memory usage for my program on Task Manager, the size increases every time the user decides to run Notepad (even though he closes it after he's through using it). My question is: how would I release the memory used by my program for Notepad when the user closes Notepad? I need this so that I could keep the same memory usage, cause if the user decides to run Notepad 100 times, and then close all of those, that's a whole lotta memory used up for nothing...

    I would really appreciate any help,
    Thank you
  6. 04 Jun 2005 at 23:02

    Is there anyway of using information gathered from drive/dir/file list boxes in the path when using Shell? I have tried but I think I have the wrong syntax even though VB6 does not complain.

  7. 13 Jun 2005 at 02:34

    I have the same situation and would appreciate your sharing any answer.

  8. 13 Jun 2005 at 03:53
  9. 05 Sep 2005 at 11:05
    This Method Works Well But My Problem is That I want to Open The

    Explorer File(s) (.html or htm)  In New Window(new instance of IE for

    every file) every time I clicked on the Different file.
  10. 14 Jul 2006 at 05:52
    aaftab wrote:
    This Method Works Well But My Problem is That I want to Open The Explorer File(s) (.html or htm) In New Window(new instance of IE for every file) every time I clicked on the Different file.
  11. 29 Jun 2009 at 22:55

    hi!! i make a program with .net, in this program use the command shell for execute an aplication in visual basic 6 but i can not open de file "exe" why i need pass by parameters for opening the file.

    Somebody can help me with my doubt.

  12. 08 Dec 2009 at 15:23

    I have been trying to get this to work with acrobat. Using the acroRD32 string appears to work, but only on the 2nd attempt. It's odd and possibly something to do with our work security/firewall settings stopping it working. I linked this code with a TOOLSTRIPMENUITEM and on the second time it worked. I have no idea why and if anybody could shed any light I would appreciate it. But, as a temporary fix I have called the function twice.

Leave a comment

Sign in or Join us (it's free).

About the author

James Crowley

James Crowley United Kingdom

James first started this website when learning Visual Basic back in 1999 whilst studying his GCSEs. The site grew steadily over the years while being run as a hobby - to a regular monthly audien...

Contribute

Why not write for us? Or you could submit an event or a user group in your area. Alternatively just tell us what you think!

Our tools

We've got automatic conversion tools to convert C# to VB.NET, VB.NET to C#. Also you can compress javascript and compress css and generate sql connection strings.

“There are only 3 numbers of interest to a computer scientist: 1, 0 and infinity”