Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2012.03.18;
Скачать: [xml.tar.bz2];

Вниз

Перевод заголовочного файла *.h в подключаемый модуль *.pas   Найти похожие ветки 

 
Василий Жогарев ©   (2011-09-09 12:03) [0]

Уважаемые мастера, прошу Вас оказать содействие в переводе заголовочного файла qrencode.h (C/C++), подключаемой библиотеки qrcodelib.dll, в подключаемый модуль qrencode.pas (Delphi).

http://code.google.com/p/qrencode-win32/downloads/detail?name=qrcode-win32-3.1.1.zip


 
Василий Жогарев ©   (2011-09-09 12:03) [1]

/**
* qrencode - QR Code encoder
*
* Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/

/** \mainpage
* Libqrencode is a library for encoding data in a QR Code symbol, a kind of 2D
* symbology.
*
* \section encoding Encoding
*
* There are two ways to encode data: encoding a string or
* encoding a structured data.
*
* \subsection encoding-string Encoding a string
* You can encode a string by calling QRcode_encodeString().
* The given string is parsed automatically and encoded. If you want to encode
* data that can be represented as a C string style (NUL terminated), you can
* simply use this way.
*
* If the input data contains Kanji (Shift-JIS) characters and you want to
* encode them as Kanji in QR Code, you should give QR_MODE_KANJI as a hint.
* Otherwise, all of non-alphanumeric characters are encoded as 8 bit data.
* If you want to encode a whole string in 8 bit mode, use
* QRcode_encodeString8bit() instead.
*
* Please note that a C string can not contain NUL character. If your data
* contains NUL, you should chose the second way.
*
* \subsection encoding-input Encoding a structured data
* You can construct a structured input data manually. If the structure of the
* input data is known, you can use this way.
* At first, create a ::QRinput object by QRinput_new(). Then add input data
* to the QRinput object by QRinput_append(). Finally call QRcode_encodeInput()
* to encode the QRinput data.
* You can reuse the QRinput data again to encode it in other symbols with
* different parameters.
*
* \section result Result
* The encoded symbol is resulted as a ::QRcode object. It will contain
* its version number, width of the symbol and an array represents the symbol.
* See ::QRcode for the details. You can free the object by QRcode_free().
*
* Please note that the version of the result may be larger than specified.
* In such cases, the input data would be too large to be encoded in a
* symbol of the specified version.
*
* \section structured Structured append
* Libqrencode can generate "Structured-appended" symbols that enables to split
* a large data set into mulitple QR codes. A QR code reader concatenates
* multiple QR code symbols into a string.
* Just like QRcode_encodeString(), you can use QRcode_encodeStringStructured()
* to generate structured-appended symbols. This functions returns an instance
* of ::QRcode_List. The returned list is a singly-linked list of QRcode: you
* can retrieve each QR code in this way:
*  
* \code
* QRcode_List *qrcodes;
* QRcode_List *entry;
* QRcode *qrcode;
*
* qrcodes = QRcode_encodeStringStructured(...);
* entry = qrcodes;
* while(entry != NULL) {
*     qrcode = entry->code;
*     // do something
*     entry = entry->next;
* }
* QRcode_List_free(entry);
* \endcode
*
* Instead of using auto-parsing functions, you can construct your own
* structured input. At first, instantiate an object of ::QRinput_Struct
* by calling QRinput_Struct_new(). This object can hold multiple ::QRinput,
* and one QR code is generated for a ::QRinput.
* QRinput_Struct_appendInput() appends a ::QRinput to a ::QRinput_Struct
* object. In order to generate structured-appended symbols, it is required to
* embed headers to each symbol. You can use
* QRinput_Struct_insertStructuredAppendHeaders() to insert appropriate
* headers to each symbol. You should call this function just once before
* encoding symbols.
*/


 
Василий Жогарев ©   (2011-09-09 12:04) [2]

#ifndef __QRENCODE_H__
#define __QRENCODE_H__

