Hallo,
Ich will gerne einen Barcode per USB Webcam einscannen und in Lazarus verwenden. Dazu habe ich ZBar gefunden und die DLL eingebunden. Der Scan-Bildschirm geht auf und man das scannen geht auch. Die Infos gelangen in meine EXE. Doch sobald das Scan Fenster mit der q Taste schließe (Q, auf Tastatur) stürzt die EXE ab.
Weiß jemand was ich ändern könnte damit das nicht passiert? Es liegt wohl irgendwie daran dass die DLL nicht sauber beendet und zieht meine EXE gleich mit in den Abgrund.
Anbei der Quelltext incl DLL und EXE zum Test. Ein Screenshot wie das aus sieht.
Ich musste die DLL ein einem eigenen Thread ausführen, denn wenn ich das nicht mache friert die EXE sofort ein sobald der Callback mit den Barcode-Infos aufgerufen wird. Mit dem Thread kann ich per Synchronize die Infos an den EXE Thread weiter reichen und im Memo anzeigen.
PS: Als Inspiration der Umsetzung habe ich die Datei "zbarcam.c" umgeschrieben, die gibt es hier: http://sourceforge.net/p/zbar/code/ci/d ... e/zbarcam/
Vielen Dank schon mal, Grüße
Markus
Barcodescanner libzbar-0.dll in Lazarus einbinden?
-
- Beiträge: 1466
- Registriert: Fr 10. Okt 2008, 23:54
- OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
- CPU-Target: 32/64Bit
Barcodescanner libzbar-0.dll in Lazarus einbinden?
EleLa - Elektronik Lagerverwaltung - www.elela.de
Re: Barcodescanner libzbar-0.dll in Lazarus einbinden?
Da sich keiner meldet, habe ich mir Dein Programm auf meinem Notebook mit Webcam (hätte gar nicht gedacht, dass das so problemlos funktioniert) mal für 20 Minuten angesehen.
Ich muss jetzt leider auch weg, doch wollte ich Dir vorher noch mein bisherigen Stand mitteilen, vielleicht hilfts ja als Anregung.
Bevor Du aufräumst, muss Du ZBarProc beenden (wahrscheinlich gibt es eine Art ProcessMessages, ich warte einfach nochmal 100ms auf ein Userinput, um die Beendigung von ZBarProc durchführen zu lassen). So kommt es bei mir zu keinem SIGSEGV mehr:
Ich muss jetzt leider auch weg, doch wollte ich Dir vorher noch mein bisherigen Stand mitteilen, vielleicht hilfts ja als Anregung.
Bevor Du aufräumst, muss Du ZBarProc beenden (wahrscheinlich gibt es eine Art ProcessMessages, ich warte einfach nochmal 100ms auf ein Userinput, um die Beendigung von ZBarProc durchführen zu lassen). So kommt es bei mir zu keinem SIGSEGV mehr:
Code: Alles auswählen
procedure TThreadZBar.Execute;
...
until (iRC < 0) Or Terminated;
zbar_processor_set_active(ZBarProc, 0); // <- Beenden
zbar_processor_user_wait(ZBarProc, 100); // <- Ersatz für .ProcessMessages (gibt es aber bestimmt ein besseren Ersatz dafür)
zbar_processor_set_data_handler(ZBarProc, Nil, Nil);
// if Not((iRC <> Ord('q')) And (iRC <> Ord('Q')) And
// (zbar_processor_get_error_code(ZBarProc) <> ZBAR_ERR_CLOSED)) Then
zbar_processor_destroy(ZBarProc);
ZBarProc := Nil;
Synchronize(@Termi);
end;
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;