我需要一个非常简单的程序才能在任何版本的Windows上运行,比如说> = Win 98,而不需要任何预先安装的框架,如dotnet。我认为做这个是个好主意。
程序应该使用系统命令从父目录启动进程。
启动C程序(不可见)>程序启动过程>程序退出
它的外观如下:
#include <stdio.h>
#include <stdlib.h>
int main() {
system("..\\someprogram.exe");
return 0;
}
我从Flash投影机调用此程序,只允许在特定子文件夹“fscommand”中启动程序 - 但我必须启动与投影机位于同一目录中的进程。
无论如何,它运作正常!但是C程序打开一个命令框,然后启动进程并在进程运行时保持命令框打开。所以这是它应该如何工作,以便我如何欣赏它:
我无法更改C可执行文件的任何Windows设置或使用快捷方式,因为这将直接从CD运行。
我使用Open Watcom编译我的程序。生成可执行文件的两种图像类型(目标选项)(字符模式可执行文件/窗口化可执行文件)具有相同的结果。
答案 0 :(得分:0)
我认为 _exec和/或_spawn函数可以满足您的需求,但我不确定。
如果没有,您可以随时使用CreateProcess,但在某些方面可能会更乏味。
答案 1 :(得分:0)
您可以(例如)使用hstart代替您自己的程序来启动该exe。
(这将导致根本没有黑盒子。)
答案 2 :(得分:0)
我进行了谷歌搜索并找到了http://www.ntwind.com/software/utilities/hstart.html
您使用控制台应用,可以使用winmain()
您可以使用同一文件夹中文件的快捷方式,不确定为什么要对该方法进行折扣。
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样式命令(例如DIR
,SET
,...),这些命令没有可执行文件且无法单独传递给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%
}