#if defined(__cplusplus)
extern "C" {
#endif

/**
* Encoding mode.
*/
typedef enum {
QR_MODE_NUL = -1,  ///< Terminator (NUL character). Internal use only
QR_MODE_NUM = 0,   ///< Numeric mode
QR_MODE_AN,        ///< Alphabet-numeric mode
QR_MODE_8,         ///< 8-bit data mode
QR_MODE_KANJI,     ///< Kanji (shift-jis) mode
QR_MODE_STRUCTURE, ///< Internal use only
} QRencodeMode;

/**
* Level of error correction.
*/
typedef enum {
QR_ECLEVEL_L = 0, ///< lowest
QR_ECLEVEL_M,
QR_ECLEVEL_Q,
QR_ECLEVEL_H      ///< highest
} QRecLevel;


 
Василий Жогарев ©   (2011-09-09 12:04) [3]

/******************************************************************************
* Input data (qrinput.c)
*****************************************************************************/

/**
* Singly linked list to contain input strings. An instance of this class
* contains its version and error correction level too. It is required to
* set them by QRinput_setVersion() and QRinput_setErrorCorrectionLevel(),
* or use QRinput_new2() to instantiate an object.
*/
typedef struct _QRinput QRinput;

/**
* Instantiate an input data object. The version is set to 0 (auto-select)
* and the error correction level is set to QR_ECLEVEL_L.
* @return an input object (initialized). On error, NULL is returned and errno
*         is set to indicate the error.
* @throw ENOMEM unable to allocate memory.
*/
extern QRinput *QRinput_new(void);

/**
* Instantiate an input data object.
* @param version version number.
* @param level Error correction level.
* @return an input object (initialized). On error, NULL is returned and errno
*         is set to indicate the error.
* @throw ENOMEM unable to allocate memory for input objects.
* @throw EINVAL invalid arguments.
*/
extern QRinput *QRinput_new2(int version, QRecLevel level);

/**
* Append data to an input object.
* The data is copied and appended to the input object.
* @param input input object.
* @param mode encoding mode.
* @param size size of data (byte).
* @param data a pointer to the memory area of the input data.
* @retval 0 success.
* @retval -1 an error occurred and errno is set to indeicate the error.
*            See Execptions for the details.
* @throw ENOMEM unable to allocate memory.
* @throw EINVAL input data is invalid.
*
*/
extern int QRinput_append(QRinput *input, QRencodeMode mode, int size, const unsigned char *data);

/**
* Get current version.
* @param input input object.
* @return current version.
*/
extern int QRinput_getVersion(QRinput *input);

/**
* Set version of the QR-code that is to be encoded.
* @param input input object.
* @param version version number (0 = auto)
* @retval 0 success.
* @retval -1 invalid argument.
*/
extern int QRinput_setVersion(QRinput *input, int version);

/**
* Get current error correction level.
* @param input input object.
* @return Current error correcntion level.
*/
extern QRecLevel QRinput_getErrorCorrectionLevel(QRinput *input);

/**
* Set error correction level of the QR-code that is to be encoded.
* @param input input object.
* @param level Error correction level.
* @retval 0 success.
* @retval -1 invalid argument.
*/
extern int QRinput_setErrorCorrectionLevel(QRinput *input, QRecLevel level);

/**
* Free the input object.
* All of data chunks in the input object are freed too.
* @param input input object.
*/
extern void QRinput_free(QRinput *input);

/**
* Validate the input data.
* @param mode encoding mode.
* @param size size of data (byte).
* @param data a pointer to the memory area of the input data.
* @retval 0 success.
* @retval -1 invalid arguments.
*/
extern int QRinput_check(QRencodeMode mode, int size, const unsigned char *data);

/**
* Set of QRinput for structured symbols.
*/
typedef struct _QRinput_Struct QRinput_Struct;

/**
* Instantiate a set of input data object.
* @return an instance of QRinput_Struct. On error, NULL is returned and errno
*         is set to indicate the error.
* @throw ENOMEM unable to allocate memory.
*/
extern QRinput_Struct *QRinput_Struct_new(void);

/**
* Set parity of structured symbols.
* @param s structured input object.
* @param parity parity of s.
*/
extern void QRinput_Struct_setParity(QRinput_Struct *s, unsigned char parity);

/**
* Append a QRinput object to the set.
* @warning never append the same QRinput object twice or more.
* @param s structured input object.
* @param input an input object.
* @retval >0 number of input objects in the structure.
* @retval -1 an error occurred. See Exceptions for the details.
* @throw ENOMEM unable to allocate memory.
*/
extern int QRinput_Struct_appendInput(QRinput_Struct *s, QRinput *input);

/**
* Free all of QRinput in the set.
* @param s a structured input object.
*/
extern void QRinput_Struct_free(QRinput_Struct *s);

/**
* Split a QRinput to QRinput_Struct. It calculates a parity, set it, then
* insert structured-append headers.
* @param input input object. Version number and error correction level must be
*        set.
* @return a set of input data. On error, NULL is returned, and errno is set
*         to indicate the error. See Exceptions for the details.
* @throw ERANGE input data is too large.
* @throw EINVAL invalid input data.
* @throw ENOMEM unable to allocate memory.
*/
extern QRinput_Struct *QRinput_splitQRinputToStruct(QRinput *input);

/**
* Insert structured-append headers to the input structure. It calculates
* a parity and set it if the parity is not set yet.
* @param s input structure
* @retval 0 success.
* @retval -1 an error occurred and errno is set to indeicate the error.
*            See Execptions for the details.
* @throw EINVAL invalid input object.
* @throw ENOMEM unable to allocate memory.
*/
extern int QRinput_Struct_insertStructuredAppendHeaders(QRinput_Struct *s);


 
Василий Жогарев ©   (2011-09-09 12:05) [4]

/******************************************************************************
* QRcode output (qrencode.c)
*****************************************************************************/

/**
* QRcode class.
* Symbol data is represented as an array contains width*width uchars.
* Each uchar represents a module (dot). If the less significant bit of
* the uchar is 1, the corresponding module is black. The other bits are
* meaningless for usual applications, but here its specification is described.
*
* <pre>
* MSB 76543210 LSB
*     |||||||`- 1=black/0=white
*     ||||||`-- data and ecc code area
*     |||||`--- format information
*     ||||`---- version information
*     |||`----- timing pattern
*     ||`------ alignment pattern
*     |`------- finder pattern and separator
*     `-------- non-data modules (format, timing, etc.)
* </pre>
*/
typedef struct {
int version;         ///< version of the symbol
int width;           ///< width of the symbol
unsigned char *data; ///< symbol data
} QRcode;

/**
* Singly-linked list of QRcode. Used to represent a structured symbols.
* A list is terminated with NULL.
*/
typedef struct _QRcode_List QRcode_List;

struct _QRcode_List {
QRcode *code;
QRcode_List *next;
};

/**
* Create a symbol from the input data.
* @warning This function is THREAD UNSAFE.
* @param input input data.
* @return an instance of QRcode class. The version of the result QRcode may
*         be larger than the designated version. On error, NULL is returned,
*         and errno is set to indicate the error. See Exceptions for the
*         details.
* @throw EINVAL invalid input object.
* @throw ENOMEM unable to allocate memory for input objects.
*/
extern QRcode *QRcode_encodeInput(QRinput *input);

/**
* Create a symbol from the string. The library automatically parses the input
* string and encodes in a QR Code symbol.
* @warning This function is THREAD UNSAFE.
* @param string input string. It must be NULL terminated.
* @param version version of the symbol. If 0, the library chooses the minimum
*                version for the given input data.
* @param level error correction level.
* @param hint tell the library how non-alphanumerical characters should be
*             encoded. If QR_MODE_KANJI is given, kanji characters will be
*             encoded as Shif-JIS characters. If QR_MODE_8 is given, all of
*             non-alphanumerical characters will be encoded as is. If you want
*             to embed UTF-8 string, choose this.
* @param casesensitive case-sensitive(1) or not(0).
* @return an instance of QRcode class. The version of the result QRcode may
*         be larger than the designated version. On error, NULL is returned,
*         and errno is set to indicate the error. See Exceptions for the
*         details.
* @throw EINVAL invalid input object.
* @throw ENOMEM unable to allocate memory for input objects.
*/
extern QRcode *QRcode_encodeString(const char *string, int version, QRecLevel level, QRencodeMode hint, int casesensitive);

/**
* Same to QRcode_encodeString(), but encode whole data in 8-bit mode.
* @warning This function is THREAD UNSAFE.
*/
extern QRcode *QRcode_encodeString8bit(const char *string, int version, QRecLevel level);

/**
* Free the instance of QRcode class.
* @param qrcode an instance of QRcode class.
*/
extern void QRcode_free(QRcode *qrcode);

/**
* Create structured symbols from the input data.
* @warning This function is THREAD UNSAFE.
* @param s
* @return a singly-linked list of QRcode.
*/
extern QRcode_List *QRcode_encodeInputStructured(QRinput_Struct *s);

/**
* Create structured symbols from the string. The library automatically parses
* the input string and encodes in a QR Code symbol.
* @warning This function is THREAD UNSAFE.
* @param string input string. It should be NULL terminated.
* @param version version of the symbol.
* @param level error correction level.
* @param hint tell the library how non-alphanumerical characters should be
*             encoded. If QR_MODE_KANJI is given, kanji characters will be
*             encoded as Shif-JIS characters. If QR_MODE_8 is given, all of
*             non-alphanumerical characters will be encoded as is. If you want
*             to embed UTF-8 string, choose this.
* @param casesensitive case-sensitive(1) or not(0).
* @return a singly-linked list of QRcode. On error, NULL is returned, and
*         errno is set to indicate the error. See Exceptions for the details.
* @throw EINVAL invalid input object.
* @throw ENOMEM unable to allocate memory for input objects.
*/
extern QRcode_List *QRcode_encodeStringStructured(const char *string, int version, QRecLevel level, QRencodeMode hint, int casesensitive);

/**
* Same to QRcode_encodeStringStructured(), but encode whole data in 8-bit mode.
* @warning This function is THREAD UNSAFE.
*/
extern QRcode_List *QRcode_encodeString8bitStructured(const char *string, int version, QRecLevel level);

/**
* Return the number of symbols included in a QRcode_List.
* @param qrlist a head entry of a QRcode_List.
* @return number of symbols in the list.
*/
extern int QRcode_List_size(QRcode_List *qrlist);

/**
* Free the QRcode_List.
* @param qrlist a head entry of a QRcode_List.
*/
extern void QRcode_List_free(QRcode_List *qrlist);

#if defined(__cplusplus)
}
#endif

