Wie umwandeln für Qt?

Verschiedenes zu Qt
Antworten
Markus
Beiträge: 105
Registriert: 31. Januar 2005 16:21

Wie umwandeln für Qt?

Beitrag 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.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Markus
Beiträge: 105
Registriert: 31. Januar 2005 16:21

Beitrag 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
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Da musst Du wohl mit dem Debugger schauen ob da wirklich 123456... drin steht. Ich glaube nämlich nicht.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag 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 ....
Markus
Beiträge: 105
Registriert: 31. Januar 2005 16:21

Beitrag 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.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

QString::fromUtf16() hilft auch.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Antworten