我想写DLL,但我想测试一下我在写什么
我尝试用 F5 调试它,但是我收到一个错误:
我阅读了文章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. Loader - 这是DLL项目
2. DLLTester - 这是一个控制台应用程序,它将从Loader项目运行DLL。
我将DLL项目的文件夹(Loader
)添加到DLLTester
项目的其他包含目录。
我为DLL项目创建了一个标题(Loader.h
)并添加了函数签名DLLMain
。
现在我可以在DLLMain function
中看到它
但我不知道我需要传递给这个函数的论点:
我知道我需要传递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;
}
答案 0 :(得分:3)
DllMain实际上是一个相当特殊的函数,当使用LoadLibrary或LoadLibraryEx加载DLL时会自动调用(除非你做了一些邪恶的东西来阻止它)。
如果真的想要调用它,你可以使用GetProcAddress,但不管你信不信,DLL的实际入口点通常是_DllMainCRTStartup(实际调用它) DllMain除了执行调用构造函数和进行其他初始化之外的事情。它甚至可以被开发人员覆盖为完全不同的东西。
所以我真的没有看到调用DllMain如何对任何普通的DLL做任何有用的事情。它不会执行所有初始化/清理(特别是启动时的C ++构造函数调用),并且它已被调用(除非您使用DONT_RESOLVE_DLL_REFERENCES禁止它。)
答案 1 :(得分:0)
调试DllMain的简单方法是使用静态链接(即使用__declspec(dllexport)/ __ declspec(dllimport)语法),然后将您的DLL项目设置为启动项目,但让调试器启动.exe链接到图书馆。您将程序设置为在项目设置中运行(项目 - >属性,然后调试 - >命令。
然后,您可以设置断点并从DLL中正常执行跟踪。
我知道你可以在动态加载的DLL中为正常函数做断点和诸如此类的东西我还不确定DllMain。