Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Архив форумов ЦИТФорума
Море(!) вопросов - Море(!) ответов
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 
Как правильно задавать вопросы

Сишная Dll и функция обратного вызова на Паскале. Вопрос.

 
Перейти:  
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование
Предыдущая тема :: Следующая тема  
Автор Сообщение
Frontman
Гость





СообщениеДобавлено: Ср Мар 10 2004 17:50    Заголовок сообщения: Сишная Dll и функция обратного вызова на Паскале. Вопрос. Ответить с цитатой

Всем привет!
Вопрос от программиста C++, не знающего Паскаль.
Итак, есть сишная dll, которая должна возвращать результат обработки некоторой информации программе написанной на Паскале, к которой подсоединена.
Результат есть произвольное количество структур.
Для примера:
структура-заголовок
typedef struct { int iDataCount; } HEADER
и еще переменное число структур
typedef struct { int ix; int iy; } DATA
Весь результат я записываю в массив char*.
В программе на Дельфи необходимо создать функцию обратного вызова, которая бы этот массив получала и считывала оттуда вышеупомянутые структуры.
Чтобы dll смогла вызвать функцию обратного вызова в нее нужно передать ее адрес, используя функцию вида:
extern "C" __declspec(dllexport) void SetCallbackFunc(void (*CallbackFunc)(char *));

На С все это выглядит следующим образом:
1)Указываю, что будет использована функция из dll:
extern "C" __declspec(dllexport) void SetCallbackFunc(void (*CallbackFunc)(char *));
2)Создаю функцию обратного вызова:
void CallbackFunc(char *ptr) {
HEADER *pHeader;
DATA *pData;
pHeader=(HEADER*)ptr;
ptr+=sizeof(HEADER);
for (int i=0; i<pHeader->iDataCount; i++) {
pData=(DATA*)ptr;// считываю структуры из массива
ptr+=sizeof(DATA);
}
}
3)Отправляю адрес этой функции в dll:
SetCallbackFunc(CallbackFunc);
4)Теперь могу вызвать ее из dll:
HEADER Header;
DATA Data;
Header.iDataCount = 5;
char *ptr = new char [sizeof(HEADER)+Header.iDataCount*sizeof(DATA)];
memcpy(ptr, &Header, sizeof(HEADER));
tmp+=sizeof(HEADER);
for (int i=0; i< Header.iDataCount; i++) {
memcpy(ptr, &Data, sizeof(DATA));
ptr +=sizeof(DATA);
}
(*(CallbackFunc))(ptr);// отправляю массив
delete [] ptr;
Покажите как реализовать на Паскале пункты 1,2 и 3.
Я постарался конструктивно изложить проблему, буду очень признателен, если поможете ее решить.
Вернуться к началу
Frontman
Гость





СообщениеДобавлено: Ср Мар 10 2004 21:01    Заголовок сообщения: Спасибо всем кто читал, я уже разобрался. Ответить с цитатой

...
Вернуться к началу
Показать сообщения:   
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2002 phpBB Group
Русская поддержка phpBB

 

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 6608306, ICQ 232284597
Пресс-релизы — pr@citforum.ru
Послать комментарий
Информация для авторов
This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2006 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...