#endif /* __QRENCODE_H__ */


 
Василий Жогарев ©   (2011-09-09 12:07) [5]

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

Спасибо.


 
OW ©   (2011-09-09 12:12) [6]

смеётесь?
из всей портянки надо исключить комментарии и взять distinct типов и функций
тогда вероятность ответа будет больше.
( Сейчас она, имхо, близка к 0 :)


 
Василий Жогарев ©   (2011-09-09 12:28) [7]

#ifndef __QRENCODE_H__
#define __QRENCODE_H__

#if defined(__cplusplus)
extern "C" {
#endif

typedef enum {
QR_MODE_NUL = -1,  ///< Terminator (NUL character). Internal use only
QR_MODE_NUM = 0,   ///< Numeric mode
QR_MODE_AN,        ///< Alphabet-numeric mode
QR_MODE_8,         ///< 8-bit data mode
QR_MODE_KANJI,     ///< Kanji (shift-jis) mode
QR_MODE_STRUCTURE, ///< Internal use only
} QRencodeMode;

typedef enum {
QR_ECLEVEL_L = 0, ///< lowest
QR_ECLEVEL_M,
QR_ECLEVEL_Q,
QR_ECLEVEL_H      ///< highest
} QRecLevel;

typedef struct _QRinput QRinput;

extern QRinput *QRinput_new(void);
extern QRinput *QRinput_new2(int version, QRecLevel level);
extern int QRinput_append(QRinput *input, QRencodeMode mode, int size, const unsigned char *data);
extern int QRinput_getVersion(QRinput *input);
extern int QRinput_setVersion(QRinput *input, int version);
extern QRecLevel QRinput_getErrorCorrectionLevel(QRinput *input);
extern int QRinput_setErrorCorrectionLevel(QRinput *input, QRecLevel level);
extern void QRinput_free(QRinput *input);
extern int QRinput_check(QRencodeMode mode, int size, const unsigned char *data);

typedef struct _QRinput_Struct QRinput_Struct;

extern QRinput_Struct *QRinput_Struct_new(void);
extern void QRinput_Struct_setParity(QRinput_Struct *s, unsigned char parity);
extern int QRinput_Struct_appendInput(QRinput_Struct *s, QRinput *input);
extern void QRinput_Struct_free(QRinput_Struct *s);
extern QRinput_Struct *QRinput_splitQRinputToStruct(QRinput *input);
extern int QRinput_Struct_insertStructuredAppendHeaders(QRinput_Struct *s);

typedef struct {
int version;         ///< version of the symbol
int width;           ///< width of the symbol
unsigned char *data; ///< symbol data
} QRcode;

typedef struct _QRcode_List QRcode_List;

struct _QRcode_List {
QRcode *code;
QRcode_List *next;
};

extern QRcode *QRcode_encodeInput(QRinput *input);
extern QRcode *QRcode_encodeString(const char *string, int version, QRecLevel level, QRencodeMode hint, int casesensitive);
extern QRcode *QRcode_encodeString8bit(const char *string, int version, QRecLevel level);
extern void QRcode_free(QRcode *qrcode);
extern QRcode_List *QRcode_encodeInputStructured(QRinput_Struct *s);
extern QRcode_List *QRcode_encodeStringStructured(const char *string, int version, QRecLevel level, QRencodeMode hint, int casesensitive);
extern QRcode_List *QRcode_encodeString8bitStructured(const char *string, int version, QRecLevel level);
extern int QRcode_List_size(QRcode_List *qrlist);
extern void QRcode_List_free(QRcode_List *qrlist);

#if defined(__cplusplus)
}
#endif

