【问题标题】:Basic DLL Function基本 DLL 函数
【发布时间】: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 安全地调用函数(即使是那些,也有例外),并且 MessageBoxuser32.dll 中定义。
  • 我在这里真的找不到问题。可执行文件包含自动调用的int main()。它可能(直接或间接)从上面的 DLL 调用SomeFunction。但SomeFunction 仅在被调用时才会执行。

标签: c++ function dll compilation


【解决方案1】:

“如果有人想使用我的 dll 却不知道调用什么” - 如果有人使用你的 DLL,他需要知道调用什么,没有简单的方法(因此您通常会在 *.h 中提供函数声明)。

实际上有一些方法可以枚举 DLL 提供的函数(参见例如:Win32 API to enumerate dll export functions?),但这并不是大多数 DLL 库通常使用的方式。

请注意,您可以枚举函数名称,但如果没有标头,可能并不总是容易找出要传递给每个函数的参数以及函数返回的类型。通常可以使用 C++ 导出函数来完成(C++ 名称修饰提供参数计数和类型信息),但如果将函数导出为纯“C”函数(其中名称是没有修饰的简单函数名称),则不容易)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多