Вызов функции динамической библиотекой
От: Alexander  
Дата: 18.12.06 14:27
Оценка:
Доброго времени суток, Коллеги!

Подскажите, каким образом можно реализовать вызов callback-функции динамической библиотекой. Я пробовал следующим образом:
1) в dll создаю переменную, которая хранит адрес callback-функции (по умолчанию NULL);
2) создаю в dll импортируемую функцию, при помощи которой можно установить адрес callback-функции;
3) при наступлении определённого события, если адрес callback-функции не NULL, вызвать оную.

На работает.. я так понимаю, адрес callback-функции "не актуальный" в dll. Как поступить?

Заранее огромное спасибо,
Alexander.
Re: Вызов функции динамической библиотекой
От: SergH Россия  
Дата: 18.12.06 14:32
Оценка: +1
Здравствуйте, Alexander, Вы писали:

A>Подскажите, каким образом можно реализовать вызов callback-функции динамической библиотекой. Я пробовал следующим образом:

A>1) в dll создаю переменную, которая хранит адрес callback-функции (по умолчанию NULL);
A>2) создаю в dll импортируемую функцию, при помощи которой можно установить адрес callback-функции;
A>3) при наступлении определённого события, если адрес callback-функции не NULL, вызвать оную.

A>На работает..


Что именно не работает? Как это проявляется? Пример кода можешь привести?

A>я так понимаю, адрес callback-функции "не актуальный" в dll. Как поступить?


Вполне актуальный. dll грузится в адресное пространство процесса, адреса у них общие. Ты же можешь передать в dll указатель на начало буфера? Ну так функция ни чем не лучше.
Делай что должно, и будь что будет
Re: Вызов функции динамической библиотекой
От: StDenis Россия  
Дата: 18.12.06 14:41
Оценка:
A>2) создаю в dll импортируемую функцию, при помощи которой можно установить адрес callback-функции;
наверное экспортируемую функцию?

т.е. DLL предоставляет функцию setHandler
typedef void WINAPI (*FHandler)( char* );
FHandler g_fHandler = NULL;
extern "C" __declspec( dllexport ) void setHandler( FHandler foo )
{
    g_fHandler = foo;
}

хост-приложение загружает эту DLL и вызывает SetHandler( someFunctionInEXE )
void WINAPI myHandler( char* msg )
{
    printf( "%s", msg );
}
void main()
{
    //... как-то подключили DLL и записали адрес функции в setHandler
    setHandler( myHandler );
}

А при определенном событии код в DLL вызывает обработчик:
int OnEvent( void )
{
    if( g_fHandler != NULL ) g_fHandler( "event fired" );
}


вообще куски кода, который у тебя не работает был бы лучше, чем гадать как и что сделано и где проблема..
Re: Вызов функции динамической библиотекой
От: Desniza  
Дата: 18.12.06 15:14
Оценка:
Здравствуйте, Alexander, Вы писали:

A>На работает.. я так понимаю, адрес callback-функции "не актуальный" в dll. Как поступить?

A>Заранее огромное спасибо,
A>Alexander.
я так понял ты вызываешь калбек фкнкцию из другого процесса.
Естественно адрес не будеткоректным.

а так задача несовсем полная. (судя по всему)
Re[2]: Вызов функции динамической библиотекой
От: Alexander  
Дата: 18.12.06 15:39
Оценка:
A>>На работает.. я так понимаю, адрес callback-функции "не актуальный" в dll. Как поступить?
A>>Заранее огромное спасибо,
A>>Alexander.
D>я так понял ты вызываешь калбек фкнкцию из другого процесса.
D>Естественно адрес не будеткоректным.
Если я загружаю либу через LoadLibrary(), она грузится в моё адресное пространство?
Как быть, если dll в другом процессе?
Я по дури код не сохранил.. попробую сделать ещё раз, если не выйдет, закину сюда.

Alexander.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.