【问题标题】:cmd commands in ShellExecuteShellExecute 中的 cmd 命令
【发布时间】:2018-01-25 07:07:49
【问题描述】:

我正在尝试从elevated(has admin privileage) c++ application 执行command prompt 中的netsh winsock reset catalog 命令。

HINSTANCE retVal = ShellExecute(NULL, "open", "cmd", "\c netsh winsock reset catalog > CUninstall.log", NULL, SW_NORMAL); 

它只是打开命令提示符,没有其他任何反应。我试过了

HINSTANCE retVal = ShellExecute(NULL, "runas", "cmd", "\c netsh winsock reset catalog > CUninstall.log", NULL, SW_NORMAL); 

HINSTANCE retVal = ShellExecute(NULL, "open", "cmd", " netsh winsock reset catalog > CUninstall.log", NULL, SW_NORMAL); 

【问题讨论】:

  • 改用CreateProcess
  • createprocess 也一样,没有区别。
  • /c 是开关字符。
  • 投票关闭为错字。
  • @Cheersandhth.-Alf OP 说他的流程已经提升。

标签: c++ visual-c++ cmd shellexecute


【解决方案1】:

切换字符导致了问题。当切换字符从\c 更改为/c 时,它起作用了。

表格

HINSTANCE retVal = ShellExecute(NULL, "open", "cmd", "\c netsh winsock reset catalog > CUninstall.log", NULL, SW_NORMAL);

HINSTANCE retVal = ShellExecute(NULL, "open", "cmd", "/c netsh winsock reset catalog > CUninstall.log", NULL, SW_NORMAL);

【讨论】:

    【解决方案2】:

    经过反复试验才找到最佳方法,所以我想分享my solution。 抛开我对使用异步调用的建议,这是我的 DoRun() 函数:

    BOOL DoRun(WCHAR *command)
    {
        BOOL Result = FALSE;
        DWORD retSize;
        LPTSTR pTemp = NULL;
        TCHAR Command[BUFSIZE] = L"";
        if (!(DeleteFile(RESULTS_FILE)))
        {
            //return L"Can't delete previous results";
        }
        _tcscpy_s(Command, L"/C ");
        _tcscat_s(Command, command);
        _tcscat_s(Command, L" >");
        _tcscat_s(Command, RESULTS_FILE);
        wprintf(L"Calling:\n%s\n", Command);
        Result = (BOOL) ShellExecute(GetActiveWindow(), L"OPEN", L"cmd", Command, NULL, 0L);
        if(!Result)
        {
            retSize = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
                FORMAT_MESSAGE_FROM_SYSTEM |
                FORMAT_MESSAGE_ARGUMENT_ARRAY,
                NULL,
                GetLastError(),
                LANG_NEUTRAL,
                (LPTSTR)&pTemp,
                0,
                NULL);
            MessageBox(NULL,pTemp,L"Error",MB_OK);
        }
        return Result;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-04
      • 2015-10-03
      • 2021-04-07
      相关资源
      最近更新 更多