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.
Я постарался конструктивно изложить проблему, буду очень признателен, если поможете ее решить. |
|