Seite 1 von 1

Wie umwandeln für Qt?

Verfasst: 8. Juli 2008 15:02
von Markus
Hallo!

Ich nutze eine C-Library, um einen Barcode-Scanner anzusprechen, aber irgendwie klappt es mit dem "Abholen" des Barcode-Inhaltes nicht hin.

Mit diesem Marco soll ich an den Inhalt kommen: (LPTSTR)SCNBUF_GETDATA(lpScanBuffer), wobei lpScanBuffer das u.g. Struct ist.

Aber in was muss ich es umwandeln, damit ich den Inhalt in Qt nutzen kann (QString,QByteArray,...)?

Ich habe irgendwie total das Brett vor dem Kopf...


Code: Alles auswählen

(LPTSTR)SCNBUF_GETDATA(lpScanBuffer)


#define SCNBUF_GETDATA(ptr) \
	(((LPBYTE)ptr)+SCNBUF_GETOFFSET(ptr))

#define SCNBUF_GETOFFSET(ptr) \
	( SI_FIELD_VALID(ptr,dwOffsetDataBuff) ? (ptr)->dwOffsetDataBuff : sizeof(SCAN_BUFFER) )

Als Grundlage dient dieses Struct:

Code: Alles auswählen

typedef struct tagSCAN_BUFFER_A
{
	STRUCT_INFO		StructInfo;

	DWORD			dwDataBuffSize;		// Size of data buffer in bytes (includes aux buffer)
	DWORD			dwOffsetDataBuff;	// Offset from start of struct to data buffer
	DWORD			dwDataLength;		// Length of data placed into buffer

	DWORD			dwTimeout;			// Read timeout in milliseconds
										//  Set by application via C API

	DWORD			dwStatus;			// Status of the read request
										//  Set by PDD and by MDD
										//   E_SCN_SUCCESS if complete
										//   E_SCN_DEVICEFAILURE if disconnected
										//   E_SCN_READPENDING while pending
										//   or some other error if appropriate

	BOOL			bText;				// Data is text
										//  Set by application via C API

	LABELTYPE		dwLabelType;		// Symbol label type code
										//  Set by PDD after good read

	DWORD			dwRequestID;		// Request ID assigned to the read
										//  Set by C API

	SYSTEMTIME		TimeStamp;			// System time when read completed
										//  Set by MDD after good read

	DWORD			dwDirection;		// Direction label was scanned
										//  Set by PDD after good read

	CHAR			szSource[MAX_SRC];	// SCNx:Symbology
										//  Set by MDD after good read

	BOOL			bIsMultiPart;		// Set to true if data is in a multi-part format
										//  Set by PDD after good read

	DWORD			dwScanID;			// Scan ID assigned to a read
										//  Multiple barcodes obtained from the same scan
										//  will have the same ID
										//  Set by MDD after good read

	DWORD			dwBarcodeID;		// Barcode ID assigned to a physical barcode
										//  Multiple data packets from the same physical
										//  barcode will have the same ID
										//  Set by MDD after good read

	DWORD			dwNumRemaining;		// The number of remaining barcodes or data packets
										//  obtained from the same scan
										//  Set by MDD after good read

	DWORD			dwOffsetAuxDataBuff;// Offset from start of struct to auxilliary data buffer
										//  Set by PDD after good read

	DWORD			dwAuxDataLength;	// Length of data in auxilliary data buffer
										//  Set by PDD after good read

} SCAN_BUFFER_A;


PS: Falls es in das C/C++ Forum gehört, bitte verschieben.

Verfasst: 8. Juli 2008 15:10
von Christian81
Was willst Du machen? Sieh Dir einfach mal die Doku zu QByteArray an - dort steht wie man von einen char* nach QByteArray kommt...do

Verfasst: 8. Juli 2008 15:51
von Markus
Ich möchte nur den String haben, der vom Scanner gelesen wurde:

Mein aktueller Aufruf lautet so:

Code: Alles auswählen

QString strBuffer = QByteArray::fromRawData((char*)SCNBUF_GETDATA(pScanBuffer), pScanBuffer->dwDataLength );
Wobei die Länge (pScanBuffer->dwDataLength) einen Wert von 16 hat und der Inhalt eigentlich "1234567890123456" sein müßte, aber ich bekomme immer nur "1" in meinem strBuffer zurück.


Und wenn ich folgende mache:
qDebug() << "Data:" << SCNBUF_GETDATA(pScanBuffer);

Habe ich als Ausgabe:
Data: 0x3611e4

Verfasst: 8. Juli 2008 16:22
von Christian81
Da musst Du wohl mit dem Debugger schauen ob da wirklich 123456... drin steht. Ich glaube nämlich nicht.

Verfasst: 9. Juli 2008 14:41
von RHBaum
Um genauer zu sein:

LPTSTR ist ein TCHAR *

und TCHAR ist der zwitter unter den char typen in windows ...
Also wenn UNICODE gesetzt ist, ist das ein WCHAR * und nur wenn UNICODE ned gesetzt ist, ist das nen char *

QT anwendungen wiederum haben meist UNICODE gesetzt ....

also dein string ist wahrscheinlich unicode, das erklaer warum du nur die '1' bekommst, weil das 2te byte fuer die '1' im WCHAR * die 0 ist, und ein char String das als zeichenende erkennt.

QString verwendet intern auch kein ANSI, also bevor doppelt konvertierts, gibt es sowas zum glueck :
QString & QString::setUnicode ( const QChar * unicode, int size );

Ciao ....

Verfasst: 9. Juli 2008 17:08
von Markus
@RHBaum
Genau, Du hast recht mit WCHAR und Unicode. Was mir auch der Debugger gezeigt.



Ich habe jetzt einen "Workaround" gefunden/genutzt. Um Buffer für die Scandaten genutzt wird anzulegen, kann ich angeben, ob es Text oder Binärdaten sind. Ich habe die ganze Zeit mit Text-Daten gearbeitet und hatte dieses Zeichensatz-"Problem". Mit Binärdaten klappt es wunderbar mit einem QByteArray.

Aber vielen Dank für die Hilfe und die tollen Erklärungen.

Verfasst: 14. Juli 2008 19:35
von Christian81
QString::fromUtf16() hilft auch.