#endif /* __QRENCODE_H__ */


А так?... :)


 
Василий Жогарев ©   (2011-09-09 12:32) [8]

Ну допустим начну со структур и перечислений, соответственно структуры в записи structure -> record, перечисления в перечисления.

Но на счет перечислений есть сомнения, может лучше использовать объявленные константы?


 
Василий Жогарев ©   (2011-09-09 12:36) [9]

TQRencodeMode = (
   QR_MODE_NUL = -1,
   QR_MODE_NUM = 0,
   QR_MODE_AN,
   QR_MODE_8,
   QR_MODE_KANJI,
   QR_MODE_STRUCTURE
);


Я правильно понимаю?


 
Василий Жогарев ©   (2011-09-09 12:57) [10]

Прошу модераторов удалить посты под номерами: [1], [2], [3], [4].
Извините за флуд... )


 
Василий Жогарев ©   (2011-09-09 18:24) [11]

Не пойму что за тип и откуда он берется:

typedef struct _QRinput QRinput;

Не совсем понятно, что это? Пустая структура/перечисление или структура/перечисление с одним элементом?

Как это описать ObjectPascal-ем?


 
Василий Жогарев ©   (2011-09-10 11:30) [12]

Другой форум по этому вопросу: http://www.forum.crossplatform.ru/index.php?showtopic=7485&st=0&gopid=52864&#entry52864


 
Кто б сомневался ©   (2011-09-11 04:40) [13]


