Грешка на скенера за Zbar код ntdll.dll в delphi

Опитвам се да сканирам изображение с помощта на ZBar и работя от този примерен код: http://blog.freehand.com.ua/2013/03/zbar-reading-bar-codes-in-delphi.html

Това е кодът, който имам в момента:

procedure TForm1.Button1Click(Sender: TObject);
var zimage : zbar_image_t;
weirdVarArea : SIZE_T;
weirdVarBlob : PByte;
sym: zbar_symbol_t;
begin
  zimage := zbar_image_create;
  zbar_image_set_format(zimage, 'Y800');
  zbar_image_set_size(zimage, Image1.Picture.Width, Image1.Picture.Height);

  weirdVarArea := Image1.Picture.Width * Image1.Picture.Height;
  weirdVarBlob := GetMemory(weirdVarArea);
  zbar_image_set_data(zimage, weirdVarBlob, weirdVarArea, nil);

  zbar_process_image(processor, zimage);

  //  sym := zbar_image_first_symbol(zimage);
  //  ShowMessage(zbar_symbol_get_data(sym));
end;

end.

Във формуляра има един бутон с име „Button1“, както и компонент на изображение с име „Image1“ със зареден в него qr код.

Когато стартирам този код, получавам грешката: Access violation at address 77E57543 in module 'ntdll.dll'. Write of address 000000A4.

Редът, причиняващ проблема, е zbar_process_image(processor, zimage);

Не съм сигурен как да продължа.

Благодаря за отговора, Кобус


person Kobus Vdwalt    schedule 12.05.2015    source източник
comment
На кой ред получавате грешката?   -  person Marcus Adams    schedule 12.05.2015
comment
Той е последният в тази процедура. Ако коментирам zbar_process_image, няма грешки   -  person Kobus Vdwalt    schedule 12.05.2015
comment
Какво е processor и каква е стойността му в реда, който сте маркирали? И проверихте ли както параметрите, така и стойностите, които се предават на zbar_image_set_data в реда по-горе (който вероятно е редът, който всъщност предизвиква изключението)?   -  person Ken White    schedule 12.05.2015
comment
Едно нещо, което този код НЕ прави, което оригиналният код ПРАВИ е, че този код НЕ попълва петното с пикселни данни преди да извика zbar_process_image(). Така че може би това е причината да се срива.   -  person Remy Lebeau    schedule 12.05.2015
comment
Има дефект в кода ви. Трябва да прочетете документите за тази библиотека и да проверите всяко повикване. Изглежда, че не извършвате никаква проверка за грешки. Само Чък Норис може да пренебрегне проверката за грешки. Вероятно едно от обажданията е неуспешно. Откъде знаеш? Предлагам ви да направите малко отстраняване на грешки. Какво отстраняване на грешки направихте? Вероятно все още не знаете как да отстранявате грешки, така че е време да научите. GetMemory е странна функция за извикване. GetMem би било по-нормално. Сигурен ли си, че имаш 8 битови пиксела?   -  person David Heffernan    schedule 12.05.2015
comment
Също така, TImage не работи с Y800 кодирани пиксели. Оригиналният код получаваше пикселите на изображението от файл, така че вероятно беше Y800 кодиран файл. Така че трябва да използвате правилния формат на изображението за пикселите, които ще подавате в процесора.   -  person Remy Lebeau    schedule 12.05.2015
comment
Процесорът Ken е zbar_processor_t, който не е зададен на екземпляр. Току-що го оправих благодаря. Реми как да попълня петно ​​с пикселни данни? Какво е петно? Изображението, което използвам, е TPngImage какво трябва да анализирам в този случай?   -  person Kobus Vdwalt    schedule 12.05.2015
comment
Дейвид благодаря, ще използвам GetMem. Това е първият път, когато работих с dlls, така че не съм сигурен как бих отстранил грешки в нещо от това или какво дори да търся, но ще дам всичко от себе си. Проверявам C документацията за ZBar, тъй като не можах да намеря нищо свързано с delphi.   -  person Kobus Vdwalt    schedule 12.05.2015
comment
Това е C библиотека, там ще бъдат представени документите. Delphi не е единственият език. Отстраняване на грешки като всичко друго. Проверете входа и изхода и сравнете с очакванията.   -  person David Heffernan    schedule 12.05.2015
comment
Добре, така че използвах куп твърдения, за да проверя дали всичко е присвоено. Сега всичко изглежда работи, но не може да намери баркода. Не знам дали всъщност присвоявам данните на ZBarImage. Мисля, че zimage е празен.   -  person Kobus Vdwalt    schedule 12.05.2015
comment
Знаете ли как да използвате дебъгера? Проверявате ли върнатите стойности? Имате ли под ръка документацията?   -  person David Heffernan    schedule 12.05.2015
comment
Да, използвам тази (zbar.sourceforge.net/api) документация, но тя наистина не показва как за да получите данните за изображението в типа изображение Zbar.   -  person Kobus Vdwalt    schedule 13.05.2015
comment
@whos това е, към което препраща Q   -  person David Heffernan    schedule 13.05.2015
comment
@DavidHeffernan: добре, очите ми се нуждаят от очила :(   -  person whosrdaddy    schedule 13.05.2015


Отговори (1)


Нарушение на достъпа на адрес 77E57543 в модул „ntdll.dll“. Напишете адрес 000000A4.

Това всъщност е проблем с Windows. Когато получите тази грешка, трябва да откриете точката за възстановяване, когато приложението работи правилно и да затворите автоматичните актуализации на Windows, за да предотвратите повторната поява на проблема. Ако не можете да разрешите проблема по този начин, трябва да преинсталирате вашия Windows.

person H. Aydin    schedule 05.06.2017