将参数传递给可执行文件在 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<char> buffersleeper.cbegin(), sleeper.end(); buffer.push_back(0); CreateProcess(..., sleeper.data(), ...);
感谢您的回答。你能告诉我我需要包含什么以便我可以编译vector、cbegin和push_back吗?
我得到:main.cpp:78:5: 错误:'vector' 不是'std' std::vector以上是关于将参数传递给可执行文件在 C++ 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章
如何将参数传递给 nodemon(或 node-supervisor)中的可执行文件?
C#将带有标志(/ arg1 / arg2)的参数传递给exe
将过程参数传递给 SELECT INTO where 子句不起作用
Docker 命令在 Windows 上的 Git Bash 中不起作用(执行:“com.docker.cli”:在 %PATH% 中找不到可执行文件)