Как вызвать функцию, определенную в моем EXE внутри моей DLL? - PullRequest
8 голосов
/ 13 сентября 2011

У меня есть некоторые функции общего назначения, определенные в моем исполняемом файле, как Log(char* str). Эта функция принимает строку в качестве входных данных от вызывающей стороны и записывает ее в файл журнала, определенный для этого приложения. Теперь я хочу написать код DLL, который будет включать функцию для загрузки файла на сервер.

Цель - импортировать функцию загрузки из DLL в исполняемый файл и использовать ее. Однако, если обнаружена какая-либо ошибка, функция загрузки должна вызвать функцию Log(char* str), чтобы записать ошибку в файл журнала.

Проблема в том, что эту DLL нужно использовать в нескольких приложениях, и у каждого приложения будет свой лог-файл в другом месте. Я хочу написать DLL таким образом, чтобы она вызывала соответствующий Log(char* str), определенный в приложении. Точно так же у меня есть некоторые другие функции, которые зависят от приложения и не могут быть включены в DLL заранее.

Как я могу написать такой код DLL, где он знает только прототип функции, но не определение функции, которая находится внутри exe?

1 Ответ

11 голосов
/ 13 сентября 2011

В вашей 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...