В вашей 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;
}