我需要一个非常简单的程序,可以在任何版本的Windows上运行,假设>= win98,而不需要任何预装框架,如dotnet。我觉得用C语言来做这个很好。
程序应该使用系统命令从父目录启动一个进程。
启动C程序(不可见)>程序启动进程>程序退出
是这样的:
#include <stdio.h>
#include <stdlib.h>
int main() {
system("..\someprogram.exe");
return 0;
}
我从一个Flash投影仪中调用这个程序,它只允许启动特定子文件夹"fscommand"中的程序-但是我必须启动与投影仪位于同一目录的进程。
不管怎样,它工作得很好!但是C程序打开一个命令框,然后启动进程,只要进程运行,命令框就保持打开状态。下面是它应该如何工作,以便我如何欣赏它:
- 完全不要打开命令框(我希望这样,真的;)
- 3)和4)
- 启动进程后关闭命令框(退出C程序)
- 打开默认最小化的命令框
我不能更改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。
(这将导致根本没有黑框)
CreateProcess
与CREATE_NO_WINDOW
标志是你想要的,但我想添加一些东西。也支持cmd风格的命令(如DIR
, SET
,…)如果没有可执行文件并且不能单独传递给CreateProcess
,则应该调用cmd.exe /C someprogram
,其中someprogram
是可执行文件,bat文件或命令的名称。
一个朋友想出了一个完全不同的解决方案。现在我使用AutoIt和一个简短的编译脚本来启动这个过程。这是非常简单的,启动过程是完全不可见的。:)
filename = ..someprogram.exe
if FileExist(filename) {
Run, open %filename%
}