我创建了一个简单的DLL,可以打开cmd.exe。
我使用了以下选项:
在默认的
以下三行代码在控制台应用程序中测试时对我有效。
我期望每个加载该DLL的进程都会打开cmd.exe。
我尝试使用PowerShell加载DLL:
我使用了以下选项:
![enter image description here](https://istack.dev59.com/JHt01.webp)
![enter image description here](https://istack.dev59.com/N33eR.webp)
dlllmain.cpp
中,我添加了一段代码来创建一个新的cmd.exe
:// dllmain.cpp : Defines the entry point for the DLL application.
#include "stdafx.h"
#include <Windows.h>
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
{
STARTUPINFO info = { sizeof(info) };
PROCESS_INFORMATION processInfo;
BOOL h = CreateProcessW(L"C:\\Windows\\System32\\cmd.exe", L"", NULL, NULL, TRUE, 0, NULL, NULL, &info, &processInfo);
}
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
以下三行代码在控制台应用程序中测试时对我有效。
我期望每个加载该DLL的进程都会打开cmd.exe。
我尝试使用PowerShell加载DLL:
Add-Type -TypeDefinition @"
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
public static class Kernel32
{
[DllImport("kernel32", SetLastError=true, CharSet = CharSet.Ansi)]
public static extern IntPtr LoadLibrary(
[MarshalAs(UnmanagedType.LPStr)]string lpFileName);
}
"@
$LibHandle = [Kernel32]::LoadLibrary("C:\tmp\myDll.dll")
但是什么也没有发生,$LibHandle
的值为0
。
我做错了什么?
DllLoader.h
文件,并在其中放置了函数的签名,然后将所有代码(3行)移动到了名为OpenCmd()
的函数中的DllLoader.cpp
文件中。在DLL_PROCESS_ATTACH
下面,我放置了OpenCmd()
。我尝试使用 PowerShell 加载它,但仍然没有任何反应。 - E235OpenCmd()
。我也不打算在 DLL 中调用导出函数。我想将这个 DLL 加载到某个进程中,当它加载时,它将进入入口点并运行函数。 - E235