我想写DLL,但是我想测试我写的东西。
我尝试使用F5调试它,但收到错误消息:
c++ - 如何调试DLLMain函数-LMLPHP
我阅读了Walkthrough: Creating and Using a Dynamic Link Library (C++)文章及其latest version的文章。
但是他们建议创建包含函数的头文件。

就我而言,我使用Loader创建了DLL项目(dllmain.cpp)。

// dllmain.cpp : Defines the entry point for the DLL application.
#include "stdafx.h"

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    HANDLE hd;
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        hd = CreateFileA("C:\\Users\\myuser\\Desktop\\test.dll", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
        OutputDebugString(L"HELLO");
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

我在相同的解决方案中创建了一个新的C++控制台项目,但是我不知道如何调用函数DllMain并对其进行调试。

为了使其井井有条,我现在有两个项目:
1.加载程序-这是DLL项目
2. DLLTester-这是一个控制台应用程序,它将从Loader项目运行DLL。

我将DLL项目的文件夹(Loader)添加到DLLTester项目的其他包括目录中。
我为DLL项目创建了一个 header (Loader.h),并添加了函数签名DLLMain

现在我可以在DLLMain function中看到它。
但是我不知道我需要传递给该函数什么参数:
c++ - 如何调试DLLMain函数-LMLPHP

我了解我需要传递3个参数:
1. HMODULE hModule
2. DWORD ul_reason_for_call
3. LPVOID lpReserverd

但是我不需要进入那里。

代码:
加载程序项目:
Loader.h:
#pragma once
#include "stdafx.h"

BOOL APIENTRY DllMain(HMODULE hModule,
    DWORD  ul_reason_for_call,
    LPVOID lpReserved
);

dllmain.cpp:
// dllmain.cpp : Defines the entry point for the DLL application.
#include "stdafx.h"

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    HANDLE hd;
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        hd = CreateFileA("C:\\Users\\myuser\\Desktop\\test.dll", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
        OutputDebugString(L"HELLO");
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

DLLTester项目:
DLLTester.cpp:
// DLLTester.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "Loader.h"

int main()
{
    DllMain(?,?,?) -> not sure what to enter here
    return 0;
}

外观:
c++ - 如何调试DLLMain函数-LMLPHP

最佳答案

DllMain实际上是一个相当特殊的函数,当使用LoadLibraryLoadLibraryEx加载DLL时,该函数会自动调用(除非您做一些恶作剧来阻止它)。

如果您确实要调用它,可以使用GetProcAddress,但是不管您是否相信,DLL的实际入口点通常都是_DllMainCRTStartup(除了调用构造函数和执行其他初始化之类的操作之外,它实际上还调用DllMain)。开发人员甚至可以将它改写为完全不同的东西。

因此,我真的不知道如何调用DllMain可以对任何普通的DLL做有用的事情。它不会执行所有初始化/清除操作(特别是在启动时C++构造函数调用),并且已经被调用(除非您使用DONT_RESOLVE_DLL_REFERENCES禁止它)。

关于c++ - 如何调试DLLMain函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47968776/

10-12 20:52