【问题标题】:Trouble with lpCommandLine in CreateProcess()CreateProcess() 中的 lpCommandLine 出现问题
【发布时间】:2011-12-08 20:28:59
【问题描述】:

arg我有一些代码:

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;
}

【问题讨论】:

  • 这不会编译。贴出真实代码。不要将 const char* 作为 lpCommandLine 传递。

标签: c++ winapi createprocess


【解决方案1】:

您确定创建该文件的是CreateProcess,而不是forLb1SPZ.exe?

注意:

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

【讨论】:

  • 文件是由 forLb1SPZ.exe 创建的,但它出现在其他目录中。我试着像你说的那样做(大约\ 0),但问题是一样的。在 orLb1SPZ 我试图打开 Ptr=fopen("D:\\1.txt","w"); 并且它正在工作。使用CreateProcessA后没有区别。
  • 能否请您发布在 forLb1SPZ.exe 中创建文件的(真实)代码?由于CreateProcess 中的lpCurrentDirectory 为NULL,因此forLb1SPZ.exe 获取调用进程的当前目录。当我们弄清楚完整路径如何变成“D”时,问题就迎刃而解了。
  • 没有“L”我得到 erorr 'error C2664: 'CreateProcessW' : cannot convert parameter 2 from 'const char [26]' to 'LPWSTR''。同样没有第一个参数(使用 NULL)我在 dbgheap.c 文件中得到错误,程序需要中断......我不明白我必须做什么=((
  • 保留L,没问题。当您将 NULL 作为第一个参数传递时,由于我的注释 #2,您可能会遇到段错误 - 使用 WCHAR cmd[] = "the cmdline"; 并将 cmd 作为第二个参数传递。现在,我仍然怀疑您在lab2SPZ 中使用Unicode 字符串和在forLb1SPZ 中使用ANSI 字符串。请查看 CreateProcess 文档中的 CREATE_UNICODE_ENVIRONMENT,看看是否有帮助。
  • 感谢您的帮助,但问题出在 iostream 库中......我删除了 #include "iostream" 并且文件已正确创建 =)
猜你喜欢
  • 1970-01-01
  • 2015-09-10
  • 1970-01-01
  • 2010-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-07
相关资源
最近更新 更多