Передача аргументов исполняемому файлу, не работающему в переполнении стека

Это исходный код «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 не передается в Sleeper.exe из createprocess.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

4

Решение

Командная строка (второй параметр CreateProcess) принимает полную командную строку, включая имя исполняемого файла. Если первый аргумент не равен NULL, он используется как исполняемый файл для запуска, но в командной строке по-прежнему должно быть имя исполняемого файла. В прошлом даже добавление единственного пробела (давая пустое имя исполняемого файла) работало для меня.

3

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector