VC下面执行DOS命令

本文参考如下文档:

vc下执行DOS命令

vc下执行DOS命令

后者也是转载前者,但代码排版看起来好一些。

在上面的基础上,又对代码做了一点改动,主要是加了日志文件,方便看到DOS命令中间执行结果。

下面的示例代码是以VC6为例,一个workspace中包括两个project,一个是简单的MFC对话框,另外一个是执行dos命令的lib。lib的宏定义参考了pcre的风格,参考Windows上面编译pcre的步骤

lib包括两个文件:DosCommand.h,.c。代码如下:

DosCommand.h:

#ifndef __DOS_COMMAND_H
#define __DOS_COMMAND_H


#ifndef DOS_COMMAND_EXP_DECL
#  ifdef _WIN32
#    ifndef DOS_COMMAND_STATIC
#      define DOS_COMMAND_EXP_DECL extern __declspec(dllimport)
#    endif
#  endif
#endif

/* By default, we use the standard "extern" declarations. */

#ifndef DOS_COMMAND_EXP_DECL
#  ifdef __cplusplus
#    define DOS_COMMAND_EXP_DECL       extern "C"
#  else
#    define DOS_COMMAND_EXP_DECL       extern
#  endif
#endif

/* Have to include stdlib.h in order to ensure that size_t is defined;
it is needed here for malloc. */

#include <stdlib.h>

/* Allow for C++ users */

#ifdef __cplusplus
extern "C" {
#endif



#include <windows.h>

/*

The output of the dos command will be writen to a file specified by <fileName>.

e.g.: 
command: ipconfig /all
fileName: c:\\test.txt
*/
DOS_COMMAND_EXP_DECL BOOL ExecuteDosCommand(const char* command, const char* fileName);


#ifdef __cplusplus
}  /* extern "C" */
#endif

#endif

DosCommand.cpp的代码:

#include "DosCommand.h"

#ifndef DOS_COMMAND_EXP_DECL
#  ifdef _WIN32
#    ifdef DLL_EXPORT
#      define DOS_COMMAND_EXP_DECL       extern __declspec(dllexport)
#      define DOS_COMMAND_EXP_DEFN       __declspec(dllexport)
#      define DOS_COMMAND_EXP_DATA_DEFN  __declspec(dllexport)
#    else
#      define DOS_COMMAND_EXP_DECL       extern
#      define DOS_COMMAND_EXP_DEFN
#      define DOS_COMMAND_EXP_DATA_DEFN
#    endif
#
#  else
#    ifdef __cplusplus
#      define DOS_COMMAND_EXP_DECL       extern "C"
#    else
#      define DOS_COMMAND_EXP_DECL       extern
#    endif
#    ifndef DOS_COMMAND_EXP_DEFN
#      define DOS_COMMAND_EXP_DECL       DOS_COMMAND_EXP_DECL
#    endif
#    ifndef DOS_COMMAND_EXP_DATA_DEFN
#      define DOS_COMMAND_EXP_DATA_DEFN
#    endif
#  endif
#endif

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

enum {BUFFER_SIZE = 4096};

static HANDLE hOutput = NULL;

static void MyCreateFile(const char* fileName);
static void MyWriteFile(const char* info);
static void MyCloseFile();

DOS_COMMAND_EXP_DECL BOOL ExecuteDosCommand(const char* command, const char* fileName)
{
    SECURITY_ATTRIBUTES security_attributes = {0};
    HANDLE hReadPipe = NULL;
    HANDLE hWritePipe = NULL;

    char dos_command[512];
    STARTUPINFO startUpInfo;
    PROCESS_INFORMATION processInfo;

    char buffer[BUFFER_SIZE] = {0};
    DWORD dwRead;

    if (NULL == command || strlen(command) > 1024) return FALSE;

    printf("%s", command);

    security_attributes.nLength = sizeof(SECURITY_ATTRIBUTES);
    security_attributes.lpSecurityDescriptor = NULL;
    security_attributes.bInheritHandle = TRUE;

    if (!CreatePipe(&hReadPipe, &hWritePipe, &security_attributes, 0)) {
        return FALSE;
    }

    strcpy(dos_command, "Cmd.exe /C ");
    strcat(dos_command, command);

    startUpInfo.cb = sizeof(STARTUPINFO);
    GetStartupInfo(&startUpInfo);

    startUpInfo.hStdError = hWritePipe;
    startUpInfo.hStdOutput = hWritePipe;
    startUpInfo.wShowWindow = SW_HIDE;
    startUpInfo.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;  

    if (!CreateProcess(NULL, dos_command, NULL, NULL, TRUE, 0, NULL, NULL, &startUpInfo, &processInfo)) {
        CloseHandle(hWritePipe);
        CloseHandle(hReadPipe);
        return FALSE;
    }
    Sleep(1000); // Need to be refactored.
    CloseHandle(hWritePipe);

    MyCreateFile(fileName);
    for (;;) {
        if (!ReadFile(hReadPipe, buffer, 4095, &dwRead, NULL)) break;

        MyWriteFile(buffer);
    }

    MyCloseFile();

    CloseHandle(hReadPipe);
    return TRUE; 
}