> прошу Вас оказать содействие в переводе заголовочного файла
> qrencode.h (C/C++), подключаемой библиотеки qrcodelib.dll,
>  в подключаемый модуль qrencode.pas (Delphi).


Прям вынь да положи. Вам деньги заплатят ведь, а не "Уважаемым мастерам".
Я понимаю если что-то конкретное...


 
Василий Жогарев ©   (2011-09-11 08:41) [14]

Поверьте, у нас не заплатят 8)
В таком случае сам разберусь, просто хотел мнения, предложения мастеров услышать, а так-то там нечего переводить на ObjP. Зря так много запостил, единственный вопрос был впринципе в переводе структур, и соответствии типов данных.

Сделаю, выложу, чтобы непосредственно Вы: Кто б сомневался © денег заработали...

Вот какая у вас зарплата на рубли?


 
Василий Жогарев ©   (2011-09-11 14:12) [15]

В общем, перевел структуры и функции.

unit qrencode;

interface

type
 QRencodeMode = (
   QR_MODE_NUL = -1,  ///< Terminator (NUL character). Internal use only
  QR_MODE_NUM = 0,   ///< Numeric mode
  QR_MODE_AN,        ///< Alphabet-numeric mode
  QR_MODE_8,         ///< 8-bit data mode
  QR_MODE_KANJI,     ///< Kanji (shift-jis) mode
  QR_MODE_STRUCTURE
 );

 QRecLevel = (
   QR_ECLEVEL_L = 0, ///< lowest
  QR_ECLEVEL_M,
  QR_ECLEVEL_Q,
  QR_ECLEVEL_H      ///< highest
 );

 BitStream = record
   length: LongInt;
  data: PChar;
 end;

 P_QRinput_List = ^_QRinput_List;
 _QRinput_List = record
   mode: QRencodeMode;
  size: LongInt;    ///< Size of data chunk (byte).
  data: PChar;         ///< Data chunk.
  bstream: BitStream;
  next: P_QRinput_List;
 end;

 P_QRinput = ^_QRinput;
 _QRinput = record
   version: LongInt;
  level: QRecLevel;
  head: P_QRinput_List;
  tail: P_QRinput_List;
 end;

function QRinput_new: P_QRinput; external "qrcodelib.dll" name "QRinput_new";
function QRinput_new2(version: LongInt; level: QRecLevel): P_QRinput; external "qrcodelib.dll" name "QRinput_new2";
function QRinput_append(input: P_QRinput; mode: QRencodeMode; size: LongInt; const data: PChar): LongInt; external "qrcodelib.dll" name "QRinput_append";
function QRinput_getVersion(input: P_QRinput): LongInt; external "qrcodelib.dll" name "QRinput_getVersion";
function QRinput_setVersion(input: P_QRinput; version: LongInt): LongInt; external "qrcodelib.dll" name "QRinput_setVersion";
function QRinput_getErrorCorrectionLevel(input: P_QRinput): QRecLevel; external "qrcodelib.dll" name "QRinput_getErrorCorrectionLevel";
function QRinput_setErrorCorrectionLevel(input: P_QRinput; level: QRecLevel): LongInt; external "qrcodelib.dll" name "QRinput_setErrorCorrectionLevel";
procedure QRinput_free(input: P_QRinput); external "qrcodelib.dll" name "QRinput_free";
function QRinput_check(mode: QRencodeMode; size: LongInt; const data: PChar): LongInt; external "qrcodelib.dll" name "QRinput_check";

