3

相互運用サービスとのもつれを避けるために(私の理解を超えて)私は使用します

spawnl(P_DETACH, MyPath, "MyProg.exe", 0);

VS アンマネージ C++ コマンド ライン プロジェクトを生成します。(製造元の DLL を介してアストロ カメラを制御します)。

ウィンドウは必要ありませんし、したくありません (メインの GUI プログラムから名前付きパイプを使用して myprog.exe に話しかけます)。

GUI からウィンドウを抑制するのは些細なことですが、(私の理解を超えて) マーシャリングの問題との絡み合いを避けるために、myprog.exe はCLI プロジェクトではなく、アンマネージネイティブ C++ コマンド ライン プロジェクトである必要があります。

バッチ ファイルまたは python からウィンドウを非表示にすることに関する膨大な文献があり、Windows プロジェクトでウィンドウを閉じることは簡単ですが、ここでは関係ありません。

myprog.exe をデタッチして生成しましたが、それは関係ありません。コンソール ハンドルを閉じると正常に実行されますが、ウィンドウは閉じません。

画面上の黒い DOS ボックスを決して開かない方法、または myprog.exe を閉じずに閉じる方法について何か考えはありますか?

4

1 に答える 1

1

次のようなことを試してください:

#define WIN32_LEAN_AND_MEAN
#include <windows.h>

#include <stdio.h>

void system_error(char *name) {
// Retrieve, format, and print out a message from the last errror.
// The `name' that's passed should be in the form of a present tense
// noun (phrase) such as "opening file".
//
    char *ptr = NULL;
    FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER |
        FORMAT_MESSAGE_FROM_SYSTEM,
        0, GetLastError(), 0, (char *)&ptr, 1024, NULL);

    printf("\nError %s: %s\n", name, ptr);
    LocalFree(ptr);
}

PROCESS_INFORMATION p;

BOOL WINAPI die(DWORD reason) {
    TerminateProcess(p.hProcess, 1);
    return TRUE;
}

int main(int argc, char **argv) {

    STARTUPINFO s;

    memset(&s, 0, sizeof s);
    s.cb = sizeof(s);

    if (!CreateProcess(argv[1], argv[2], NULL, NULL, TRUE,
        DETACHED_PROCESS, NULL, NULL, &s, &p))
    {
        system_error("Spawning program");
        return 1;
    }

    SetConsoleCtrlHandler(die, TRUE);

    WaitForSingleObject(p.hProcess, INFINITE);
    return 0;
}
于 2013-07-06T03:11:12.027 に答える