如何编译一个没有命令框的C程序



我需要一个非常简单的程序,可以在任何版本的Windows上运行,假设>= win98,而不需要任何预装框架,如dotnet。我觉得用C语言来做这个很好。

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

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

是这样的:

#include <stdio.h>
#include <stdlib.h>
int main() {
    system("..\someprogram.exe");
    return 0;
}

我从一个Flash投影仪中调用这个程序,它只允许启动特定子文件夹"fscommand"中的程序-但是我必须启动与投影仪位于同一目录的进程。

不管怎样,它工作得很好!但是C程序打开一个命令框,然后启动进程,只要进程运行,命令框就保持打开状态。下面是它应该如何工作,以便我如何欣赏它:

  1. 完全不要打开命令框(我希望这样,真的;)
  2. 3)和4)
  3. 启动进程后关闭命令框(退出C程序)
  4. 打开默认最小化的命令框

我不能更改C可执行文件的任何Windows设置或使用快捷方式,因为这将直接从CD上运行。

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

我做了一个谷歌搜索,找到http://www.ntwind.com/software/utilities/hstart.html

如果你使用的是控制台应用程序,你可以使用winmain()将其更改为windows应用程序

您可以使用快捷方式到同一文件夹中的文件,不知道为什么要使用这种方法。

start将给你一个分支,这样你的中间应用程序可以关闭-不确定win98。

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

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

GCC有一个命令行选项-mwindows,我认为它达到了同样的效果,所以你可以往这个方向搜索。

认为 _exec和/或_spawn函数做你需要的,虽然我不确定。

如果没有,您总是可以使用CreateProcess,尽管它在某些方面可能有点乏味。

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

(这将导致根本没有黑框)

CreateProcessCREATE_NO_WINDOW标志是你想要的,但我想添加一些东西。也支持cmd风格的命令(如DIR, SET,…)如果没有可执行文件并且不能单独传递给CreateProcess,则应该调用cmd.exe /C someprogram,其中someprogram是可执行文件,bat文件或命令的名称。

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

filename = ..someprogram.exe
if FileExist(filename) {    
    Run, open %filename%
}

相关内容

  • 没有找到相关文章

最新更新