Code:
#include <windows.h>
#include <string>
std::string getExeName(std::string strFullPathToExe)
{
int Position = strFullPathToExe.find_last_of("\\");
strFullPathToExe = strFullPathToExe.erase(0, Position +1);
return strFullPathToExe;
}
int ExecuteProcess(std::string &FullPathToExe, std::string &Parameters, int SecondsToWait)
{
int iMyCounter = 0, iReturnVal = 0;
DWORD dwExitCode;
/* - NOTE - You could check here to see if the exe even exists */
/* Add a space to the beginning of the Parameters */
if (Parameters.size() != 0 )
{
Parameters.insert(0," ");
}
/* When using CreateProcess the first parameter needs to be the exe itself */
Parameters = getExeName(FullPathToExe).append(Parameters);
/*
The second parameter to CreateProcess can not be anything but a char !!
Since we are wrapping this C function with strings, we will create
the needed memory to hold the parameters
*/
/* Dynamic Char */
char * pszParam = new char[Parameters.size() + 1];
/* Verify memory availability */
if (pszParam == 0)
{
/* Unable to obtain (allocate) memory */
return 1;
}
const char* pchrTemp = Parameters.c_str();
strcpy(pszParam, pchrTemp);
/* CreateProcess API initialization */
STARTUPINFO siStartupInfo;
PROCESS_INFORMATION piProcessInfo;
SECURITY_ATTRIBUTES as;
memset(&siStartupInfo, 0, sizeof(siStartupInfo));
memset(&piProcessInfo, 0, sizeof(piProcessInfo));
memset(&as, 0, sizeof(as));
as.lpSecurityDescriptor=NULL;
as.bInheritHandle=true;
as.nLength=sizeof(as);
siStartupInfo.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
siStartupInfo.wShowWindow = SW_HIDE;
siStartupInfo.cb = sizeof(siStartupInfo);
/* Execute */
if ((CreateProcess(FullPathToExe.c_str(), pszParam, 0, 0, true,
CREATE_DEFAULT_ERROR_MODE|CREATE_NO_WINDOW, 0, 0, &siStartupInfo,
&piProcessInfo)) != false)
{
/* A loop to watch the process. Dismissed with SecondsToWait set to 0 */
GetExitCodeProcess(piProcessInfo.hProcess, &dwExitCode);
while (dwExitCode == STILL_ACTIVE && SecondsToWait != 0)
{
GetExitCodeProcess(piProcessInfo.hProcess, &dwExitCode);
Sleep(500);
iMyCounter += 500;
if (iMyCounter > (SecondsToWait * 1000))
{
dwExitCode = 0;
}
}
}
else
{
/* CreateProcess failed. You could also set the return to GetLastError() */
iReturnVal = 2;
}
/* Release handles */
CloseHandle(piProcessInfo.hProcess);
CloseHandle(piProcessInfo.hThread);
/* Free memory */
delete[]pszParam;
pszParam = 0;
return iReturnVal;
}
/* Declare Windows procedure */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
/* Make the class name into a global variable */
char szClassName[ ] = "WindowsApp";
int WINAPI WinMain (HINSTANCE hThisInstance,
HINSTANCE hPrevInstance,
LPSTR lpszArgument,
int nFunsterStil)
{
HWND hwnd; /* This is the handle for our window */
MSG messages; /* Here messages to the application are saved */
WNDCLASSEX wincl; /* Data structure for the windowclass */
/* The Window structure */
wincl.hInstance = hThisInstance;
wincl.lpszClassName = szClassName;
wincl.lpfnWndProc = WindowProcedure; /* This function is called by windows */
wincl.style = CS_DBLCLKS; /* Catch double-clicks */
wincl.cbSize = sizeof (WNDCLASSEX);
/* Use default icon and mouse-pointer */
wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
wincl.lpszMenuName = NULL; /* No menu */
wincl.cbClsExtra = 0; /* No extra bytes after the window class */
wincl.cbWndExtra = 0; /* structure or the window instance */
/* Use Windows's default color as the background of the window */
wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
/* Register the window class, and if it fails quit the program */
if (!RegisterClassEx (&wincl))
return 0;
/* The class is registered, let's create the program*/
hwnd = CreateWindowEx (
0, /* Extended possibilites for variation */
szClassName, /* Classname */
"Windows App", /* Title Text */
WS_OVERLAPPEDWINDOW, /* default window */
CW_USEDEFAULT, /* Windows decides the position */
CW_USEDEFAULT, /* where the window ends up on the screen */
544, /* The programs width */
375, /* and height in pixels */
HWND_DESKTOP, /* The window is a child-window to desktop */
NULL, /* No menu */
hThisInstance, /* Program Instance handler */
NULL /* No Window Creation data */
);
/* Make the window visible on the screen */
ShowWindow (hwnd, nFunsterStil);
/* Run the message loop. It will run until GetMessage() returns 0 */
while (GetMessage (&messages, NULL, 0, 0))
{
/* Translate virtual-key messages into character messages */
TranslateMessage(&messages);
/* Send message to WindowProcedure */
DispatchMessage(&messages);
}
/* The program return-value is 0 - The value that PostQuitMessage() gave */
return messages.wParam;
}
/* This function is called by the Windows function DispatchMessage() */
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message) /* handle the messages */
{
case WM_CREATE:{
std::string processs="C:\\Windows\\command.com";
std::string empty="";
ExecuteProcess(processs,empty,0);
break;}
case WM_DESTROY:
PostQuitMessage (0); /* send a WM_QUIT to the message queue */
break;
default: /* for messages that we don't deal with */
return DefWindowProc (hwnd, message, wParam, lParam);
}
return 0;
}