2011-09-13 52 views
5

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

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

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

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

+2

'登录(CHAR const * str)',当然? –

+0

编写多语言源文件是很困难的工作。我建议你坚持一种语言 - 除非你是为了好玩而做的。 – pmg

+2

或'Log(const char * str)'? – trojanfoe

回答

8

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

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

下面是关于函数指针的一个很好的教程:The function pointer tutorial

为了保持界面简洁,我会强烈建议保持所有这些“定制”功能,以纯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; 
} 
+0

Thiks很多。它给了我一些想法,但是我不是100%确定如何在C中实现它。**“在你的DLL中有一个函数可以调用.exe函数,将函数指针传递给你的Log函数。在DLL里面,存储该函数指针并在需要记录时使用它。“**你可以写一个代码片段,以便更好地理解 – Shanty

+0

@Shanty:添加了一些示例代码。可能不会像动态链接那样工作 - 取决于你的平台,但你会明白的。如果是静态编译好的话) – Mat

+0

@ Mat:非常感谢,解决了我的问题 – Shanty

相关问题