Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.09.2009, 20:37   #1
DarkEvil
Форумчанин
 
Аватар для DarkEvil
 
Регистрация: 08.05.2009
Сообщений: 247
По умолчанию CallBack из библиотеки возможно ли это?

Есть процедура внутри библиотеки

Код:
type
  bCallback = procedure (const Buffer);
Код:
procedure bViewAll(Callback : bCallback);
var
  Pos : Cardinal;
  Buffer : array of Char;
begin
  if @Callback = nil then Exit;
  SetLength(Buffer, bBlockSize);
  Pos := 0;
  SetFilePointer(bHandle, Pos, nil, FILE_BEGIN);
  bReadFileEx(Buffer);
  Callback(Buffer);
  repeat
    inc(Pos, bBlockSize);
    SetFilePointer(bHandle, Pos, nil, FILE_CURRENT);
    bReadFileEx(Buffer);
    Callback(Buffer);
  until bFileSize > Pos;
end;
Так мы эту процедуру вызываем

Код:
bViewAll(@PrintData);
Вот собственно CallBack процедура она должна вызываться из библиотеки

Код:
procedure PrintData(const Buffer : TelBase);
begin
  showmessage(Buffer.Name);
end;
Получаем access violation
Мой сайт
Цитата:
Сообщение от Scream In Darkness
Кровь не даёт покоя! Кровь не знает сна!
Кровь бежит на волю – Вены рвёт сама!

Последний раз редактировалось DarkEvil; 21.09.2009 в 20:39.
DarkEvil вне форума Ответить с цитированием
Старый 21.09.2009, 20:40   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Код:
  showmessage(Buffer.Name);
лучше API функи юзать там.

поидее нет разницы, главное не забыть функу загрузить
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 21.09.2009, 20:44   #3
DarkEvil
Форумчанин
 
Аватар для DarkEvil
 
Регистрация: 08.05.2009
Сообщений: 247
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
Код:
  showmessage(Buffer.Name);
лучше API функи юзать там.

поидее нет разницы, главное не забыть функу загрузить
То так для примера было

Код:
procedure PrintData(const Buffer : TelBase);
begin
end;
так тоже access violation отгребаем

З.Ы. библиотека написана на чистом апи.
Мой сайт
Цитата:
Сообщение от Scream In Darkness
Кровь не даёт покоя! Кровь не знает сна!
Кровь бежит на волю – Вены рвёт сама!
DarkEvil вне форума Ответить с цитированием
Старый 21.09.2009, 20:46   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Код:
Callback(@Buffer[0]);
а если так?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 21.09.2009, 20:47   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Код:
Buffer : TelBase
Buffer : array of Char;
а с размерами не перемудрили?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 21.09.2009, 20:57   #6
DarkEvil
Форумчанин
 
Аватар для DarkEvil
 
Регистрация: 08.05.2009
Сообщений: 247
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
Код:
Buffer : TelBase
Buffer : array of Char;
а с размерами не перемудрили?
Код:
bInitVars(SizeOf(TelBase));
Код:
procedure bInitVars(BlockSize : Cardinal);
begin
  bBlockSize := BlockSize;
  bRecCount := bGetRecCount();
  bFileSize := GetFileSize(bHandle, nil);
end;
Код:
SetLength(Buffer, bBlockSize);
Нет

Собственно мучения все от того что хочу либу сделать немного универсальной и поэтому не привязоватся к определенному типу в этом случае TelBase а делать инициализацию размеров так сказать вручную
Мой сайт
Цитата:
Сообщение от Scream In Darkness
Кровь не даёт покоя! Кровь не знает сна!
Кровь бежит на волю – Вены рвёт сама!
DarkEvil вне форума Ответить с цитированием
Старый 21.09.2009, 20:59   #7
DarkEvil
Форумчанин
 
Аватар для DarkEvil
 
Регистрация: 08.05.2009
Сообщений: 247
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
Код:
Callback(@Buffer[0]);
а если так?
Это пересылка одного символа...
Хотя ща попробую указателями поигратся...
Мой сайт
Цитата:
Сообщение от Scream In Darkness
Кровь не даёт покоя! Кровь не знает сна!
Кровь бежит на волю – Вены рвёт сама!
DarkEvil вне форума Ответить с цитированием
Старый 21.09.2009, 21:23   #8
DarkEvil
Форумчанин
 
Аватар для DarkEvil
 
Регистрация: 08.05.2009
Сообщений: 247
По умолчанию

Код:
PTelBase = ^TelBase;
Код:
procedure PrintData(const Buffer : PTelBase);
begin
  MessageBox(0, Pchar(@Buffer), 'test', 0);
end;
Код:
bCallback = procedure (const Buffer : Pointer);

Код:
Callback(@Buffer);
Попробывал и с указателями, толку ноль + получаю в PrintData неверный масив

где-то торможу, притом сильно...
Мой сайт
Цитата:
Сообщение от Scream In Darkness
Кровь не даёт покоя! Кровь не знает сна!
Кровь бежит на волю – Вены рвёт сама!
DarkEvil вне форума Ответить с цитированием
Старый 21.09.2009, 21:28   #9
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Нет всего кода, нет ответа. Вы бы для начала убрали выполнения всякие, ну я там вижу procedure bViewAll(Callback : bCallback); целый ряд "опасных" вызовов. Создали бы дебаг вывод, простой текстовый файл, и писали бы туда, типа 20.09.2009 11:20 bViewAll Done и т.п.

А еще лучше, например воспользоваться сообщениями, SendMessage, тогда ряд проблем решается сам собой ) ну это мой подход, с недавних времен
BOBAH13 вне форума Ответить с цитированием
Старый 21.09.2009, 21:48   #10
DarkEvil
Форумчанин
 
Аватар для DarkEvil
 
Регистрация: 08.05.2009
Сообщений: 247
По умолчанию

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

Код:
procedure PrintData(const Buffer : PTelBase);
begin
  MessageBox(0, Pchar(@Buffer), 'test', 0);
end;
Эти данные искажены, проверенно не МессаджеБоксом а дебагером
И здесь получаем access violation
Мой сайт
Цитата:
Сообщение от Scream In Darkness
Кровь не даёт покоя! Кровь не знает сна!
Кровь бежит на волю – Вены рвёт сама!
DarkEvil вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Автосохранение исходников в Delphi. Это возможно? Kottik Софт 16 20.09.2009 17:36
Blockread с массивом.Возможно ли это? Ozerich Общие вопросы Delphi 4 05.11.2008 17:19
Это возможно? Shaitan63 Общие вопросы Delphi 24 01.05.2008 22:59
Возможно ли это...? jungo Microsoft Office Excel 7 20.11.2007 00:01