【问题标题】:How to call a function defined in my exe inside my DLL?如何在我的 DLL 中调用我的 exe 中定义的函数?
【发布时间】:2011-11-16 07:20:11
【问题描述】:

我在我的 exe 文件中定义了一些通用功能,例如 Log(char* str)。该函数将一个字符串作为调用者的输入,并将其写入为该应用程序定义的日志文件中。现在我想编写 DLL 代码,其中包含将文件上传到服务器的功能。

目的是将DLL中的上传功能导入exe并使用。但是,如果遇到任何错误,则上传函数必须调用Log(char* str) 函数将错误写入日志文件。

问题在于,这个 DLL 需要在多个应用程序中使用,并且每个应用程序在不同的位置都有不同的日志文件。我想以调用应用程序中定义的相应Log(char* str) 的方式编写DLL。同样,我还有一些其他特定于应用程序的函数,不能事先包含在 DLL 中。

我如何编写这样的 DLL 代码,它只知道函数原型,而不知道驻留在 exe 中的函数定义?

【问题讨论】:

  • Log(char const* str),确定吗?
  • 编写多语言源文件是一项艰苦的工作。我建议你坚持使用一种语言——除非你是为了好玩。

标签: c++ c dll


【解决方案1】:

在您的 DLL 中有一个 .exe 可以调用的函数,将函数指针传递给您的 Log 函数。在 DLL 中,存储该函数指针并在需要记录时使用它。

如果您需要将多个此类函数传递给 DLL,请考虑使用 struct 来存储所有相关函数指针。

这里有一个很好的函数指针教程:The function pointer tutorial

为了保持这个界面简单,我强烈建议将所有这些“可定制”功能保留在简单的C 中,至少作为一个起点。处理指向成员函数的指针并通过C 包装器传递C++ 对象很容易出错。 (但可行。)或者坚持使用C++

这是一个简短的例子。在一个共同的标题中,输入如下内容:

typedef void (*logfunc)(char const*);

简化自定义函数指针的传递。

在您的 DLL 代码中,您可以:

logfunc cust_log;

void dll_init_logging(logfunc l)
{
    cust_log = l;
}

void dll_do_something()
{
    cust_log("hello");
}

如有必要,修改它以使这些功能可在您的平台上导出。

然后从您的主代码中,您需要做的所有事情(假设您正在加载 DLL 并使导出的函数以其原始名称对您的 .exe 可用)是:

void logit(char const* str)
{
    printf("Log: %s\n", str);
}

int main (int argc, char const *argv[])
{
    // load the DLL
    dll_init_logging(logit);
    ...
    dll_do_something();
    ...
    return 0;
}

【讨论】:

  • 非常感谢。它给了我一些想法,但是我不能 100% 确定如何在 C 中实现它。“在你的 DLL 中有一个 .exe 可以调用的函数,将一个函数指针传递给你的 Log 函数。在 DLL 中,存储该函数指针并在需要记录时使用它。” 能否请您编写一个代码 sn-p 以便更好地理解
  • @Shanty:添加了一些示例代码。动态链接可能无法按原样工作 - 取决于您的平台,但您会明白的。 (如果静态编译就可以了。)
  • @Shanty:如果这个答案解决了您的问题,请接受。声誉是您在 SO 上获得答案所花费的货币。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多