gpt4 book ai didi

c++ - 如何调试 DLLMain 函数

转载 作者:搜寻专家 更新时间:2023-10-31 01:30:25 32 4
gpt4 key购买 nike

我想编写 DLL,但我想测试我正在编写的内容。
我尝试用 F5 调试它,但我收到一个错误:
enter image description here
我读了文章Walkthrough: Creating and Using a Dynamic Link Library (C++)如何做及其 latest version .
但是他们建议创建包含函数的头文件。

在我的例子中,我使用 dllmain.cpp 创建了 DLL 项目 (Loader)。

// 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. Loader - 这是DLL项目
2. DLLTester - 这是一个控制台应用程序,它将运行来自 Loader 项目的 DLL。

我将 DLL 项目 (Loader) 的文件夹添加到 DLLTester 项目的Additional Include Directories
我为 DLL 项目创建了一个 header (Loader.h) 并添加了函数签名 DLLMain

现在我可以在 DLLMain 函数中看到它。
但是我不知道我需要传递给这个函数的参数是什么:
enter image description here

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

但我不知道我需要在那里输入什么。

代码:
加载器项目:
加载器.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;
}

外观:
enter image description here

最佳答案

DllMain实际上是一个相当特殊的函数,当使用 LoadLibrary 加载 DLL 时会自动调用该函数或 LoadLibraryEx (除非你做了一些邪恶的事情来阻止它)。

如果你真的想调用它,你可以使用GetProcAddress ,不管你信不信,DLL 的实际入口点通常是 _DllMainCRTStartup (除了调用构造函数和进行其他初始化之外,它实际上还调用了 DllMain)。它甚至可以被开发人员覆盖为完全不同的东西。

所以我真的不明白调用 DllMain 如何对任何普通 DLL 做任何有用的事情。它不执行所有初始化/清理(特别是启动时的 C++ 构造函数调用),并且它已经被调用(除非您使用 DONT_RESOLVE_DLL_REFERENCES 抑制它)。

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

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com