使用加载库( "cmd.exe" ) 但不起作用

Using Loadlibrary("cmd.exe") but not work

本文关键字:exe 不起作用 cmd 加载      更新时间:2023-10-16

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

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

但是当我在 VS 中构建一个 Windows 控制台项目和我的代码时,如下所示:

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

只是变成了一条黑色的 window.no 线!

正如我所期望的那样,我可以在我的进程中加载这个 PE(Windows 可执行文件格式)文件,这样我就不必启动新的 cmd.exe并将其 stdIO 重定向到启动 cmd.exe 的进程。(我知道带有exe文件的加载库可以在调用进程中启动exe而无需创建新进程)为什么加载库不起作用?(控制台窗口中未显示任何单词)

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

不,不能。

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

EXE 的入口点旨在拥有自己的进程。 (我说的是真正的入口点,它通常由语言支持库提供。 它可能有一个名称,例如 wmainCRT 及其地址,而不是用户提供的main()的地址,出现在 PE 标头中)。 通常它通过调用 ExitProcess() 退出,即使您设法将其映射到内存空间并调用它,也会对您的主机 EXE 产生灾难性影响。

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

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

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

加载

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