开发者

How Do I Compile a C Program to Run Without a Command Box?

开发者 https://www.devze.com 2023-02-27 01:51 出处:网络
I need a very simple program to run on any version of Windows, let\'s say >= Win 98, without requiring any pre-installed framework like dotnet. I thought C would be a great idea to do this.

I need a very simple program to run on any version of Windows, let's say >= Win 98, without requiring any pre-installed framework like dotnet. I thought C would be a great idea to do this.

The program should start a process from the parent directory by using a system command.

Start C program (invisible) > program starts process > program exits

开发者_JAVA技巧

This is how it looks:

#include <stdio.h>
#include <stdlib.h>

int main() {
    system("..\\someprogram.exe");
    return 0;
}

I call this program from a Flash projector, which only allows to start programs in a specific subfolder "fscommand" – but I have to start a process located in the same directory as the projector.

Anyway, it works fine! But the C program opens a command box, then starts the process and leaves the command box open as long as the process runs. So here is how it should work, in order how i would appreciate it:

  1. Do not open a command box at all (I'd like that, really ;)
  2. Both 3) and 4)
  3. Close the command box after starting the process (exit the C program)
  4. Open the command box minimized by default

I can't change any Windows settings for the C executable or use a shortcut, as this will run directly from a CD later.

I use Open Watcom to compile my program. Both image types (target options) that produce an executable (Character-mode Executable / Windowed Executable) have the same result.


I did a google search and found http://www.ntwind.com/software/utilities/hstart.html

Your using a console app, you could change it to a windows app using winmain()

You can use a shortcut to a file in the same folder, not sure why your discounting that method.

start will give you a fork so your intermediate app can close - not sure about win98 tho.

system("start ..\\someprogram.exe");

Instead of system you can use createProcess to launch the app, theis will avoid the system commands console.

STARTUPINFO si;
PROCESS_INFORMATION pi;

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

// Start the child process. 
if( !CreateProcess( "..\\someprogram.exe",   // module name 
    NULL,        // 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.  In your case you don't care to wait anyway
// WaitForSingleObject( pi.hProcess, INFINITE );

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


The console window shows up because you built your program as a console application. I don't know how to avoid that in C, but in Delphi is was a simple {$Console Off} pragma in the project file.

GCC has a command line option -mwindows, which I think achieves the same, so you could search into this direction.


I think the _exec and/or _spawn functions do what you need, though I'm not sure.

If not, you can always use CreateProcess, though it can be a little more tedious in some ways.


You could (for example) use hstart instead of your own program to start that exe.

(This would result in no black box at all.)


CreateProcess with CREATE_NO_WINDOW flag is what you want, but I want to add something. To support also cmd style commands (such as DIR, SET, ... ) which have no executables and can't be passed to CreateProcess alone, you should call cmd.exe /C someprogram where someprogram is name of executable, bat file, or command.


A friend came up with a completely different solution. Now I use AutoIt with a short compiled script to start the process. This is very simple and the launcher process is completely invisible. :)

filename = ..\someprogram.exe

if FileExist(filename) {    
    Run, open %filename%
}
0

精彩评论

暂无评论...
验证码 换一张
取 消