www.mikrocontroller.net

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


Autor: C++ win32 Daten Übertragung[232] (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:

void MyWindow::Messen()
{ 

   QString dateiname = datei->text();
   std::string s1 = dateiname.toAscii().data();

   QString name = geraete->text();
   std::string s2 = name.toAscii().data();

   QString seriennummer = nummer->text();
   std::string s3 = seriennummer.toAscii().data();

   char* tmp = new char[s1.size() + 1];
   strcpy(tmp, s1.c_str());
   std::ofstream outfile;
   outfile.open(tmp);

   outfile  << s2 << std::endl;
   outfile  << s3 << std::endl;

   HANDLE hPort;
   DWORD dw;
   DCB dcb;
   unsigned char buf;

   
//hier habe ich den Fehler
hPort=CreateFile( "COM1",GENERIC_READ | GENERIC_WRITE, 0,  NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);


   if (hPort == INVALID_HANDLE_VALUE)
   GetCommState(hPort, &dcb);
   BuildCommDCB("9600,n,8,1", &dcb);
   SetCommState(hPort, &dcb);

   while(1)
   {
        ReadFile(hPort, &buf, 1, &dw,NULL);
        if('\r' == buf)continue;
        if(buf==12)break;
        printf("%c",buf);
        outfile << buf << std::endl;
   }

   CloseHandle(hPort);
   outfile.close();

   delete[] tmp;
}

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
 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*)'

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das ganze ist mehr ein unicode problem, willst du wirkich ein uncicode 
Projekt anlegen?

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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Mr. S (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Mr. S (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Mr. S (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
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
BuildCommDCB(_T("9600,n,8,1"), &dcb);

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

Autor: Peter (Gast)
Datum:

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

sagst du auch noch welche das sind?

Autor: Mr. S (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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'

Autor: Peter (Gast)
Datum:

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

Autor: Mr. S (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Εrnst B✶ (ernst)
Datum:

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

http://qextserialport.sourceforge.net/

Autor: Frank K. (fchk)
Datum:

Bewertung
0 lesenswert
nicht 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.
>
> hPort=CreateFile(_T("COM1"),GENERIC_READ | GENERIC_WRITE, 0,
> NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
> 

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.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: kuzulis (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.