type
 P_QRinput_InputList = ^_QRinput_InputList;
 _QRinput_InputList = record
   input: P_QRinput;
  next: P_QRinput_InputList;
 end;

 P_QRinput_Struct = ^_QRinput_Struct;
 _QRinput_Struct = record
   size: LongInt;     ///< number of structured symbols
  parity: LongInt;
  head: P_QRinput_InputList;
  tail: P_QRinput_InputList;
 end;

function QRinput_Struct_new: P_QRinput_Struct; external "qrcodelib.dll" name "QRinput_Struct_new";
procedure QRinput_Struct_setParity(s: P_QRinput_Struct; parity: PChar); external "qrcodelib.dll" name "QRinput_Struct_setParity";
function QRinput_Struct_appendInput(s: P_QRinput_Struct; input: P_QRinput): LongInt; external "qrcodelib.dll" name "QRinput_Struct_appendInput";
procedure QRinput_Struct_free(s: P_QRinput_Struct); external "qrcodelib.dll" name "QRinput_Struct_free";
function QRinput_splitQRinputToStruct(input: P_QRinput): P_QRinput_Struct; external "qrcodelib.dll" name "QRinput_splitQRinputToStruct";
function QRinput_Struct_insertStructuredAppendHeaders(s: P_QRinput_Struct): LongInt; external "qrcodelib.dll" name "QRinput_Struct_insertStructuredAppendHeaders";

type
 PQRcode = ^QRcode;
 QRcode = record
   version: LongInt;         ///< version of the symbol
  width: LongInt;           ///< width of the symbol
  data: PChar; ///< symbol data
 end;

 P_QRcode_List = ^_QRcode_List;
 _QRcode_List = record
   code: PQRcode;
  next: P_QRcode_List;
 end;

function QRcode_encodeInput(input: P_QRinput): PQRcode; external "qrcodelib.dll" name "QRcode_encodeInput";
function QRcode_encodeString(const str: PChar; version: LongInt; level: QRecLevel; hint: QRencodeMode; casesensitive: LongInt): PQRcode; external "qrcodelib.dll" name "QRcode_encodeString";
function QRcode_encodeString8bit(const str: PChar; version: LongInt; level: QRecLevel): PQRcode;external "qrcodelib.dll" name "QRcode_encodeString8bit";
procedure QRcode_free(qrcode: PQRcode); external "qrcodelib.dll" name "QRcode_free";
function QRcode_encodeInputStructured(s: P_QRinput_Struct): P_QRcode_List; external "qrcodelib.dll" name "QRcode_encodeInputStructured";
function QRcode_encodeStringStructured(const str: PChar; version: LongInt; level: QRecLevel; hint: QRencodeMode; casesensitive: LongInt): P_QRcode_List; external "qrcodelib.dll" name "QRcode_encodeStringStructured";
function QRcode_encodeString8bitStructured(const str: PChar; version: LongInt; level: QRecLevel): P_QRcode_List; external "qrcodelib.dll" name "QRcode_encodeString8bitStructured";
function QRcode_List_size(qrlist: P_QRcode_List): LongInt; external "qrcodelib.dll" name "QRcode_List_size";
procedure QRcode_List_free(qrlist: P_QRcode_List); external "qrcodelib.dll" name "QRcode_List_free";

implementation

end.


 
Василий Жогарев ©   (2011-09-11 14:20) [16]

Только вот одно но...

при попытке выполнить код:

procedure TForm1.Button1Click(Sender: TObject);
var
 qrcodes: P_QRcode_List;
 entry: P_QRcode_List;
 qrcode: PQRcode;
begin
 qrcodes := QRcode_encodeStringStructured(PChar("http://delphimaster.ru/"), 0,
   QR_ECLEVEL_H, QR_MODE_AN, 0);
 entry := qrcodes;
 while (entry <> nil) do
 begin
   qrcode := entry.code;
   entry := entry.next;
 end;
 QRcode_List_free(entry);
end;


минуется цикл и идет сразу выгрузка QRcode_List_free(entry); в этот момент происходит ошибка:
First chance exception at $75B5D36F. Exception class EAccessViolation with message "Access violation at address 00000000. Read of address 00000000". Process Project1.exe (5036)

