将参数传递给可执行文件在 C++ 中不起作用

Posted

技术标签:

【中文标题】将参数传递给可执行文件在 C++ 中不起作用【英文标题】:Passing arguments to executable not working in C++ 【发布时间】:2013-11-24 19:29:48 【问题描述】:

这是我拥有的“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

【问题讨论】:

@NicholasM CreateProcess 是一个 WINAPI 函数。因此,操作系统将是 Windows。他无法复制它,因为它是原生的。 @Derija93,谢谢,我会删除我的评论。 出于好奇,您在控制台中看到了什么? @Derija93 如果我像这样调用 c:\sleeper => 什么都没有。 一般性评论。此代码非常低级,请考虑使用 POCO、Boost.Process 或 Qt 等 C++ 库。 【参考方案1】:

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

【讨论】:

这与 CreateProcess() here 的描述一致。 对不起,我的英语不好,你的意思是通过“sleeper”作为第一个参数应该有效吗?如果你这么说,我的情况不是。 @KorayTugay 您在编辑中的第二个代码原则上是正确的,但是您需要将指针传递给 C 函数。例如。 std::vector&lt;char&gt; buffersleeper.cbegin(), sleeper.end(); buffer.push_back(0); CreateProcess(..., sleeper.data(), ...); 感谢您的回答。你能告诉我我需要包含什么以便我可以编译vector、cbegin和push_back吗? 我得到:main.cpp:78:5: 错误:'vector' 不是'std' std::vector buffersleeper.cbegin() 的成员,sleeper。结束();

以上是关于将参数传递给可执行文件在 C++ 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

nodemon :作为必需模块使用时将参数传递给可执行文件

如何将参数传递给 nodemon(或 node-supervisor)中的可执行文件?

C#将带有标志(/ arg1 / arg2)的参数传递给exe

从命令行将参数传递给可执行文件[重复]

将过程参数传递给 SELECT INTO where 子句不起作用

Docker 命令在 Windows 上的 Git Bash 中不起作用(执行:“com.docker.cli”:在 %PATH% 中找不到可执行文件)