【问题标题】:How to run batch file(.bat) or batch code in C++ program?如何在 C++ 程序中运行批处理文件(.bat)或批处理代码?
【发布时间】:2017-03-28 23:32:31
【问题描述】:

在 Windows API(windows.h 头文件)的帮助下,我正在使用 Dev C++ SDK 用 C++ 语言创建一个大学项目。

我必须创建一个包含一个按钮的窗口界面,并且我想使用该按钮打开一个批处理文件 (.bat) 或运行存储在程序中的批处理代码。

我使用 Zetcode 博客上的 Windows API 教程创建了一个带有按钮的窗口。

但我无法使用该按钮打开批处理文件 (.bat) 或运行存储在程序中的批处理代码。 请告诉我在我的项目中实现这一点的代码。我正在添加我的程序代码和我的程序的屏幕截图。

#include <windows.h>

/* This is where all the input to the window goes to */
LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) {
switch(Message) {

    case WM_CREATE:

        CreateWindow(TEXT("button"), TEXT("Disable USB"),
            WS_VISIBLE | WS_CHILD,
            10, 10, 100, 25,
            hwnd, (HMENU) 1, NULL, NULL

        );

        CreateWindow(TEXT("button"), TEXT("Enable Firewall"),
            WS_VISIBLE | WS_CHILD,
            120, 10, 120, 25,
            hwnd, (HMENU) 2, NULL, NULL

        );

        break;

    case WM_COMMAND:

        // I need code which i can write here to execute batch code or run a bat file (.bat).

        break;

    /* Upon destruction, tell the main thread to stop */
    case WM_DESTROY: {
        PostQuitMessage(0);
        break;
    }

    /* All other messages (a lot of them) are processed using default procedures */
    default:
        return DefWindowProc(hwnd, Message, wParam, lParam);
}
return 0;
}

/* The 'main' function of Win32 GUI programs: this is where execution starts */
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
WNDCLASSEX wc; /* A properties struct of our window */
HWND hwnd; /* A 'HANDLE', hence the H, or a pointer to our window */
MSG msg; /* A temporary location for all messages */

/* zero out the struct and set the stuff we want to modify */
memset(&wc,0,sizeof(wc));
wc.cbSize        = sizeof(WNDCLASSEX);
wc.lpfnWndProc   = WndProc; /* This is where we will send messages to */
wc.hInstance     = hInstance;
wc.hCursor       = LoadCursor(NULL, IDC_ARROW);

/* White, COLOR_WINDOW is just a #define for a system color, try Ctrl+Clicking it */
wc.hbrBackground = (GetSysColorBrush(COLOR_3DFACE));
wc.lpszClassName = "WindowClass";
wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION); /* Load a standard icon */
wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION); /* use the name "A" to use the project icon */

if(!RegisterClassEx(&wc)) {
    MessageBox(NULL, "Window Registration Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);
    return 0;
}

hwnd = CreateWindowEx(WS_EX_CLIENTEDGE,"WindowClass","System Hardening Tool",WS_VISIBLE|WS_SYSMENU|WS_MINIMIZEBOX|WS_MAXIMIZEBOX,
    CW_USEDEFAULT, /* x */
    CW_USEDEFAULT, /* y */
    640, /* width */
    480, /* height */
    NULL,NULL,hInstance,NULL);

if(hwnd == NULL) {
    MessageBox(NULL, "Window Creation Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);
    return 0;
}

/*
    This is the heart of our program where all input is processed and 
    sent to WndProc. Note that GetMessage blocks code flow until it receives something, so
    this loop will not produce unreasonably high CPU usage
*/
while(GetMessage(&msg, NULL, 0, 0) > 0) { /* If no error is received... */
    TranslateMessage(&msg); /* Translate key codes to chars if present */
    DispatchMessage(&msg); /* Send it to WndProc */
}
return msg.wParam;
}

截图:

带有对话框和按钮的我的项目窗口

程序代码

【问题讨论】:

标签: c++ batch-file winapi dev-c++


【解决方案1】:

有很多选项可以启动一个新进程。例如,您可以使用 system 函数、spawn 函数,也可以使用 Win32 API 中的 CreateProcess。它们采用不同的参数,并且行为可能略有不同。他们各自的文档应该详细说明确切的行为,这取决于您传递的参数。

请注意,由于您将在 windows 函数处理程序中运行新进程,因此如果您使用阻塞调用(例如使用 system),启动该进程的窗口将冻结,直到执行的进程退出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-07
    • 2016-04-08
    • 2017-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多