如何在没有命令框的情况下编译C程序?

时间:2011-04-17 09:03:30

标签: c process command-prompt

我需要一个非常简单的程序才能在任何版本的Windows上运行,比如说> = Win 98,而不需要任何预先安装的框架,如dotnet。我认为做这个是个好主意。

程序应该使用系统命令从父目录启动进程。

  

启动C程序(不可见)>程序启动过程>程序退出

它的外观如下:

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

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

我从Flash投影机调用此程序,只允许在特定子文件夹“fscommand”中启动程序 - 但我必须启动与投影机位于同一目录中的进程。

无论如何,它运作正常!但是C程序打开一个命令框,然后启动进程并在进程运行时保持命令框打开。所以这是它应该如何工作,以便我如何欣赏它:

  1. 根本不要打开命令框(我真的很喜欢;)
  2. 3)和4)
  3. 启动进程后退出命令框(退出C程序)
  4. 打开默认情况下最小化的命令框
  5. 我无法更改C可执行文件的任何Windows设置或使用快捷方式,因为这将直接从CD运行。

    我使用Open Watcom编译我的程序。生成可执行文件的两种图像类型(目标选项)(字符模式可执行文件/窗口化可执行文件)具有相同的结果。

6 个答案:

答案 0 :(得分:0)

认为 _exec和/或_spawn函数可以满足您的需求,但我不确定。

如果没有,您可以随时使用CreateProcess,但在某些方面可能会更乏味。

答案 1 :(得分:0)

您可以(例如)使用hstart代替您自己的程序来启动该exe。

(这将导致根本没有黑盒子。)

答案 2 :(得分:0)

我进行了谷歌搜索并找到了http://www.ntwind.com/software/utilities/hstart.html

您使用控制台应用,可以使用winmain()

将其更改为Windows应用

您可以使用同一文件夹中文件的快捷方式,不确定为什么要对该方法进行折扣。

start会给你一个分叉,所以你的中间应用可以关闭 - 不确定win98 tho。

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

您可以使用createProcess来启动应用程序而不是系统,而不会使用system命令控制台。

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 );

答案 3 :(得分:0)

带有CreateProcess标志的

CREATE_NO_WINDOW是您想要的,但我想添加一些东西。要支持cmd样式命令(例如DIRSET,...),这些命令没有可执行文件且无法单独传递给CreateProcess,您应该调用{{1}其中cmd.exe /C someprogram是可执行文件,bat文件或命令的名称。

答案 4 :(得分:0)

控制台窗口显示,因为您将程序构建为控制台应用程序。我不知道如何在C中避免这种情况,但在Delphi中,项目文件中只是一个简单的{$Console Off}编译指示。

GCC有一个命令行选项-mwindows,我认为它实现了相同的目的,所以你可以搜索到这个方向。

答案 5 :(得分:0)

一位朋友想出了一个完全不同的解决方案。现在我使用AutoIt和一个简短的编译脚本来启动该过程。这非常简单,启动过程完全不可见。 :)

filename = ..\someprogram.exe

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