2009-10-20 3 views
12

私はDev-C++でCプログラムをコーディングしており、Windows(CMD)コマンドを使用する必要があります。簡単ですが、system()関数のコマンドが実行されると、プログラムは実行時にコンソールを実行します。Cシステム()関数のコンソールを非表示にする

例:

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

    int main() 
    { 
     system("if not exist c:\my_docs\doc.txt (xcopy /Y doc.txt c:\my_docs\)"); // Cmd command 
     system("pause"); 
     return 0; 
    } 

は、他の機能が存在するか、しない変更は、コンソールを示して?

ありがとう!宜しくお願いします。

+6

Dev C++は廃止されました。他のものを選ぶことを強くお勧めします。 – KeatsPeeks

+0

コンソールウィンドウが表示されていない場合、「一時停止」コマンドがどのように機能すると思いますか? また、cmd.exeはコンソールアプリケーションです。コンソールウィンドウが表示されないようにする簡単な方法はありません。 –

+0

@Larry Osterman、SO Larryでお会いしましょう。私はブログを楽しむ! – BobbyShaftoe

答えて

12

CreateProcessで実行できます。

STARTUPINFOW si; 
PROCESS_INFORMATION pi; 

ZeroMemory(&si, sizeof(si)); 
si.cb = sizeof(si); 
ZeroMemory(&pi, sizeof(pi)); 

if (CreateProcessW(command, arg, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi)) 
{ 
    WaitForSingleObject(pi.hProcess, INFINITE); 
    CloseHandle(pi.hProcess); 
    CloseHandle(pi.hThread); 
} 
+0

+1ありがとう、私はそれをテストします。それはまさに私が探していたものではありませんが、良い答えです。 – a0rtega

+1

* Windows 7 *でコードを試しましたが、うまくいきません。私は実行したい** adbシェル放送中 - NotifyServiceStart **。ちなみに、** adb **を** PATH **に追加し、** system()**はこの行をうまく実行できます。 – chenzhongpu

+0

http://msdn.microsoft.com/en-ca/library/windows/desktop/ms682425%28v=vs.85%29.aspx "実行するモジュールのフルパスとファイル名を指定できます部分的な名前の場合、関数は現在のドライブと現在のディレクトリを使用して指定を完了しますが、関数は検索パスを使用しません。このパラメータにはファイル名の拡張子を含める必要があります。拡張が仮定される。" –

3

FigBugが述べたように、のCreateProcess()が移動するための方法ですが、私はif文のCreateProcess()はシェルを実行できるとは思いません。あなたはコマンドとしてそれをこのような何かを渡す必要があります。

"cmd.exe /c \"if not exist c:\my_docs\doc.txt (xcopy /Y doc.txt c:\my_docs\)\"" 

しかし、よりよい解決策は、ファイルが存在し、CopyFile()がそれをコピーするかどうかをテストするCreateFile()を使用するかもしれません。

+0

+1最後に私はこのケースでは最高の解決策でした。 – a0rtega

10

system("cmd command")の代わりにWinExec("your cmd command", SW_HIDE);を使用できます。

+1

これはWindows XPでは動作しませんでした... –

+0

ありがとうございます。私は16ビットWindowsの時代ですが、この機能を忘れています。 CreateProcess()がMSによって許可されていないWIndows LogOn(Cred。Provider DLL)の重要なシナリオでは便利で、system()は背面にコンソールウィンドウを持っています。あなた! – BuddhaLight

0

注:私の答えは必ずしも特定の質問に合わせて調整されているわけではありませんが、このQ &は、「コマンドプロンプトなしのWindowsシステム」などの類似のクエリの場合は、先頭がGoogle resultです。

新しいcmd.exeウィンドウを使用せずにコマンドを実行する方法です。 Roland Rabien's answerMSDNに基づいて、私は働く関数を書いた。

int windows_system(const char *cmd) 
{ 
    PROCESS_INFORMATION p_info; 
    STARTUPINFO s_info; 
    LPSTR cmdline, programpath; 

    memset(&s_info, 0, sizeof(s_info)); 
    memset(&p_info, 0, sizeof(p_info)); 
    s_info.cb = sizeof(s_info); 

    cmdline  = _tcsdup(TEXT(cmd)); 
    programpath = _tcsdup(TEXT(cmd)); 

    if (CreateProcess(programpath, cmdline, NULL, NULL, 0, 0, NULL, NULL, &s_info, &p_info)) 
    { 
    WaitForSingleObject(p_info.hProcess, INFINITE); 
    CloseHandle(p_info.hProcess); 
    CloseHandle(p_info.hThread); 
    } 
} 

すべてのWindowsプラットフォームで動作します。ちょうどあなたのように電話してくださいsystem()

関連する問題