【发布时间】:2017-07-25 10:51:20
【问题描述】:
我是 C 和编程领域的新手! 尝试创建一个打印消息框 Hello World 的简单 DLL 文件!
这是cpp
//main.cpp
#include "main.h"
// a sample exported function
void DLL_EXPORT SomeFunction(const LPCSTR sometext)
{
MessageBoxA(0, sometext, "DLL Message", MB_OK | MB_ICONINFORMATION);
}
extern "C" DLL_EXPORT BOOL APIENTRY DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
switch (fdwReason)
{
case DLL_PROCESS_ATTACH:
// attach to process
// return FALSE to fail DLL load
break;
case DLL_PROCESS_DETACH:
// detach from process
break;
case DLL_THREAD_ATTACH:
// attach to thread
break;
case DLL_THREAD_DETACH:
// detach from thread
break;
}
return TRUE; // succesful
}
这里是 h
//main.h
#ifndef __MAIN_H__
#define __MAIN_H__
#include <windows.h>
/* To use this exported function of dll, include this header
* in your project.
*/
#ifdef BUILD_DLL
#define DLL_EXPORT __declspec(dllexport)
#else
#define DLL_EXPORT __declspec(dllimport)
#endif
#ifdef __cplusplus
extern "C"
{
#endif
void DLL_EXPORT SomeFunction(const LPCSTR sometext);
#ifdef __cplusplus
}
#endif
#endif // __MAIN_H__
关键是,一旦我制作了一个加载 DLL 的控制台,我就必须从中调用函数!我怎么能简单地导出所有函数而不给它们命名,而只是从控制台中的 dll 加载所有内容?比如如果有人想使用我的 dll 却不知道该调用什么怎么办?或者,如果我有一个调用 dll 的 exe,我想创建一个自定义 dll 来调用我的函数?这不是为了破解 porpuses! 对不起技能thx
【问题讨论】:
-
几乎可以肯定不是问题,但
__MAIN_H__是 UB。不要使用双下划线或单下划线后跟大写字母。 -
也许看看 DllMain?
-
1) DLL 并不像您想要的那样“启动”。可执行文件已启动。 DLL 就是这样 - 动态链接库。它是函数库,库的用户决定他们想要使用什么。 2) 明确声明这不适用于黑客攻击 porpuses 另有建议。
-
@TheTechel 好吧,不建议在
DllMain中创建MessageBox。您只能从 DllMain 中的 kernel32.dll 安全地调用函数(即使是那些,也有例外),并且MessageBox在user32.dll中定义。 -
我在这里真的找不到问题。可执行文件包含自动调用的
int main()。它可能(直接或间接)从上面的 DLL 调用SomeFunction。但SomeFunction仅在被调用时才会执行。
标签: c++ function dll compilation