使用Loadlibrary(" cmd.exe")但不起作用

时间:2016-02-01 03:45:14

标签: c++ c windows cmd

众所周知,当我们启动CMD.exe时,它将显示一个控制台窗口,并以以下行开头:

Microsoft Windows [版本 6.1.7601]
版权所有 (c) 2009 Microsoft Corporation。保留所有权利。

C:\Users\hey>

但是当我在VS中创建一个Windows控制台项目时,我的代码就像这样:

int _tmain(int argc, _TCHAR* argv[])
{
    auto h = LoadLibrary(__TEXT("cmd.exe"));
    Sleep(99999);
}

只是变成了一个黑色的窗户。没有出线!

正如我所料,我可以在我的进程中加载​​此PE(Windows可执行格式)文件,因此我不必启动新的cmd.exe并将其stdIO重定向到启动cmd.exe的进程。(我知道Loadlibrary使用exe文件可以在调用进程中启动exe而无需创建新进程) 为什么Loadlibrary不工作?(它在控制台窗口中没有显示任何单词)

2 个答案:

答案 0 :(得分:5)

  

(我知道带有exe文件的Loadlibrary可以在调用进程时启动exe而无需创建新进程)

不,它不能。

如果使用LOAD_LIBRARY_AS_DATAFILE标志,可以将EXE文件的名称传递给LoadLibrary,以便访问其资源,但wmainCRT既不运行EXE中的代码也不运行准备运行代码。

EXE的入口点是为拥有自己的进程而设计的。 (我说的是真正的入口点,它通常由语言支持库提供。它可能有main()之类的名称及其地址,而不是用户提供的ExitProcess()的地址,出现在PE标题中)。通常它会通过调用<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>File Upload</title> </head> <body> <center> <h1>File Upload</h1> <form method="post" action="UploadServlet" enctype="multipart/form-data"> Select file to upload: <input type="file" name="file" size="60" /><br /> <br /> <input type="submit" value="Upload" /> </form> </center> </body> </html> 退出,这会对您的主机EXE产生灾难性影响,即使您设法将其映射到您的内存空间并调用它。

动态可加载库和可执行文件的入口点要求非常不同。

答案 1 :(得分:2)

您无法通过LoadLibrary运行可执行文件。改为使用CreateProcess(或其中一个兄弟姐妹)。

来自LoadLibrary function文档(以粗体突出显示是我的):

  

LoadLibrary也可用于加载其他可执行模块。例如,该函数可以指定.exe文件以获取可在FindResource或LoadResource中使用的句柄。但是,不要使用LoadLibrary来运行.exe文件。而是使用CreateProcess函数。