C++ Fehler bei der win32 api

Gast #1688400
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*)'
Gast #1688405
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);
Persönliche Seite #1688475
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.
Gast #1688486
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
Gast #1688525
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
Gast #1688550
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'
#1689335
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.
Persönliche Seite #1689465
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren