在CreateProcess()中遇到lpCommandLine问题

时间:2011-10-16 19:08:50

标签: c++ winapi createprocess

argI有一些代码:

CreateProcess(L"D:\\prog\\forLb1SPZ.exe",L"D:\\prog\\forLb1SPZ.exe D:\\1.txt",NULL,NULL,FALSE,0,NULL,NULL,&si,&pi)

这些代码正在运行,但是...文件正在程序附近创建(此代码被写入)并且名称为“D” - argv [1]的第一个符号。怎么了?

forLb1SPZ.exe中的代码

#include "stdafx.h"
#include "iostream"
#include <stdio.h>
#include <math.h>
using namespace std;

int _tmain(int argc, char* argv[])
{
    int value;
  FILE *Ptr;

  Ptr=fopen("argv[1]","w");

  for(int i=0;i<20000;i++){
      value=rand();
    fprintf(Ptr,"%d i=%d \n",value,i);
  }

  fclose(Ptr);
    return 0;
}

lab2SPZ.exe(主程序)中的代码

#include "stdafx.h"
#include "iostream"
#include <windows.h>
#include <stdio.h>
using namespace std;

int main()
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));

if(!CreateProcess(L"D:\\forLb1SPZ.exe","D:\\forLb1SPZ.exe D:\\1.txt",NULL,NULL,FALSE,0,NULL,NULL,&si,&pi))
{printf( "creating fail\n");system("pause");return 0;}




printf("handle: %X\n", pi.hProcess);
WaitForSingleObject( pi.hProcess, INFINITE );


system("pause");
return 0;
}

1 个答案:

答案 0 :(得分:2)

你确定是CreateProcess创建该文件,而不是创建LB1SPZ.exe吗?

注意:

  1. 你正在使用宽字符串。如果forLb1SPZ.exe使用ANSI字符串,它可能会在D之后看到\ 0。如果它应该打开“D:\ 1.txt”,它可能会看到文件名为“D”(我不是正面的)在这方面,但我想操作系统不会转换编码。我可能错了,它确实如此)。尝试使用CreateProcessA并查看是否存在差异。
  2. 第二个参数必须是LPTSTR而不是LPCTSTR。您传递的是字符串文字,并且根据文档可能会被CreateProcess更改字符串。如果发生这种情况,您将有未定义的行为,并可能发生崩溃。
  3. 您在第一个和第二个参数中传递了应用名称。这通常是多余的。这是故意的吗?