2016-06-16 2 views
2

У нас есть одно приложение, которое в основном состоит из 3 основных модулей.Правильно ли вызывать функцию приложения из функции библиотеки?

Теперь мне поручено изменить 3 модуля моего приложения как 3 динамических библиотек. Причина этого действия заключается в том, что любые изменения в одном из модулей не повлияют на цикл выпуска других модулей.

До сих пор это имеет значение для меня.

Но проблема в том, что некоторые функции в приложении (Исполняемые) требуются библиотечными файлами.

Таким образом, они вызывали функцию, которая была записана в приложении из файла библиотеки. Я не могу это переварить, потому что приложение может вызывать библиотеку, но как библиотека может вызывать приложение.

Поскольку это наша внутренняя библиотека, можем ли мы сделать это, как мне предложили другие?

ответ

2

У вас может быть функция вида SetCallback из библиотеки, взяв указатель на функцию. Вы вызываете это из исполняемого файла, передавая указатель функции, доступный в исполняемом файле. Библиотека будет записывать адрес этой функции и назовет ее позже.

EXE:

void CallMe(int param); 

... 
SetCallback(Callme); 

Библиотека:

void(*func_in_exe)(int); 

void SetCallback(void(*pf)(int)) 
{ 
    func_in_exe = pf;  
} 

void SomeLibraryFunction() 
{ 
if (func_in_exe != NULL) 
    (*func_in_exe)(100); 
} 

Где SetCallback ожидает функция-указатель типа void (*)(int). Эта функция будет обновлять глобальную/статическую переменную того же типа.

Если у вас есть последний компилятор C++, вы можете обернуть его в объект std::function, а также упростить синтаксис указателя функции.

1

Вам нужна функция обратного вызова.

Создайте функцию в библиотеке, которая принимает указатель на функцию в качестве параметра. Затем приложение должно вызвать эту библиотечную функцию и передать указатель на функцию, которую библиотека может хранить для последующего вызова.

Смежные вопросы