Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ CreateProcessW不遵守命令行_C++_Winapi_C++builder_C++98 - Fatal编程技术网

C++ CreateProcessW不遵守命令行

C++ CreateProcessW不遵守命令行,c++,winapi,c++builder,c++98,C++,Winapi,C++builder,C++98,我试图在dll中实现CreateProcessW,以便用户可以在单独的进程中启动应用程序 对于初学者,我在代码中硬编码命令,直到我弄明白为止 我有 STARTUPINFO si = {sizeof(STARTUPINFO), 0}; si.cb = sizeof(si); PROCESS_INFORMATION pi = {0}; LPCTSTR AppName=L"c:\\utilities\\depends.exe"; LPTSTR Command = L"c:\\utilities\\te

我试图在dll中实现CreateProcessW,以便用户可以在单独的进程中启动应用程序

对于初学者,我在代码中硬编码命令,直到我弄明白为止

我有

STARTUPINFO si = {sizeof(STARTUPINFO), 0};
si.cb = sizeof(si);
PROCESS_INFORMATION pi = {0};
LPCTSTR AppName=L"c:\\utilities\\depends.exe";
LPTSTR Command = L"c:\\utilities\\tee.exe";
if (CreateProcessW(AppName, Command, 0, 0, 0, CREATE_DEFAULT_ERROR_MODE, 0, 0, &si, &pi)) {
        CloseHandle(pi.hThread);
        CloseHandle(pi.hProcess);
        return GX_RESULT_OK;
    } else {
        .. show error msg
    }
这将启动,但不会打开Tee.exe。没有错误,它只是忽略命令行参数。参数是正确的,我可以在run提示符下运行它,它工作得很好。如果我将AppName保留为空,并将Depends.exe指定为命令参数,它也可以工作,但如果我指定

LPTSTR Command = L"c:\\utilities\\depends.exe c:\\utilities\\tee.exe";
我得到错误3:“系统找不到指定的路径”


另外,通过指定lpCurrentDirectory参数,它同样被忽略。

您必须在
命令中提供可执行文件

  • Appname
    应包含可执行文件的完整路径
  • 命令
    还应包含
    argv[0]
如果您想用记事本打开文件
t.txt
,您可以给出如下信息:

  • Appname=“c:/windows/notepad.exe”
  • command=“记事本c:/temp/t.txt”
您甚至不必提供真实的程序名,即使是假的名称也可以,因为它只是一个占位符

如下所示:
command=“假c:/temp/t.txt”

现在在notepad.exe中:

  • argv[0]=“记事本”
  • argv[1]=“c:/temp/t.txt”
请参见以下完整示例:

#include <Windows.h>
#include <iostream>

using namespace std;

int main(){
    STARTUPINFO si = {sizeof(STARTUPINFO), 0};
    si.cb = sizeof(si);
    PROCESS_INFORMATION pi = {0};
    LPTSTR AppName=L"C:/Windows/notepad.exe";
    wchar_t Command[] = L"notepad C:/Temp/t.txt"; 
    DWORD res = CreateProcess(AppName, Command, 0, 0, 0, CREATE_DEFAULT_ERROR_MODE, 0, 0, &si, &pi);
    if (res) {
        CloseHandle(pi.hThread);
        CloseHandle(pi.hProcess);
        return 0;
    } else {
        cerr<<"error..."<<GetLastError()<<endl;
    }; 
    return 0;
}
#包括
#包括
使用名称空间std;
int main(){
STARTUPINFO si={sizeof(STARTUPINFO),0};
si.cb=sizeof(si);
进程信息pi={0};
LPTSTR AppName=L“C:/Windows/notepad.exe”;
wchar_t命令[]=L“记事本C:/Temp/t.txt”;
DWORD res=CreateProcess(AppName、Command、0、0、CREATE\u DEFAULT\u ERROR\u MODE、0、0、si和pi);
如果(res){
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
返回0;
}否则{

cerrMy crystal ball说您混淆了代码,真正的路径不是c:\utilities。而是路径名中有空格的路径。这要求您在路径周围加双引号,这样它就不会被解析为多个命令行参数。@HansPassant抱歉,但您的球已经模糊了!我特别选择了一个没有空格的路径消除该潜在问题。@Mgetz这是不正确的。从MSDN:如果lpApplicationName和lpCommandLine均为非NULL,则lpApplicationName指向的以NULL结尾的字符串指定要执行的模块,lpCommandLine指向的以NULL结尾的字符串指定命令行。新进程可以使用GetCommandLine检索整个命令行。用C编写的控制台进程可以使用argc和argv参数来解析命令行。因为argv[0]是模块名,C程序员通常会将模块名作为命令行中的第一个标记来重复。@BenKey,答案是-命令行字符串首先需要程序名,然后是第一个参数。在这种情况下,命令似乎没有任何参数。@marcp:这是一个指针变量,但是指向字符串文字,这在CreateProcessW中是不允许的。您需要说
wchar\u t命令[]=L“字符串”
(或等效值)。第二个参数必须是可编辑内存。根据MSDN()LPTSTR是正确的变量类型。@marcp是的,但由于与K&R C向后兼容,文本仅为
LPTSTR
。不允许修改它们。我是第二个告诉你这一点的人。粗略的网络搜索会发现无数人在说同样的话。我们确实知道我们在说什么。@marcp Heck,disa如果您愿意,请与我联系,但您真的认为MSDN弄错了吗?它写得很大:此函数的Unicode版本CreateProcessW可以修改此字符串的内容。因此,此参数不能是指向只读内存的指针(例如常量变量或文字字符串)。如果此参数是常量字符串,则函数可能会导致访问冲突。在Windows中使用正斜杠也是一种坏习惯。大多数情况下,Windows API会将其转换为反斜杠,但并非所有应用程序都接受。