Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Dll callback, Как создать длл 
:(
    Опции темы
jimbo
  Дата 2.9.2009, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 18.6.2009
Где: Южно-Сахалинск

Репутация: нет
Всего: нет



Привет всем!

Хочется написать ддл-ку, чтобы при ее присоединении к программе, необходимо было создать колбэк функцию для общения с длл. Как это сделать?
Допустим, длл считывает файл периодически, в файле просто цифры или текст, считывает в буфер, что-то типа:


Код


__declspec(dllexport) int napi2=0;

// This is an example of an exported function.
__declspec(dllexport) int fnapi2(void)
{
    FILE* stream = NULL;
    int err = fopen_s(&stream,"a.txt","r");
    if(err ==0)
    {
        while(EOF!=fscanf(stream,"%d",&napi2));
    }
    if(stream) fclose(stream);
    return 42;
}



а в клиенте мы подгружаем нашу длл, создаем колбэк и получаем текущий буфер если он изменился или там каждые 5 секунд. 

Как написать колбэк? Помогите пожалуйста, желательно с примерами кода)
--------------------
Я не играю в шахматы - в шахматах я борюсь. А.А.Алехин
PM MAIL WWW   Вверх
Earnest
Дата 2.9.2009, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



И зачем тут callback? Callback - это функция в твоем коде, вызываемая откуда-то извне, по наступлению конкретного события.
Чтобы получать доступ к буферу каждые 5 минут, нужно написать соответствующий код - в клиенте, разумеется. Повесить его на таймер, например. А в DLL предусмотреть функцию типа GetBuffer().

Сравни, чтобы сделать через callback, тебе нужно:
- написать callback-функцию а основном коде
- написать в DLL метод установки callback (типа SetCallBack (...)) и завести переменную, в которой ты будешь его хранить
- запустить каким-то образом таймер, по которому нужно вызывать callback - т.е. либо к какому-то окну приложения цепляться (его еще нужно получить) либо создать поток (еще один) с WaitableTimer...




--------------------
...
PM   Вверх
jimbo
Дата 3.9.2009, 09:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 18.6.2009
Где: Южно-Сахалинск

Репутация: нет
Всего: нет



я может неправильно выразился. 

Мне хочется написать что-то наподобие ДДЕ сервер-клиент приложения, только со своими данными. 
Клиент делает подключение, дает понять серверу что хочет получать данные и создает колбэк для принятия этих данных только тогда когда у сервера эти данные появляются. сервер передает что-то типа: код сообщения, данные1, данные2, данные3 и.т.д.  в колбэке клиент делает обычный свитч на код сообщения и кучу веток обработки. 
Функция GetBuffer()  на мой взгляд тривиальна, что если переменных много? мне для каждой писать свою функцию?  В общем-то можно конечно, но хочется также изучить процесс создания колбэков. 
--------------------
Я не играю в шахматы - в шахматах я борюсь. А.А.Алехин
PM MAIL WWW   Вверх
jonie
Дата 3.9.2009, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 7
Всего: 118



Цитата

Клиент делает подключение, дает понять серверу что хочет получать данные и создает колбэк для принятия этих данных только тогда когда у сервера эти данные появляются. сервер передает что-то типа: код сообщения, данные1, данные2, данные3 и.т.д.  в колбэке клиент делает обычный свитч на код сообщения и кучу веток обработки. 
мой вас совет -сделать это через оконные сообщения (пусть клиент создает окно, а сервак Post-тит ему данные). В этом случае вам не надо париться с очерядми и обслуживанием подписчиков....

Кроме того, для этих целей (тех что вы описываете) есть КУЧА так называемых MQ-реализаций - например XMPP, AMPQ, MSMQ, Stomp, MS BizTalk - вам нужен велосипед ?

Впрочем, конечно систему можно сделать и как описываете её вы...
Цитата

Функция GetBuffer()  на мой взгляд тривиальна, что если переменных много? мне для каждой писать свою функцию?  В общем-то можно конечно, но хочется также изучить процесс создания колбэков. 

каллбэк это просто функция, с т.з. C++ это обычный указатель на память..... 

т.о. в неком общем *.H файле  (SDK в общем)
Код

typedef void (*lpfnMyPrint)(char* buf);

#ifdef THIS_IS_EXE_FILE
#define DLL_API __declspec(dllexport)
#else
#define DLL_API __declspec(import)
#endif

void  DLL_API RegisterFiunction(lpfnMyPrint printfunct);  //эта функция находится в EXE, ее вызывают DLL для регистрации калбэка



далее в exe дефайните THIS_IS_EXE_FILE, например в stdafx.h ПЕРЕД включением нашего SDK-шного H файла.
и описываете функцию регистрации:
Код

std::vector<lpfnMyPrint> callbacks;

void RegisterFiunction(lpfnMyPrint printfunct)
{
 callbacks.push_back(printfunct);
}

//
// важно!
//это наше какое-то событие, типа щелчка на кнопке
// и вот тут есть проблема в синхронности вызовов, 
// т.е. по хорошему если ваша длл зависает, то виснет все приложение
// для распаралеливания обработки надо делать Thread-ы
// либо использовать систему - как я и описывал делая PostMessage  и пусть система заботится о очередях и зависаниях...
void EXE_event() 
{
 for(size_t i=0; i<callbacks.size(); ++i) 
  *i("HelloWord!");
}

после чего пишите длл-ки:
Код

#include "наша_sdk_.h"

void DllPrintFunction(char* buf)
{
 std::cout<<buf<<'\n';
}

// при инициализации длл, вам надо зарегиться в EXE шнике... через нашу RegisterFiunction не забыть.... это где-то в DLLMAIN надо сделать




в общем сумбурно объяснил.. наверно надо пример ваять...


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
jimbo
Дата 19.10.2009, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 18.6.2009
Где: Южно-Сахалинск

Репутация: нет
Всего: нет



Да нет, нормлаьно объяснили, спасибоsmile

Добавлено через 3 минуты и 30 секунд
я просто так понял .что колбэки никто не использовал, слишком муторно и есть другие реализации. я просто хотел изучить процесс обработки сообщений между окнами и диалогами.
--------------------
Я не играю в шахматы - в шахматах я борюсь. А.А.Алехин
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0466 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.