我在我的 exe 文件中定义了一些通用函数,例如 Log(char* str)
。此函数将字符串作为调用者的输入并将其写入为该应用程序定义的日志文件。现在我想编写 DLL 代码,其中包含将文件上传到服务器的功能。
目的是将上传功能从DLL导入到exe中使用。但是,如果遇到任何错误,上传函数必须调用 Log(char* str)
函数将错误写入日志文件。
问题是这个 DLL 需要在多个应用程序中使用,并且每个应用程序将在不同的位置有不同的日志文件。我想以调用应用程序中定义的相应 Log(char* str)
的方式编写 DLL。同样,我还有一些特定于应用程序的其他函数,不能事先包含在 DLL 中。
我如何编写这样的 DLL 代码,它只知道函数原型(prototype),而不知道驻留在 exe 中的函数定义?
最佳答案
在您的 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;
}
关于c++ - 如何在我的 DLL 中调用我的 exe 中定义的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7404628/