Urgent!!!! how to use system()?

Hi,

i want to use system() to invoke some (dos) application in my VC++ (MFC) program.
i do not want the dos window to appear, a friend told me use system in the following way:

      char command[800];
               CString fname="D:\\sp\\hyp\\database\\names\\93";
              sprintf (command, "open_C45 -f %s > tmpC45tree",                         (LPCTSTR)fname);
      system (command);  

but it does not work, the dos window still appears. any one knows how to do that?

another problem is:
dose the dos application must exist in my current directory? say my .dsw file is "D:\\sp\\a\\prog.dsw",
then must the application (open_C45 mentioned above) also in the same directory as my project workspace?

pls help me as i need to demo to my supervisor soon.

ur help is really greately appreciated!!!
greenbirdAsked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

stefanrCommented:
I do not think it is possible with system, but you can use ShellExecute, ShellExecuteEx, or CreateProcess to gain greater control over your spawned process, for example

HINSTANCE hInstance = ::ShellExecute(NULL, NULL, "CMD.EXE", "/C DIR C:\\WINNT\\SYSTEM32 > C:\\TEMP\\DIR.TXT", "C:\\", SW_HIDE);

if (DWORD(hInstance) > 32)
{
   std::cout << "SUCCESSFUL !" << std::endl;
}
else
{
   std::cerr << "FAILURE. The Error Code is " << DWORD(hInstance) << std::endl;
}
0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
greenbirdAuthor Commented:
hi,stefanr,

i think ur suggestion is very good, but how come i can not find the help topic for shellexecute??? cannot find it.
could u pls provide a bit more information?

thanks a lot!
0
stefanrCommented:
This is what MSDN Library says about ShellExecute (it can also be found at http://msdn.microsoft.com/library; Platform SDK->User Interface Services->Windows Shell->Shell Reference->Shell Functions):

"ShellExecute
Performs an operation on a specified file.

HINSTANCE ShellExecute(
    HWND hwnd,
    LPCTSTR lpVerb,
    LPCTSTR lpFile,
    LPCTSTR lpParameters,
    LPCTSTR lpDirectory,
    INT nShowCmd
);

Parameters
hwnd
Handle to a parent window. This window receives any message boxes that an application produces. For example, an application may report an error by producing a message box.
lpVerb
A string, referred to as a verb, that specifies the action to be performed. The set of available verbs depends on the particular file or folder. It includes the commands listed in the context menu and the registry. See Extending Context Menus for further discussion of context menus. The following verbs are usually valid: Verb Description
edit  Opens an editor. If lpFile is not a document file, the function will fail.
explore The function explores the folder specified by lpFile.  
open  The function opens the file specified by the lpFile parameter. The file can be an executable file or a document file. It can also be a folder.
print  The function prints the document file specified by lpFile. If lpFile is not a document file, the function will fail.
properties  Displays the file or folder's properties.

If you set this paramater to NULL:

For systems prior to Windows 2000, the "open" verb is used if available. If not, the default verb is used.
For Windows 2000 and later systems, "open" is used if available. If not, the default verb is used. If neither verb is available, the system uses first verb listed in the registry.
lpFile
Address of a null-terminated string that specifies the file to open or print or the folder to open or explore. The function can open an executable file or a document file. The function can print a document file.
lpParameters
If the lpFile parameter specifies an executable file, lpParameters is an address to a null-terminated string that specifies the parameters to be passed to the application.The format of this string is determined by the verb that is to be invoked. If lpFile specifies a document file, lpParameters should be NULL.
lpDirectory
Address of a null-terminated string that specifies the default directory.
nShowCmd
Flags that specify how an application is to be displayed when it is opened. If lpFile specifies a document file, the flag is simply passed to the associated application. It is up to the application to decide how to handle it. SW_HIDE  Hides the window and activates another window.
SW_MAXIMIZE  Maximizes the specified window.
SW_MINIMIZE  Minimizes the specified window and activates the next top-level window in the z-order.
SW_RESTORE  Activates and displays the window. If the window is minimized or maximized, Windows restores it to its original size and position. An application should specify this flag when restoring a minimized window.
SW_SHOW  Activates the window and displays it in its current size and position.  
SW_SHOWDEFAULT  Sets the show state based on the SW_ flag specified in the STARTUPINFO structure passed to the CreateProcess function by the program that started the application. An application should call ShowWindow with this flag to set the initial show state of its main window.
SW_SHOWMAXIMIZED  Activates the window and displays it as a maximized window.
SW_SHOWMINIMIZED  Activates the window and displays it as a minimized window.
SW_SHOWMINNOACTIVE  Displays the window as a minimized window. The active window remains active.
SW_SHOWNA  Displays the window in its current state. The active window remains active.
SW_SHOWNOACTIVATE  Displays a window in its most recent size and position. The active window remains active.
SW_SHOWNORMAL  Activates and displays a window. If the window is minimized or maximized, Windows restores it to its original size and position. An application should specify this flag when displaying the window for the first time.

Return Values
Returns a value greater than 32 if successful, or an error value that is less than or equal to 32 otherwise. The following table lists the error values. The return value is cast as an HINSTANCE for backward compatibility with 16-bit Microsoft. Windows. applications. It is not a true HINSTANCE, however. The only thing that can be done with the returned HINSTANCE is to cast it to an integer and compare it with the value 32 or one of the error codes below.

0  The operating system is out of memory or resources.
ERROR_FILE_NOT_FOUND  The specified file was not found.
ERROR_PATH_NOT_FOUND  The specified path was not found.
ERROR_BAD_FORMAT  The .exe file is invalid (non-Win32. .exe or error in .exe image).
SE_ERR_ACCESSDENIED  The operating system denied access to the specified file.  
SE_ERR_ASSOCINCOMPLETE  The file name association is incomplete or invalid.
SE_ERR_DDEBUSY  The DDE transaction could not be completed because other DDE transactions were being processed.
SE_ERR_DDEFAIL  The DDE transaction failed.
SE_ERR_DDETIMEOUT  The DDE transaction could not be completed because the request timed out.
SE_ERR_DLLNOTFOUND  The specified dynamic-link library was not found.  
SE_ERR_FNF  The specified file was not found.  
SE_ERR_NOASSOC  There is no application associated with the given file name extension. This error will also be returned if you attempt to print a file that is not printable.
SE_ERR_OOM  There was not enough memory to complete the operation.
SE_ERR_PNF  The specified path was not found.
SE_ERR_SHARE  A sharing violation occurred.

Remarks
This method allows you to execute any commands in a folder's context menu or stored in the registry.

To open a folder, use either of the following calls:

ShellExecute(handle, NULL, path_to_folder, NULL, NULL, SW_SHOWNORMAL);

or

ShellExecute(handle, "open", path_to_folder, NULL, NULL, SW_SHOWNORMAL);

To explore a folder, use:

ShellExecute(handle, "explore", path_to_folder, NULL, NULL, SW_SHOWNORMAL);

If lpOperation is NULL, the function opens the file specified by lpFile. If lpOperation is "open" or "explore", the function will attempt to open or explore the folder.

With multiple monitors, if you specify the window handle and set lpOperation to "Properties", any windows created by ShellExecute may not appear in the correct position.

To obtain information about the application that is launched as a result of calling ShellExecute, use ShellExecuteEx.

See Also
IShellExecuteHook

Requirements
  Windows NT/2000: Requires Windows NT 3.1 or later.
  Windows 95/98: Requires Windows 95 or later.
  Windows CE: Unsupported.
  Header: Declared in shellapi.h.
  Import Library: shell32.lib.
"
0
Cloud Class® Course: CompTIA Cloud+

The CompTIA Cloud+ Basic training course will teach you about cloud concepts and models, data storage, networking, and network infrastructure.

greenbirdAuthor Commented:
Hi,

thanks for ur help! but i still got errors:

my exe file is in:
D:\\sp\\hyp\\backup00\\debug\\open_C45.exe

the parameters to be passed to the exe is:

-f filename -t

so i use :
HINSTANCE hInstance = ::ShellExecute(NULL, NULL, "D:\\sp\\hyp\\backup00\\debug\\open_C45 ", "-f D:\\sp\\hyp\\database\\names\\93 -t", "D:\\sp\\hyp",
                      SW_HIDE);

i do not quite understand the last 2 parameter ( default directory), what does it mean?

also i shld use open_C45 instead of open_C45.exe rite?

but it always gives me failure mesg.

could u pls help? thanks!
0
stefanrCommented:
Is it ShellExecute that gives you the error, or is it open_C45 ? If it is ShellExecute, what is the error code (== DWORD(hInstance)) ?

The default directory is the start-up directory for the application, i.e. if the directory contains the EXE file, you only have to give the lpFile parameter the string "open_C45.exe". If the default directory is not the EXE file directory, you have to qualify the lpFile with the directory path (unless it is in the PATH). In that case it is the directory where any file is read from or written to if the application internally don't qualify the file names with a directory path.

You can drop the .exe extension in the file name if you want.
0
greenbirdAuthor Commented:
Hi,

i am very sure that it is not open_C45 who gives the error:) coz i can run it using system().

