QR-Code Dll - Übergabe Errorlevel-Parameter, Aufruf: DestroyBuffer() ?

    • Offizieller Beitrag

    Hi,
    für den QR-Code Creator nutze ich die quricol32.dll. Jedoch finde ich keinen Weg den Parameter für den ErrorCorretion-Level zu übergeben, somit wird immer mit dem Default-Wert 0 gearbeitet.
    Ebenso unklar ist, wie die Funktion DestroyBuffer() aufgerufen werden soll. Ich interpretiere die Funktion so, dass dazu als Parameter ein Buffer übergeben werden soll, jedoch liefern die vorab zum encodieren genutzten Funktionen keinen Rückgabewert. Ein Aufruf der Funktion ohne Parameter führt zum Crash von AutoIt. :huh:

    [autoit]


    Global $iMargin = 4, $iPixelSize = 2
    DllCall("quricol32.dll", "none", "GenerateBMPW", "str", $sPath & $_sImageName & ".bmp", "str", $_sText, "int", $iMargin, "int", $iPixelSize) ; == funktioniert

    [/autoit][autoit][/autoit][autoit]

    ; == TErrorCorretion
    Global Const $QR_ECLEVEL_L = 0 ; == up to 7% damage
    Global Const $QR_ECLEVEL_M = 1 ; == up to 15% damage
    Global Const $QR_ECLEVEL_Q = 2 ; == up to 25% damage
    Global Const $QR_ECLEVEL_H = 3 ; == up to 30% damage
    DllCall("quricol32.dll", "none", "GenerateBMPW", "str", $sPath & $_sImageName & ".bmp", "str", $_sText, "int", $iMargin, "int", $iPixelSize, "int", $QR_ECLEVEL_Q) ; == funktioniert nicht

    [/autoit][autoit][/autoit][autoit]

    DllCall("quricol32.dll", "none", "DestroyBuffer") ; <== CRASH!!!

    [/autoit]

    Da mir C++ recht fremd ist, kann ja vielleicht ein in dieser Richtung Beschlagener mit dem Code was anfangen:

    quricol.h


    Die kompletten Source-Dateien inkl. der 32Bit-Dll habe ich angehängt.


    Edit 25.12.2012:
    Wie aus der Doku nicht hervorgeht, ist der ErrorCorrectionLevel-Parameter ausschließlich in der 64-Bit Variante der Dll verfügbar. Damit ist der Parameter dann ja total überflüssig. Tools zu erstellen, die nicht auf 32-Bit Maschinen laufen würde ich ziemlich schräg finden.

  • Es scheint sich beim Typ 'QRecLevel' um einen Enum zu handeln. Wie man diesen in AutoIt korrekt übergibt bin ich mir nicht sicher. Aber als 'int' scheint es ja nicht zu funktionieren. Eine andere Möglichkeit fällt mir momentan jedoch auch nicht ein.

    DestroyBuffer muss definitiv ein Buffer übergeben werden. Ich kann mir gut vorstellen, dass AutoIt crasht, wenn man eine Funktion mit falschen Parametern aufrufen will. So wie ich das verstehe, ist diese Funktion aber dazu da, den Buffer von GetPNGW/GetPNGA oder GetHBitmapW/GetHBitmapA zu zerstören. Mir erschliesst sich der Zweck von GenerateBMPW noch nicht ganz, aber diese Funktion scheint ja nichts zurückzugeben oder zu akzeptieren welches zerstört werden müsste.

    Gruss Shadowigor

  • Diese Version habe ich benutzt: http://users.telenet.be/ws36637/download/quricol.zip

    Mit diesem Code funzt es unter X64:

    [autoit]


    #AutoIt3Wrapper_UseX64=y
    Global $iMargin = 4, $iPixelSize = 2
    $sPath = @ScriptDir & "\"
    $_sImageName = "Test"
    $_sText = "Test"

    [/autoit][autoit][/autoit][autoit]

    $a = DllCall("quricol64.dll", "none", "GenerateBMPW", "wstr", $sPath & $_sImageName & ".bmp", "str", $_sText, "int", $iMargin, "int", $iPixelSize) ; == funktioniert
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $a = ' & $a & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console

    [/autoit][autoit][/autoit][autoit]

    ; == TErrorCorretion
    Global Enum $QR_ECLEVEL_L = 0, $QR_ECLEVEL_M, $QR_ECLEVEL_Q, $QR_ECLEVEL_H
    $b = DllCall("quricol64.dll", "none", "GenerateBMPW", "wstr", $sPath & $_sImageName & "2.bmp", "str", $_sText, "int", $iMargin, "int", $iPixelSize, "int", $QR_ECLEVEL_Q) ; == funktioniert nicht
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $b = ' & $b & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console

    [/autoit][autoit][/autoit][autoit]

    ;~ DllCall("quricol32.dll", "none", "DestroyBuffer", "ptr", $iAddress) ; <== CRASH!!!

    [/autoit]

    Es werden 2 BMPs erstellt, die unterschiedlich sind.

    Keine Ahnung, wann man DestroyBuffer benutzen muss. Vielleicht ist dieser Link nützlich: http://delphi32.blogspot.de/2011/11/qurico…or-library.html

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

    Einmal editiert, zuletzt von UEZ (23. Dezember 2012 um 19:36)

  • Hi,
    so wie ich den c++-Code und die Delphi-Beispiele interpretiere, wirkt DestroyBuffer() nur auf die in
    GetPNGW() bzw. GetPNGA() zurückgegebenen Pointer.
    Der letzte Parameter in diesen beiden Funktionen enthält nach Aufruf der Funktion den Pointer bzw. die Referenz

  • BugFix , in deiner im QR_creator.au3 enthaltenen dll können nur 4 parameter übergeben werden!
    IDA gibt jedenfalls nur 4 Parameter an, wenn du einen 5. übergibst....crash...


    In UEZ´s dll können 5 parameter übergeben werden....und dann funktioniert auch der AutoIt-Code

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    Einmal editiert, zuletzt von Andy (23. Dezember 2012 um 12:31)

    • Offizieller Beitrag

    Danke für eure Bemühungen.
    Leider ist die Dokumentation dazu nicht konkret genug. Die 64Bit-Variante ermöglicht also einen Parameter für ErrorCorrectionLevel, die 32Bit-Variante hingegen nicht. Das finde ich ziemlich schräg. :wacko:
    Naja, muß ich halt mit leben dass dieser Parameter dann wegfällt. Denn ich werde keine Tools erstellen, die unter 32Bit nicht laufen.

    Was bei QR-Code auch etwas verwirrend ist, ist die Tatsache, dass man nicht vorhersagen kann, wieviel Zeichen ich bei einem bestimmten ErrorLevel tatsächlich verwenden kann (wie ich es bisher in meiner Variante gelöst habe).
    Im niedrigsten Level sind 2953 Byte möglich - Das wiederum können typabhängig durchaus über 4.000 Zeichen sein. Aber ich habe nirgends eine konkrete Angabe gefunden, in welcher Konstellation, welche Zeichen in welcher Anzahl verwendet werden können. Und ich habe keine Lust 200$ für die Norm auszugeben. :whistling:
    Ich setze jetzt einfach 1Byte = 1Zeichen, als Maximum also 2953 Zeichen. Das ist zwar nicht korrekt - aber zumindest ist es in dieser Anzahl egal, welcher Zeichentyp verwendet wird. Diese Anzahl ist auf jeden Fall möglich.

  • Zitat

    Die 64Bit-Variante ermöglicht also einen Parameter für ErrorCorrectionLevel, die 32Bit-Variante hingegen nicht. Das finde ich ziemlich schräg.

    Nein, die 32-bit-dll von UEZ funktioniert auch mit dem 5. Parameter!

  • ich habe nirgends eine konkrete Angabe gefunden, in welcher Konstellation, welche Zeichen in welcher Anzahl verwendet werden können. Und ich habe keine Lust 200$ für die Norm auszugeben. :whistling:

    Zitat

    maximum QR Code symbol size, Version 40-L:
    numeric data: 7 089 characters
    alphanumeric data: 4 296 characters
    Byte data: 2 953 characters
    Kanji data: 1 817 characters

    Edit: Problem anscheinend falsch verstanden, sorry.

    • Offizieller Beitrag

    James, das ist bekannt - aber damit ist es nicht möglich die Anzahl der verwenbaren Zeichen während der Eingabe zu bestimmen. Diese Angaben beziehen sich auf nur numerisch oder nur alnum oder nur byte. Der Speicherbedarf variiert dadurch und ich kann keinen Zähler setzen, der es mir erlaubt zu sagen: He, hier ist Schluß - mehr kann nicht verwertet werden. Sicher weiß ich das erst, wenn die Funktion ggf. crasht. :whistling:

  • HIERgibt es eine Tabelle in der die Länge der Codes nach cells/character angegeben sind (Seite 9 imho)
    @James1337, nach dieser Tabelle arbeitet er ja schon....

    • Offizieller Beitrag

    Danke Andy.
    Ich vermute, noch wichtiger ist dieser Absatz:

    Zitat

    c) Data Conversion Efficiency
    QR Code has four types of conversion mode - numerical characters, alphanumerical/signs, binary, and Kanji characters
    - for encoding the data. Each mode has had considerations to improve its conversion efficiency. The number of cells
    required for each character in each mode is listed in Table 1.

    Ich interpretiere das so, da es 4 Umwandlungs-Modi gibt, wird immer der Modi angewandt der das niedrigste Niveau hat. Denn Alnum enthält Num, Binary enthält wiederum auch Alnum und Kanji kann alles sein. Dementsprechend steigt der Platzbedarf an.
    Also als Bsp.
    - nur Ziffern: jedes Zeichen 3,3 Cells
    - taucht ein Buchstabe mit auf: für jedes Zeichen (auch die bereits vorhandenen Ziffern): 5,5 Cells
    - usw. mit Binary ( 8 ) und Kanji ( 13 )

    OK, dann habe ich ja eine reale Grundlage den Platzbedarf zu bestimmen.

    Edit: Habe grade festgestellt, dass ich mir viel zu viel Gedanken mache. :D
    In der QR-Definition sind alphanumerische Zeichen ausschließlich Großbuchstaben, Ziffern und einige Sonderzeichen. Somit sind zwangsläufig alle Eingaben als Binary zu betrachten, da nur dort auch Kleinbuchstaben und die restlichen Satz- und Sonderzeichen berücksichtigt werden.