void MyCreateFile(const char* fileName)
{
    if (hOutput != NULL) MyCloseFile();

    hOutput = CreateFile(fileName, 
        GENERIC_WRITE,
        FILE_SHARE_READ,
        NULL,
        CREATE_ALWAYS,
        FILE_ATTRIBUTE_NORMAL,
        NULL);

    if (INVALID_HANDLE_VALUE == hOutput) hOutput = NULL;

}

void MyWriteFile(const char* info)
{
    DWORD dwWritten = 0;

    if (NULL == hOutput) return;

    WriteFile(hOutput, info, strlen(info), &dwWritten, NULL);
}

void MyCloseFile()
{
    if (NULL == hOutput) return;

    CloseHandle(hOutput);
    hOutput = NULL;
}

对话框exe对应的project,在生成的代码基础上,增加如下部分:

#include "CommandLib/DosCommand.h"

#ifdef _DEBUG
#pragma comment(lib, "CommandLib/Debug/CommandLib.lib")
#else
#pragma comment(lib, "CommandLib/Release/CommandLib.lib")
#endif

void CExeDosCmdDlg::OnOK() 
{
    ExecuteDosCommand("dir", "c:\\test.txt");

    CDialog::OnOK();
}

另外,两个project中需要设置的宏:

  • lib: DLL_EXPORT,DOS_COMMAND_STATIC
  • exe: DOS_COMMAND_STATIC

源代码工程参考附件:
VC中执行DOS命令,获取返回值的例子

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: VC运行指令会返回执行结果。VC是指Visual C++,是一种集成开发环境(IDE)和编译器,用于开发基于C++语言的软件应用程序。 在VC中,我们可以编写C++代码,并通过编译器将其编译成可执行文件。在编译完成后,我们可以运行生成的可执行文件,并通过命令行界面输入指令来进行程序的执行。 当我们在VC中运行指令时,VC会将指令传递给操作系统,并等待操作系统返回执行结果。执行结果可能是程序的输出、错误信息或其他相关信息。 在指令执行过程中,VC会监测程序的运行状态,并将程序的输出结果显示在控制台窗口中。 执行结果的形式可能是文本、数字、图形等,具体取决于程序的设计和指令的要求。 总之,VC运行指令返回的执行结果是程序在运行过程中产生的输出和相关信息。这些结果有助于我们了解程序的运行状态和验证程序的正确性。 ### 回答2: VC 是 Visual C++ 的简称,它是一款常用的 C++ 编译器。使用 VC 运行指令,首先我们需要将指令编写并保存为一个 C++ 源文件(通常以.cpp为后缀名)。然后我们使用 VC 的命令行工具或集成开发环境(如 Visual Studio)来进行编译和运行。 在 VC 中,我们可以打开命令行窗口,进入源文件所在的目录。然后使用编译器指令"cl"来编译源文件,例如"cl myfile.cpp"。编译器将会生成一个可执行文件,通常以.exe为后缀名。 接下来,我们可以输入可执行文件的名称(例如myfile.exe)来运行程序,例如"myfile.exe"。当我们按下回车键后,VC 将会执行程序,并根据程序中的代码逻辑进行相应的操作。程序可能会进行数学计算、数据操作、文件读写等各种操作。 当程序执行完毕后,VC 会返回执行结果。结果可以在命令行窗口中直接显示,或通过输出语句(如cout)打印到屏幕上。结果可能是一串数字、文字、错误信息等,具体取决于程序设计的目的和逻辑。 总体而言,使用 VC 运行指令是一个多个步骤的过程,需要先编译源文件生成可执行文件,然后运行可执行文件得到执行结果。通过这个过程,我们可以在 VC 中快速验证和调试我们编写的 C++ 代码。 ### 回答3: VC是Visual C++的缩写,它是一种运行在Windows操作系统上的集成开发环境(IDE),用于开发C和C++程序。在VC中,我们可以通过编写代码来完成各种任务,并通过运行指令来执行这些代码。 当我们在VC中编写并运行代码时,我们可以直接在IDE的命令行中输入指令,并且可以通过按下Enter键来执行指令。一旦我们执行了指令,VC会将指令发送给编译器进行编译,并将生成的可执行文件运行起来。执行结果会在IDE的输出窗口中显示。 在执行指令后,输出窗口将显示程序执行的结果。这些结果可能是我们在代码中定义的输出,例如打印在屏幕上的文本或计算出的数值。执行结果还可能是我们的程序所产生的其他效果,例如创建或修改文件、打开或关闭窗口等。 需要注意的是,如果我们在编写代码的过程中存在语法错误或逻辑错误,编译器可能会报告这些错误,并显示错误消息在输出窗口中。这些错误消息可以帮助我们找到并纠正代码中的问题,以便程序能够正确执行。 总而言之,当我们在VC中运行指令时,它会返回执行结果,这些结果将在输出窗口中显示。这些结果可以是我们的程序所定义的输出,也可以是其他与程序相关的效果。通常情况下,我们会根据输出结果来判断程序是否正确执行,并根据结果来调试和改进我们的代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值