众所周知,当我们启动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不工作?(它在控制台窗口中没有显示任何单词)
答案 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函数。