the error code is 2.

so is the following correct? (say open_C45.exe is in directory: d:\\sp\\hyp\\backup00\\debug
and the parameters for the program is :
-f filename -t (so the command line shld be :
open_C45 -f D:\\sp\\hyp\\database\\names\\93 -t)

HINSTANCE hInstance = ::ShellExecute(NULL, NULL, "open_C45 ", "-f
                      D:\\sp\\hyp\\database\\names\\93 -t",                       "D:\\sp\\hyp\\backup00\\debug",
                                            SW_HIDE);

what is the cause of the error?? pls help! thanks a lot!
0
SadhuCommented:
I think CreateProcess Gives more control than ShellExecute. Look in msdn for CreateProcess.
0
stefanrCommented:
Error code 2 is the same as ERROR_FILE_NOT_FOUND "The system cannot find the file specified."

Something must be wrong with the directory paths.

The most powerful function (and complicated) to use is CreateProcess, but if you want to make a try:

STARTUPINFO StartupInfo = { 0 };
PROCESS_INFORMATION ProcessInformation = { 0 };

StartupInfo.cb = sizeof(StartupInfo);
StartupInfo.dwFlags = STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow = SW_HIDE;

if (::CreateProcess(NULL, "D:\\sp\\hyp\\backup00\\debug\\open_C45 -f D:\\sp\\hyp\\database\\names\\93 -t", NULL, NULL, FALSE, 0, NULL, "D:\\sp\\hyp\\backup00\\debug", &StartupInfo, &ProcessInformation))
{
   ::CloseHandle(ProcessInformation.hProcess); // OBS!
   ::CloseHandle(ProcessInformation.hThread); // OBS!
}
0
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
System Programming

From novice to tech pro — start learning today.