Forum: PC-Programmierung C++ Fehler bei der win32 api


von C++ win32 Daten Übertragung[232] (Gast)


Lesenswert?

Guten Tag, ich habe ein Programm in C, das die Daten einer Messung von 
einem Messgerät über die 232 Schnittstellen an den Pc überträgt. Alles 
funktioniert.
Jetzt wollte ich das Programm in c++ zu schreiben mit einer Gui in qt4.
Ich habe den Code fast übernommen, ich bekomme jedoch zwei 
Fehlermeldungen.
Könnt ihr mir bitte mit diesen FEhlern weiterhelfen.
Vielen Dank schon mal.

Hier ist mein Programm:
1
void MyWindow::Messen()
2
{ 
3
4
   QString dateiname = datei->text();
5
   std::string s1 = dateiname.toAscii().data();
6
7
   QString name = geraete->text();
8
   std::string s2 = name.toAscii().data();
9
10
   QString seriennummer = nummer->text();
11
   std::string s3 = seriennummer.toAscii().data();
12
13
   char* tmp = new char[s1.size() + 1];
14
   strcpy(tmp, s1.c_str());
15
   std::ofstream outfile;
16
   outfile.open(tmp);
17
18
   outfile  << s2 << std::endl;
19
   outfile  << s3 << std::endl;
20
21
   HANDLE hPort;
22
   DWORD dw;
23
   DCB dcb;
24
   unsigned char buf;
25
26
   
27
//hier habe ich den Fehler
28
hPort=CreateFile( "COM1",GENERIC_READ | GENERIC_WRITE, 0,  NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
29
30
31
   if (hPort == INVALID_HANDLE_VALUE)
32
   GetCommState(hPort, &dcb);
33
   BuildCommDCB("9600,n,8,1", &dcb);
34
   SetCommState(hPort, &dcb);
35
36
   while(1)
37
   {
38
        ReadFile(hPort, &buf, 1, &dw,NULL);
39
        if('\r' == buf)continue;
40
        if(buf==12)break;
41
        printf("%c",buf);
42
        outfile << buf << std::endl;
43
   }
44
45
   CloseHandle(hPort);
46
   outfile.close();
47
48
   delete[] tmp;
49
}
1
hPort=CreateFile( "COM1",GENERIC_READ | GENERIC_WRITE, 0, NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
Hier bekomme ich diese Fehlermeldung
[/c]

mywindow.cpp:93: error: cannot convert 'const char*' to 'const WCHAR*' 
for argument '1' to 'void* CreateFileW(const WCHAR*, DWORD, DWORD, 
_SECURITY_ATTRIBUTES*, DWORD, DWORD, void*)'

und heir auch
1
 BuildCommDCB("9600,n,8,1", &dcb);

mywindow.cpp:96: error: cannot convert 'const char*' to 'const WCHAR*' 
for argument '1' to 'BOOL BuildCommDCBW(const WCHAR*, _DCB*)'

von Peter (Gast)


Lesenswert?

das ganze ist mehr ein unicode problem, willst du wirkich ein uncicode 
Projekt anlegen?

so müsste es aber gehen
1
  hPort=CreateFile( T("COM1"),GENERIC_READ | GENERIC_WRITE, 0, NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

C++ win32  Daten Übertragung[232] schrieb:
> if (hPort == INVALID_HANDLE_VALUE)
>    GetCommState(hPort, &dcb);
>    BuildCommDCB("9600,n,8,1", &dcb);
>    SetCommState(hPort, &dcb);

Das ist Unfug. Wenn hPort ungültig ist, ist das Öffnen der Schnittstelle 
fehlgeschlagen, und GetCommState kann gar nicht funktionieren.

Den eigentlichen Fehler hat Peter schon ganz gut eingegrenzt; allerdings 
sollte es

  _T("COM1")

heißen und nicht

  T("COM1")

Bei BuildCommDCB handelt es sich um das gleiche Problem, die 
Strinkonstante sollte in _T() eingeschlossen werden.

Sinnvoller aber ist, wie Peter bereits andeutete, auf Unicode zu 
verzichten. Was eine Compiler/Projekteinstellung ist.

von Mr. S (Gast)


Lesenswert?

Peter schrieb:
> hPort=CreateFile( T("COM1"),GENERIC_READ | GENERIC_WRITE, 0, 
NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);

Hi danke für die Antwort, ihc bekomme jedoch die gleiche Fehlermeldung

mywindow.cpp:93: error: 'T' was not declared in this scope
Was macht dieser T??? oder ist das ein Tippfehler?

mywindow.cpp:99: error: cannot convert 'const char*' to 'const WCHAR*' 
for argument '1' to 'BOOL BuildCommDCBW(const WCHAR*, _DCB*)'

Ich habe es auch so versucht

hPort=CreateFile(("COM1"),GENERIC_READ | GENERIC_WRITE, 0, 
NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); ich bekam trotzdem die 
gleiche Fehlermeldung?

Was meinst du genau mit Unicodeproblem???

Grüße

von Mr. S (Gast)


Lesenswert?

Rufus t. Firefly schrieb:
> Den eigentlichen Fehler hat Peter schon ganz gut eingegrenzt; allerdings
> sollte es
>
>   _T("COM1")

aso ok, vielen Dank für deine Antwort, ich habe aber noch ein paar 
Fragen, wo muss ich _T deklarieren??? da der Compiler mir sagt, dass _T 
nicht deklariert worden ist.

Grüße

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

_T ist bei MS in tchar.h definiert.

Wenn das Dein Compiler (welcher eigentlich?) nicht kennt, dann solltest 
Du mehr Energie dafür aufwenden, Dein Projekt als ANSI-Code für 
8-Bit-Zeichensätze zu übersetzen, und nicht als UNICODE-Code für 
16-Bit-Zeichensätze.

von Mr. S (Gast)


Lesenswert?

Ich benutze diese Entwicklungsumgebung QTCreator und sie benutzt den g++ 
Compiler.

Rufus t. Firefly schrieb:
> Du mehr Energie dafür aufwenden, Dein Projekt als ANSI-Code für
> 8-Bit-Zeichensätze zu übersetzen, und nicht als UNICODE-Code für
> 16-Bit-Zeichensätze.

Ich finde leider nicht, wo ich das einstellen kann


Hier gibt der Compiler keinen Fehler mehr.
1
hPort=CreateFile(_T("COM1"),GENERIC_READ | GENERIC_WRITE, 0, NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);

Beim BuildCommDCB habe ich das so geschreiben, das ist aber leider 
falsch
1
BuildCommDCB(_T("9600,n,8,1"), &dcb);

Ich bekomme 22 Warnings und eine Fehlermeldung: collect2: ld returned 1 
exit status

von Peter (Gast)


Lesenswert?

Mr. S schrieb:
> Ich bekomme 22 Warnings und eine Fehlermeldung: collect2: ld returned 1
> exit status

sagst du auch noch welche das sind?

von Mr. S (Gast)


Lesenswert?

klar hier ist alles was der Compiler sagt:

Makefile.Debug:103: warning: overriding commands for target 
`debug/moc_mywindow.cpp'
Makefile.Debug:100: warning: ignoring old commands for target 
`debug/moc_mywindow.cpp'
mingw32-make[1]: Leaving directory `C:/Dokumente und 
Einstellungen/praktikant.KME065/Eigene Dateien/w'
debug/mywindow.o: In function `MyWindow':
C:\Dokumente und Einstellungen\praktikant.KME065\Eigene 
Dateien\w/mywindow.cpp:62: undefined reference to 
`_imp___Z13qFlagLocationPKc'
C:\Dokumente und Einstellungen\praktikant.KME065\Eigene 
Dateien\w/mywindow.cpp:62: undefined reference to 
`_imp___Z13qFlagLocationPKc'
C:\Dokumente und Einstellungen\praktikant.KME065\Eigene 
Dateien\w/mywindow.cpp:62: undefined reference to 
`_imp___ZN7QObject7connectEPKS_PKcS1_S3_N2Qt14ConnectionTypeE'
C:\Dokumente und Einstellungen\praktikant.KME065\Eigene 
Dateien\w/mywindow.cpp:63: undefined reference to 
`_imp___Z13qFlagLocationPKc'
C:\Dokumente und Einstellungen\praktikant.KME065\Eigene 
Dateien\w/mywindow.cpp:63: undefined reference to 
`_imp___Z13qFlagLocationPKc'
C:\Dokumente und Einstellungen\praktikant.KME065\Eigene 
Dateien\w/mywindow.cpp:63: undefined reference to 
`_imp___ZN7QObject7connectEPKS_PKcS1_S3_N2Qt14ConnectionTypeE'
C:\Dokumente und Einstellungen\praktikant.KME065\Eigene 
Dateien\w/mywindow.cpp:62: undefined reference to 
`_imp___Z13qFlagLocationPKc'
C:\Dokumente und Einstellungen\praktikant.KME065\Eigene 
Dateien\w/mywindow.cpp:62: undefined reference to 
`_imp___Z13qFlagLocationPKc'
C:\Dokumente und Einstellungen\praktikant.KME065\Eigene 
Dateien\w/mywindow.cpp:62: undefined reference to 
`_imp___ZN7QObject7connectEPKS_PKcS1_S3_N2Qt14ConnectionTypeE'
C:\Dokumente und Einstellungen\praktikant.KME065\Eigene 
Dateien\w/mywindow.cpp:63: undefined reference to 
`_imp___Z13qFlagLocationPKc'
C:\Dokumente und Einstellungen\praktikant.KME065\Eigene 
Dateien\w/mywindow.cpp:63: undefined reference to 
`_imp___Z13qFlagLocationPKc'
C:\Dokumente und Einstellungen\praktikant.KME065\Eigene 
Dateien\w/mywindow.cpp:63: undefined reference to 
`_imp___ZN7QObject7connectEPKS_PKcS1_S3_N2Qt14ConnectionTypeE'
debug/mywindow.o:C:\Dokumente und Einstellungen\praktikant.KME065\Eigene 
Dateien\w/mywindow.cpp:72: undefined reference to 
`_imp___ZNK7QString7toAsciiEv'
debug/mywindow.o:C:\Dokumente und Einstellungen\praktikant.KME065\Eigene 
Dateien\w/mywindow.cpp:75: undefined reference to 
`_imp___ZNK7QString7toAsciiEv'
debug/mywindow.o:C:\Dokumente und Einstellungen\praktikant.KME065\Eigene 
Dateien\w/mywindow.cpp:78: undefined reference to 
`_imp___ZNK7QString7toAsciiEv'
debug/mywindow.o: In function `~QByteArray':
C:\Dokumente und Einstellungen\praktikant.KME065\Eigene 
Dateien\w/../../../../Qt/2010.02.1/qt/include/QtCore/../../src/corelib/t 
ools/qbytearray.h:382:  undefined reference to `_imp___Z5qFreePv'
debug/mywindow.o:C:\Dokumente und Einstellungen\praktikant.KME065\Eigene 
Dateien\w/../../../../Qt/2010.02.1/qt/include/QtCore/../../src/corelib/t 
ools/qbytearray.h:417:  undefined reference to 
`_imp___ZN10QByteArray7reallocEi'
debug/mywindow.o: In function `QString':
C:\Dokumente und Einstellungen\praktikant.KME065\Eigene 
Dateien\w/../../../../Qt/2010.02.1/qt/include/QtCore/../../src/corelib/t 
ools/qstring.h:413:  undefined reference to 
`_imp___ZN7QString16fromAscii_helperEPKci'
debug/mywindow.o: In function `~QString':
C:\Dokumente und Einstellungen\praktikant.KME065\Eigene 
Dateien\w/../../../../Qt/2010.02.1/qt/include/QtCore/../../src/corelib/t 
ools/qstring.h:869:  undefined reference to 
`_imp___ZN7QString4freeEPNS_4DataE'
debug/moc_mywindow.o:C:\Dokumente und 
Einstellungen\praktikant.KME065\Eigene 
Dateien\w/../../../../Qt/2010.02.1/qt/include/QtCore/../../src/corelib/t 
ools/qscopedpointer.h:112:  undefined reference to 
`_imp___Z9qt_assertPKcS0_i'
debug/moc_mywindow.o:moc_mywindow.cpp:(.rdata$_ZTV8MyWindow[vtable for 
MyWindow]+0x20): undefined reference to `QObject::eventFilter(QObject*, 
QEvent*)'
debug/moc_mywindow.o:moc_mywindow.cpp:(.rdata$_ZTV8MyWindow[vtable for 
MyWindow]+0x24): undefined reference to 
`QObject::timerEvent(QTimerEvent*)'
debug/moc_mywindow.o:moc_mywindow.cpp:(.rdata$_ZTV8MyWindow[vtable for 
MyWindow]+0x28): undefined reference to 
`QObject::childEvent(QChildEvent*)'
debug/moc_mywindow.o:moc_mywindow.cpp:(.rdata$_ZTV8MyWindow[vtable for 
MyWindow]+0x2c): undefined reference to `QObject::customEvent(QEvent*)'
debug/moc_mywindow.o:moc_mywindow.cpp:(.rdata$_ZTV8MyWindow[vtable for 
MyWindow]+0x30): undefined reference to `QObject::connectNotify(char 
const*)'
debug/moc_mywindow.o:moc_mywindow.cpp:(.rdata$_ZTV8MyWindow[vtable for 
MyWindow]+0x34): undefined reference to `QObject::disconnectNotify(char 
const*)'
collect2: ld returned 1 exit status
mingw32-make[1]: *** [debug\w.exe] Error 1
mingw32-make: Leaving directory `C:/Dokumente und 
Einstellungen/praktikant.KME065/Eigene Dateien/w'
mingw32-make: *** [debug] Error 2
Beendet mit Rückgabewert 2.
Fehler beim Erstellen des Projekts w
Beim Ausführen des Build-Schritts 'Make'

von Peter (Gast)


Lesenswert?

kann es sein das du dem linker die qt lib nicht angeben hast?

von Mr. S (Gast)


Lesenswert?

ne das habe ich schon richtig gemacht, wenn ich die zwei Zeile 
auskommentiere, dann funktioniert das Programm, ich kann dann die 
Textdatei erzeugen und dort etwas schreiben.

von Εrnst B. (ernst)


Lesenswert?

Machs doch andersrum: Lass das CreateFile-Lowlevelgewurschtel weg, und 
nimm eine Methode die viel besser zur QT passt:

http://qextserialport.sourceforge.net/

von Frank K. (fchk)


Lesenswert?

Mr. S schrieb:
> Ich benutze diese Entwicklungsumgebung QTCreator und sie benutzt den g++
> Compiler.
>
> Rufus t. Firefly schrieb:
>> Du mehr Energie dafür aufwenden, Dein Projekt als ANSI-Code für
>> 8-Bit-Zeichensätze zu übersetzen, und nicht als UNICODE-Code für
>> 16-Bit-Zeichensätze.
>
> Ich finde leider nicht, wo ich das einstellen kann
>
>
> Hier gibt der Compiler keinen Fehler mehr.
>
1
> hPort=CreateFile(_T("COM1"),GENERIC_READ | GENERIC_WRITE, 0,
2
> NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
3
>

Alle Win32 Funktionen, die Strings erwarten, gibts in zwei Versionen: 
die mit W am Ende erwartet 16 Bit wchars, die mit A am Ende erwartet 8 
Bit chars. In den includes wird entweder das eine oder das andere auf 
die Funktion ohne Buchstabe dahinter #define'ed, je nachdem ob _UNICODE 
definiert ist oder nicht.

Schreib also statt CreateFile CreateFileA, und Dein Unicode-Problem ist 
erledigt.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Das kann man zwar auch so erledigen, aber irgendwie ist's Murks.
Umständlich zumindest, da man herausfinden muss, bei welchen 
Win32-API-Funktionen das so gehandhabt wird, ganz so einfach "Alle Win32 
Funktionen, die Strings erwarten" ist's nämlich nicht.
Wenn die Inkonsistenz noch nicht erfunden wäre, MS hätte ein Patent 
drauf.

Es sollte dem Benutzer eines Entwicklungssystemes schon zuzumuten sein, 
die Dokumentation zu lesen und herauszufinden, warum es bestimmte 
Konstanten definiert und was man dagegen tun kann.

von kuzulis (Gast)


Lesenswert?

[quote]
Machs doch andersrum: Lass das CreateFile-Lowlevelgewurschtel weg, und
nimm eine Methode die viel besser zur QT passt:

http://qextserialport.sourceforge.net/
[/quote]

siehe auch:
http://fireforge.net/projects/qserialdevice/
(Version 0.2.0)

ABER! Am besten ist es, die SVN nehmen:
svn checkout svn://scm.fireforge.net/svnroot/qserialdevice

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.