Можно конечно предположить что QRcode_encodeStringStructured ничего не возвращает, поставив условие перед выгрузкой на наличие nil, как бы "обезопасить", происходит другая ошибка: First chance exception at $75B5D36F. Exception class EAccessViolation with message "Access violation at address 00000000. Read of address 00000000". Process Project1.exe (4916)

Что я сделал не так? Уже все возможные варианты перебрал...


 
Василий Жогарев ©   (2011-09-11 14:23) [17]

Вот debug, кажет сюда:

75B5D35C 50               push eax
75B5D35D E88094FFFF       call $75b567e2
75B5D362 83C40C           add esp,$0c
75B5D365 8D45B0           lea eax,[ebp-$50]
75B5D368 50               push eax
75B5D369 FF155C11B575     call dword ptr [$75b5115c]
75B5D36F C9               leave
75B5D370 C21000           ret $0010
75B5D373 8945C0           mov [ebp-$40],eax
75B5D376 EBED             jmp $75b5d365
75B5D378 90               nop


 
Василий Жогарев ©   (2011-09-11 14:25) [18]


> Василий Жогарев ©   (09.09.11 12:57) [10]
> Прошу модераторов удалить посты под номерами: [1], [2],
> [3], [4].
> Извините за флуд... )


 
Anatoly Podgoretsky ©   (2011-09-11 14:42) [19]

> Василий Жогарев  (11.09.2011 14:20:16)  [16]

entry = nil


 
Василий Жогарев ©   (2011-09-11 15:06) [20]


> Anatoly Podgoretsky ©   (11.09.11 14:42) [19]
> > Василий Жогарев  (11.09.2011 14:20:16)  [16]
>
> entry = nil
>
>


Ну это понятно. Пример из модуля гласит:
* \code
* QRcode_List *qrcodes;
* QRcode_List *entry;
* QRcode *qrcode;
*
* qrcodes = QRcode_encodeStringStructured(...);
* entry = qrcodes;
* while(entry != NULL) {
*     qrcode = entry->code;
*     // do something
*     entry = entry->next;
* }
* QRcode_List_free(entry);
* \endcode


Вод собственно и не понятно почему возвращается nil...


 
Василий Жогарев ©   (2011-09-11 15:10) [21]

При переводе у меня вот, что еще вызвало сомнения:

function QRcode_encodeStringStructured(const str: PChar; version: LongInt; level: QRecLevel; hint: QRencodeMode; casesensitive: LongInt): P_QRcode_List; external "qrcodelib.dll" name "QRcode_encodeStringStructured";

/**
* Create structured symbols from the string. The library automatically parses
* the input string and encodes in a QR Code symbol.
* @warning This function is THREAD UNSAFE.
* @param string input string. It should be NULL terminated.

* @param version version of the symbol.
* @param level error correction level.
* @param hint tell the library how non-alphanumerical characters should be
*             encoded. If QR_MODE_KANJI is given, kanji characters will be
*             encoded as Shif-JIS characters. If QR_MODE_8 is given, all of
*             non-alphanumerical characters will be encoded as is. If you want
*             to embed UTF-8 string, choose this.
* @param casesensitive case-sensitive(1) or not(0).
* @return a singly-linked list of QRcode. On error, NULL is returned, and
*         errno is set to indicate the error. See Exceptions for the details.
* @throw EINVAL invalid input object.
* @throw ENOMEM unable to allocate memory for input objects.
*/
extern QRcode_List *QRcode_encodeStringStructured(const char *string, int version, QRecLevel level, QRencodeMode hint, int casesensitive);


 
Anatoly Podgoretsky ©   (2011-09-11 15:12) [22]

> Василий Жогарев  (11.09.2011 15:06:20)  [20]

Код QRcode_encodeStringStructured не приведен.


 
Anatoly Podgoretsky ©   (2011-09-11 15:15) [23]

> Anatoly Podgoretsky  (11.09.2011 15:12:22)  [22]

Отдадка тоже не произведена


 
DVM ©   (2011-09-11 15:35) [24]


> Василий Жогарев ©

Везде заменяй PChar на PAnsiChar


 
Василий Жогарев ©   (2011-09-11 16:30) [25]


> DVM ©   (11.09.11 15:35) [24]
> > Василий Жогарев ©Везде заменяй PChar на PAnsiChar


Думаете строго на 8 бит указывает... х.м., все может быть...
Спасибо за подсказку, завтра на работе проверю...


 
DVM ©   (2011-09-11 17:36) [26]


> Василий Жогарев ©   (11.09.11 16:30) [25]

у тебя версия Delhpi то какая?


 
Василий Жогарев ©   (2011-09-12 08:34) [27]


> DVM ©   (11.09.11 17:36) [26]
>
> > Василий Жогарев ©   (11.09.11 16:30) [25]
>
> у тебя версия Delhpi то какая?


