无法加载自定义 DLL

3
我创建了一个简单的DLL,可以打开cmd.exe。
我使用了以下选项:
enter image description here enter image description here 在默认的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

我做错了什么?


请勿将代码放入DllMain中,请参阅警告和备注:https://msdn.microsoft.com/zh-cn/library/windows/desktop/ms682583(v=vs.85).aspx - Richard Critten
@RichardCritten 我也尝试创建了一个 DllLoader.h 文件,并在其中放置了函数的签名,然后将所有代码(3行)移动到了名为 OpenCmd() 的函数中的 DllLoader.cpp 文件中。在 DLL_PROCESS_ATTACH 下面,我放置了 OpenCmd()。我尝试使用 PowerShell 加载它,但仍然没有任何反应。 - E235
@RichardCritten 不,我没有直接调用 OpenCmd()。我也不打算在 DLL 中调用导出函数。我想将这个 DLL 加载到某个进程中,当它加载时,它将进入入口点并运行函数。 - E235
直到 DllMain 返回,几乎任何操作都相当于 Microsoft 的未定义行为。没有理由去推断程序的行为或建议修复,因为没有任何保证任何对操作系统的调用都会正确执行。 - Richard Critten
@RichardCritten 这有点夸张了。 - manuell
显示剩余2条评论
1个回答

1
我找到了问题所在。
我的系统是64位的,而文件是32位编译的。
我需要在Visual Studio中指定我正在编译x64位。
enter image description here
一开始我没有检查它,因为我认为当我以“任何CPU”模式编译时,它会自动将文件编译为64位,与操作系统架构相同。
现在它可以正常工作了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接