将参数传递给不能在C ++中工作的可执行文件

时间:2013-11-24 19:29:48

标签: c++ executable execute createprocess

这是我所拥有的“sleeper.exe”的源代码:

int main(int argc, char** argv) {
    cout<<argv[1];
    return 0;
}

当我从命令行调用时:

C:\sleeper 5

我看到了

5

在命令行中,这样可以正常工作..

现在我试图从这样的其他exe中调用这个exe:

std::cout << "ret is:" << ret;
std::cout << "\n";

CreateProcess("sleeper.exe", // No module name (use command line)
               ret, // 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
             )

此处 ret 也是5,我确信因为我在命令行中看到它很好:

ret is: 5

在同一目录中有一个名为config.mpap的文件,我从这里读取了这个值:

std::ifstream myReadFile;
myReadFile.open("config.mpap");

char output[400];
if (myReadFile.is_open()) {
    while (!myReadFile.eof()) {
        myReadFile >> output;
    }
}
myReadFile.close();

char y = output[37];
int numberOfSleeps = y - '0'; // So now numberOfSleeps is 5

然后我将 numberOfSleeps 转换为 ret ,如下所示:

char* ret = NULL;
int numChars = 0;
bool isNegative = false;
// Count how much space we will need for the string
int temp = sleepTime;
do {
    numChars++;
    temp /= 10;
} while (temp);
ret = new char[ numChars + 1 ];
ret[numChars] = 0;
if (isNegative) ret[0] = '-';
int i = numChars - 1;
do {
    ret[i--] = sleepTime % 10 + '0';
    sleepTime /= 10;
} while (sleepTime);

有人可以帮我解释为什么 ret 没有从createprocess.exe传递给sleeper.exe吗?

修改

它的工作原理如下:

if (!CreateProcess(NULL, // No module name (use command line)
                   "sleeper 5", // Command line

然而,这甚至没有编译:

std::string sleeper("sleeper ");
sleeper += ret;
if (!CreateProcess(NULL, // No module name (use command line)
                   sleeper, // Command line

1 个答案:

答案 0 :(得分:3)

命令行(CreateProcess的第二个参数)采用完整的命令行,包括可执行文件名。如果第一个参数不是NULL,则将其用作要运行的可执行文件,但命令行仍必须包含可执行文件名。在过去,甚至在前面添加一个空格(给出一个空的可执行文件名)对我有效。