user4849927
user4849927

Reputation:

How to to open a program with CreateProcess if only its name is known?

Like in the following example I'm trying to start Googles Chrome browser from a Windows application using the Windows API function CreateProcess.

The problem I have is that I dont know the path to the Chrome application (or any other application in the Program path). How can I get this?

In the code below I commented three different examples. In case I start "calc", the Calculator is started as it is in the Windows/System32 path. In case I start Chrome with the full path to the application it runs too. But if I omit the path and just try to start "chrome" I get an error #2.

#include <windows.h>
#include <stdio.h>
#include <tchar.h>

void _tmain()
{

    char* cmd = "calc"; // works... calc.exe is in windows/system32 
    // char* cmd = "chrome"; // doesn't work... how can I add the path if it's not known (e.g. windows installed on D:\)
    // char* cmd = "c:/program files (x86)/google/chrome/application/chrome"; // works (even without extension .exe)

    STARTUPINFO si;
    PROCESS_INFORMATION pi;

    ZeroMemory(&si, sizeof(si));
    si.cb = sizeof(si);
    ZeroMemory(&pi, sizeof(pi));

    // Start the child process. 
    if (!CreateProcess(NULL,   // No module name (use command line)
        cmd,            // Command line
        NULL,           // Process handle not inheritable
        NULL,           // Thread handle not inheritable
        FALSE,          // Set handle inheritance to FALSE
        0,              // No creation flags
        NULL,           // Use parent's environment block
        NULL,           // Use parent's starting directory 
        &si,            // Pointer to STARTUPINFO structure
        &pi)           // Pointer to PROCESS_INFORMATION structure
        )
    {
        printf("CreateProcess failed (%d).\n", GetLastError());
        return;
    }

    // Wait until child process exits.
    WaitForSingleObject(pi.hProcess, INFINITE);

    // Close process and thread handles. 
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);
}

Note: if I enter "chrome" (without the quotes) in the Windows Run command window, Chrome starts too. What I'm looking for is the same functionality. However, my application can reside anywhere and is not necessarily located on the same drive as Chrome.

Upvotes: 0

Views: 3110

Answers (3)

ArendelleLeah
ArendelleLeah

Reputation: 1

I have two ideas

  1. I found this shortcut down below on my PC, I think you can get this .lnk if you installed Google Chrome correctly.

C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Google Chrome.lnk

  1. You can search "Google\Chrome\Application" in the regedit.exe. I guess there is a string key that can get the full path. but you must be careful, there are so many versions of google chrome, and it might have different environments of Windows.

Upvotes: 0

David Heffernan
David Heffernan

Reputation: 612954

If you really must use CreateProcess then you will need to find out where it is installed and pass the full path to the executable. That's going to require some registry hacking.

However, I feel that there is an easier and more robust way. Chrome registers itself in the AppPaths registry so ShellExecuteEx with the file specified as L"chrome" and the default verb will do the job.

Upvotes: 4

Serge Ballesta
Serge Ballesta

Reputation: 148900

This is likely to be unrelated to WinAPI and the CreateProcess function, but only to the environment variable PATH. By default, it contains the path for all standard windows commands like calc or notepad, but you must add the path for other commands that you add later, be it under Program Files or anywhere else.

What to do:

  • carefully note the actual path of chrome
  • open Control Panel / System / Advanced system parameters
  • click Environment variables: you will find a PATH (case does not matter) in user and system variables.
  • add the path for chrome on one (system is meant meant for all users)

It should now be possible to launch chrome without specifying its full path.

NB: unsure for the actual labels for all of the above, my own box speaks french...

Upvotes: 0

Related Questions