Embarcadero® Delphi® 2010 Version 14.0.3593.25826


 
Василий Жогарев ©   (2011-09-12 09:34) [28]


> Везде заменяй PChar на PAnsiChar


Ошибка:
First chance exception at $75DAD36F. Exception class EAccessViolation with message "Access violation at address 00000000. Read of address 00000000". Process Project1.exe (4448)


 
Василий Жогарев ©   (2011-09-12 09:46) [29]


> Anatoly Podgoretsky ©   (11.09.11 15:12) [22]
> > Василий Жогарев  (11.09.2011 15:06:20)  [20]
>
> Код QRcode_encodeStringStructured не приведен.


QRcode_List *QRcode_encodeStringStructured(const char *string, int version, QRecLevel level, QRencodeMode hint, int casesensitive)
{
QRinput *input;
QRcode_List *codes;
int ret;

if(version <= 0) {
 errno = EINVAL;
 return NULL;
}
if(hint != QR_MODE_8 && hint != QR_MODE_KANJI) {
 errno = EINVAL;
 return NULL;
}

input = QRinput_new2(version, level);
if(input == NULL) return NULL;

ret = Split_splitStringToQRinput(string, input, hint, casesensitive);
if(ret < 0) {
 QRinput_free(input);
 return NULL;
}
codes = QRcode_encodeInputToStructured(input);
QRinput_free(input);

return codes;
}


 
Василий Жогарев ©   (2011-09-12 09:57) [30]

QRinput *QRinput_new(void)
{
return QRinput_new2(0, QR_ECLEVEL_L);
}

QRinput *QRinput_new2(int version, QRecLevel level)
{
QRinput *input;

if(version < 0 || version > QRSPEC_VERSION_MAX || level > QR_ECLEVEL_H) {
 errno = EINVAL;
 return NULL;
}

input = (QRinput *)malloc(sizeof(QRinput));
if(input == NULL) return NULL;

input->head = NULL;
input->tail = NULL;
input->version = version;
input->level = level;

return input;
}


 
DVM ©   (2011-09-12 14:04) [31]


> Василий Жогарев ©   (12.09.11 09:34) [28]


> Ошибка:
> First chance exception at $75DAD36F. Exception class EAccessViolation
> with message "Access violation at address 00000000. Read
> of address 00000000". Process Project1.exe (4448)
>
>

Не связано с заменой. С чего ты взял, что в эту dll можно передавать двухбайтовые строки Unicode? Исходя из сишного кода этого нельзя предположить. Там Char - 1 байт. Где то у тебя ошибка. Что это вообще за dll есть какая то документация по ней?


 
DVM ©   (2011-09-12 14:13) [32]


>  Василий Жогарев ©   (12.09.11 09:34) [28]
>

Судя по всему, библиотека работает с разными строками, тип данных задается QR_MODE_XX, но все равно, передавать в функции надо буфер PAnsiString. Как в сишном варианте задекларировано, так и переводи.


 
Василий Жогарев ©   (2011-09-12 19:05) [33]


> Что это вообще за dll есть какая то документация по ней?


http://fukuchi.org/works/qrencode/index.en.html


 
Pat ©   (2011-11-23 16:28) [34]


> Василий Жогарев ©   (12.09.11 19:05) [33]

Как успехи в работе с QRCode? Сейчас ст толкнулся с аналогичной проблемой. Необходимо генерировать qrcode. Пока даже и не знаю с чего начать :)


 
han_malign   (2011-11-23 17:49) [35]

во блин, как же я это такой классный поток бреда от "Мастеров" пропустил...

cdecl(скорее всего) либо stdcall, но уж никак не паскалевский register...


 
Юрий Зотов ©   (2011-11-23 22:35) [36]

Нигде не объявлены соглашения о вызове функций DLL - значит, компилятор использует Паскалевские.

А с чего бы это Сишные DLL вдруг будут использовать Паскалевские соглашения?



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2012.03.18;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.6 MB
Время: 0.003 c
15-1321993802
Юрий
2011-11-23 00:30
2012.03.18
С днем рождения ! 23 ноября 2011 среда


2-1322731427
Laguna
2011-12-01 13:23
2012.03.18
Контроль отправки письма по Email


2-1323074117
Бездомный
2011-12-05 12:35
2012.03.18
Как получить данные из DataSet не меняя его активную запись.


15-1322384341
RDen
2011-11-27 12:59
2012.03.18
конец света отменяется


2-1322726859
Faceless
2011-12-01 12:07
2012.03.18
TBucketList





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский