如何在我的DLL中调用定义在我的exe中的函数?

13
我在我的exe文件中定义了一些通用函数,例如Log(char* str)。该函数从调用者接收一个字符串作为输入,并将其写入为该应用程序定义的日志文件。现在我想编写DLL代码,其中包括一个上传文件到服务器的函数。
目标是从DLL中导入上传函数到exe并使用它。但是,如果遇到任何错误,则上传函数必须调用Log(char* str)函数将错误写入日志文件中。
问题在于这个DLL需要用于多个应用程序,并且每个应用程序都有不同位置的不同日志文件。我希望以这样的方式编写DLL,使其调用应用程序中相应的Log(char* str)。同样,我还有一些其他特定于应用程序的功能,无法预先包含在DLL中。
如何编写这样的DLL代码,它只知道函数原型,而不知道内部定义,这些内部定义驻留在exe中?

3
"Log(char const* str)",确定是这个吗? - Lightness Races in Orbit
编写多语言源文件是一项艰巨的工作。我建议你坚持使用一种语言——除非你只是为了好玩而这么做。 - pmg
可能是dll到主程序通讯的重复问题。 - zvrba
1个回答

14

在您的DLL中有一个函数可供.exe调用,通过传递指向您的Log函数的函数指针。 在DLL内部,存储该函数指针并在需要记录日志时使用它。

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

这是一个关于函数指针的好教程:函数指针教程

为了保持接口简单,我强烈建议将所有这些“可定制”的函数都保持在纯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;
}

1
非常感谢。这给了我一些想法,但我不确定如何在C中实现它。"在您的DLL中有一个函数,.exe可以调用该函数,并传递指向您的Log函数的函数指针。在DLL内部,存储该函数指针并在需要记录事物时使用它。"您能否为更好的理解编写代码片段? - Shanty
@Shanty:添加了一些示例代码。如果使用动态链接,可能不能直接运行,这取决于您的平台,但您可以理解其思路。(如果静态编译,则可以正常工作。) - Mat
@Shanty:如果这个答案解决了你的问题,请接受它。声望是你在SO上获取答案所花费的货币。 - John Dibling

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接