【问题标题】:How to create a process in C++ on Windows?如何在 Windows 上用 C++ 创建进程?
【发布时间】:2010-11-07 06:08:52
【问题描述】:

谁能告诉我如何在 VC++ 中创建一个进程?我需要执行

regasm.exe testdll /tlb:test.tlb /codebase

该进程中的命令。

【问题讨论】:

  • 根本不是骗子。另一个问题假定 CreateProcess 是唯一的方法。这个比较开放。作为记录,建议的欺骗是stackoverflow.com/questions/42531/… - 我已经把它排除在问题之外,因为我认为编辑内容的形式不好。我认为应该放在 cmets 中。如果它作为骗子被关闭,那么 SO 本身会将其添加到问题中。

标签: c++ winapi visual-c++ process


【解决方案1】:

您需要阅读 msdn 中的 CreateProcess()。该页面上有示例代码。

【讨论】:

    【解决方案2】:

    如果您只想执行同步命令(运行并等待),最好的办法是使用system() 调用(请参阅here)来运行它。是的,我知道这是一个 Linux 页面,但 C 是一个标准,不是吗? :-)

    要对运行的内容、运行方式(同步/异步)和更多选项进行更细粒度的控制,CreateProcess()(请参阅here)及其兄弟可能会更好,尽管您会绑定到 Windows 平台(您可能不会立即关注)。

    【讨论】:

      【解决方案3】:

      使用 CreateProcess() 生成进程,检查返回值以确保它正常启动,然后关闭进程和线程的句柄或使用 WaitForSingleObject() 等待它完成,然后关闭句柄。

      【讨论】:

        【解决方案4】:

        regasm.exe(Assembly Registration Tool) 对 Windows 注册表进行了更改,因此如果您想将 regasm.exe 作为提升的进程启动,您可以使用以下代码:

        #include "stdafx.h"
        #include "windows.h"
        #include "shellapi.h"
        
        int _tmain(int argc, _TCHAR* argv[])
        {
              SHELLEXECUTEINFO shExecInfo;
        
              shExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
        
              shExecInfo.fMask = NULL;
              shExecInfo.hwnd = NULL;
              shExecInfo.lpVerb = L"runas";
              shExecInfo.lpFile = L"regasm.exe";
              shExecInfo.lpParameters = L"testdll /tlb:test.tlb /codebase";
              shExecInfo.lpDirectory = NULL;
              shExecInfo.nShow = SW_NORMAL;
              shExecInfo.hInstApp = NULL;
        
              ShellExecuteEx(&shExecInfo);
        
              return 0;
        }
        

        shExecInfo.lpVerb = L"runas" 表示进程将以提升的权限启动。如果您不想这样做,只需将 shExecInfo.lpVerb 设置为 NULL。但在 Vista 或 Windows 7 下,更改 Windows 注册表的某些部分需要管理员权限。

        【讨论】:

        • 它工作得很好,而不是上面。但同时它正在询问它必须在哪个用户下运行.. 你能解释一下这个 prog SHELLEXECUTEINFO shExecInfo; shExecInfo.lpVerb = L"runas";
        • 我已将 l"run as" 修改为 null 然后无需询问即可工作。好的,这个 L 代表什么以及这个过程是如何创建的??
        • 以这种方式创建流程在空间和时间方面的复杂性如何?任何想法
        • ShellExecute 比 CreateProcess 慢一点。事实上,ShellExecure 最终使用了 CreateProcess。如果您的代码时间紧迫,您应该使用 CreateProcess。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-04-22
        • 2011-05-12
        • 1970-01-01
        • 2010-09-26
        • 1970-01-01
        • 2012-01-16
        • 1970-01-01
        相关资源
        最近更新 更多