2011-04-17 120 views
0

我需要一个非常简单的程序来运行在任何版本的Windows上,比如说> = Win 98,而不需要像dotnet这样的预安装框架。我认为C会是一个好主意。如何编译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. 打开默认最小化命令框关闭命令框

我不能改变任何的Windows设置为C可执行文件或使用快捷方式,如这将在稍后直接从​​CD中运行。

我使用Open Watcom来编译我的程序。产生可执行文件的两种图像类型(目标选项)(Character-mode Executable/Windowed Executable)具有相同的结果。

+0

您是否看到? http://stackoverflow.com/questions/411247/running-a-cmd-or-bat-in-silent-mode批处理文件应该做的伎俩。 – tjameson 2011-04-17 09:07:55

+0

还是这个? http://superuser.com/questions/62525/run-a-completly-hidden-batch-file – 2011-04-17 09:18:31

+0

不幸的是,由于安全原因,Flash不允许使用参数调用可执行文件。只有不带参数的exe和bat-calls是可能的。 (这是Adobe有史以来最伟大的想法之一。)我有一个很好的解决方案,使用批处理文件而不是C程序。这在手动启动蝙蝠时起作用。但是从Flash中调用它时,它并没有启动这个过程。 -.- – Bert 2011-04-17 11:00:19

回答

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

)使用WinMain()听起来合乎逻辑,但仍然产生一个命令框:(Addes行:'#include '和'int WINAPI WinMain(HINSTANCE hI,HINSTANCE hPrI,PSTR szCmdLine,int iCmdShow)' – Bert 2011-04-17 11:42:23

+0

这个小变化'system(“start .. \\ someprogram.exe”);'适合我聆听的行为#3。我没有尝试其余部分,因为在此期间我发现了一个更简单的解决方案。 – Bert 2011-04-21 18:17:35

0

认为_exec和/或_spawn功能做你所需要的,但我不知道。

如果不是,您可以随时使用CreateProcess,尽管在某些方面它可能会更乏味一些。

0

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

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

+0

这会很棒,但Flash不支持应用程序调用的参数(请参阅上面的我的评论)。 ( – Bert 2011-04-17 11:10:20

0

CreateProcessCREATE_NO_WINDOW标志是你想要的,但我想补充一下。为了支持没有可执行文件且不能单独传递到CreateProcess的cmd样式命令(如DIR,SET,...),应该调用cmd.exe /C someprogram,其中someprogram是可执行文件,bat文件或命令的名称。

+0

Isn – 2011-04-17 09:33:46

+1

没有@Roland系统也等待创建的进程结束,但通过CreateProcess你可以在主进程中做一些事情,直到新进程正在运行 – 2011-04-17 09:40:11

0

由于您将程序构建为控制台应用程序,控制台窗口显示出来。我不知道如何避免在C中,但在德尔福是一个简单的{$Console Off}编译指示在项目文件中。

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

+0

听起来不错,尽管我没有在开放Watcom中找不到像这样的东西。:) – Bert 2011-04-21 18:20:54

0

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

filename = ..\someprogram.exe 

if FileExist(filename) {  
    Run, open %filename% 
} 
相关问题