Seite 1 von 1

Error: cannot convert 'char*' to 'WCHAR*'

Verfasst: 13. Januar 2012 19:16
von Eggord
Hi,

ich habe eine Datenerfassungskarte, welche ich mit Qt aufrufen möchte allerdings bekomme ich mehrere Fehler bei der compilierung:
CONTADC.cpp:83: error: cannot convert 'char*' to 'WCHAR*' for argument '1' to 'WCHAR* lstrcpynW(WCHAR*, const WCHAR*, int)'
CONTADC.cpp:84: error: cannot convert 'char*' to 'WCHAR*' for argument '1' to 'WCHAR* lstrcpynW(WCHAR*, const WCHAR*, int)'
CONTADC.cpp:88: error: cannot convert 'CHAR*' to 'TCHAR*' for argument '1' to 'ECODE olDaInitialize(TCHAR*, HDEV__**)'

Die Datei ist ein Beispiel von dem Hersteller, welches einwandfrei unter Microsoft Visual c++ 2010 funktioniert.

Den Code habe ich mal beigefügt.

Ich hoffe jemand kann mir helfen.

Gruß
Eggord

Re: Error: cannot convert 'char*' to 'WCHAR*'

Verfasst: 13. Januar 2012 19:31
von Christian81
Eigentlich sollte die Fehlermeldung doch eindeutig sein - die Funktion erwartet ein WCHAR* aber es wird nur ein char* übergeben. Da Qt mit dem Macro UNICODE übersetzt ist werden auch alle WinAPI-Funktionen in der unicode-Variante benutzt.
Das Beispiel ist also falsch bzw. nur richtig wenn UNICODE nicht definiert ist.
Zum Glück kann man auch die Ansi/Unicode - API direkt ansprechen: lstrcpynA() = Ansi - Version, lstrcpynW() = Unicode - Version

Re: Error: cannot convert 'char*' to 'WCHAR*'

Verfasst: 13. Januar 2012 21:50
von Eggord
Danke für die schnelle Antwort!

Ich verstehe die Fehlermeldung. allerdings weiß ich nicht wie ich sie vermeiden kann. Durch lstrcpynA() konnte ich 2 eliminieren aber die anderen sind immer noch da. Es sind meistens Funktionen vom Hersteller.
Kann ich Unicode irgendwie nicht definieren? Oder kann ich die Funktionen vom Hersteller auch so leicht in AnsiMode aufrufen?
Das beispiel ist nicht falsch es funkt ja unter MVC++

Re: Error: cannot convert 'char*' to 'WCHAR*'

Verfasst: 13. Januar 2012 22:12
von Christian81
Das Beispiel ist definitiv falsch sobald man mit UNICODE arbeitet was Qt (als modernes Framework) nunmal tut.
olDaInitialize() kenn ich nicht - wenn es eine Library-Funktion des Herstellers ist dann sollte man dort mal nachfragen was sie machen - wenn sie eine Funktion olDaInitialize(TCHAR*) anbieten dann sollten sie auch beide (nämlich die Ansi und die Unicode-Version) dieser Funktion bereitstellen und nicht nur die Ansi-Version.

Re: Error: cannot convert 'char*' to 'WCHAR*'

Verfasst: 14. Januar 2012 00:23
von Eggord
Ich dachte TCHAR kann beides sein Ansi und Unicode. naja egal ich werde da auf jeden Fall mal anrufen.
Aber gibt es nicht Qt Funktionen die ich einfach in den Funktionsaufruf reinschreibe um die Variable umzufromen?
MVC++ ist doch auch ein modernes Framwork: wieso funktioniert es da ohne Probleme? Wandelt das die Datentypen automatisch um?

Re: Error: cannot convert 'char*' to 'WCHAR*'

Verfasst: 14. Januar 2012 06:33
von Christian81
TCHAR ist entweder oder - wenn UNICODE definiert ist dann ist es ein WCHAR*, wenn nicht dann ist es ein char*.
Im Grunde kann man einen ASCII-String nach Unicode wandeln indem man Qt benutzt - aber m.E. ist das hier nicht wirklich korrekt.
Siehe QString::fromAscii() und QString::utf16()
Bei Default Visual Studio-Projekten ist UNICODE nicht definiert, deshalb geht es.

Re: Error: cannot convert 'char*' to 'WCHAR*'

Verfasst: 14. Januar 2012 19:48
von Eggord
Also ich habe jetzt die Dokumentation durchgearbeitet. Das Wort Unicode kommt kein einziges mal vor. Und scheint auch keine zwei Versionen der Funktionen zu geben für Unicode und ohne. Alles ist mit TCHAR definiert.
Deshalb habe ich beschlossen die erstmal "per Hand umzuformen". Ist natürlich wirklich hässlich alles so umzuschreiben aber es bleibt mir wohl nicht anderes übrig. Wenn ich das richtig verstehe muss ich erst utf16 und dann fromAscii anwenden

Code: Alles auswählen

 GetDriver( LPSTR lpszName, LPSTR lpszEntry, LPARAM lParam )
/*
this is a callback function of olDaEnumBoards, it gets the
strings of the Open Layers board and attempts to initialize
the board.  If successful, enumeration is halted.
*/
{
   LPBOARD lpboard = (LPBOARD)(LPVOID)lParam;

   /* fill in board strings */

   lstrcpynA(lpboard->name,lpszName,MAX_BOARD_NAME_LENGTH-1);
   lstrcpynA(lpboard->entry,lpszEntry,MAX_BOARD_NAME_LENGTH-1);

   /* try to open board */

   

Code: Alles auswählen

lpboard->status = olDaInitialize(QString::utf16(QString::fromAscii(lpszName)),&lpboard->hdrvr);[/color]

Code: Alles auswählen

   if   (lpboard->hdrvr != NULL)
      return FALSE;          /* false to stop enumerating */
   else
      return TRUE;           /* true to continue          */
}
Dabei bekomme ich allerdings einen komischen Fehler

Code: Alles auswählen

CONTADC.cpp:89: error: no matching function for call to 'QString::utf16(CHAR*&)'
c:\Qt\4.8.0\include\QtCore/../../src/corelib/tools/qstring.h:320: note: candidates are: const ushort* QString::utf16() const
fromAscii akzeptiert er aber utf16 findet er nicht und sagt mir dann noch wo es zu finden ist :?:
#include <QString> habe ich natürlich reingeschrieben.

Re: Error: cannot convert 'char*' to 'WCHAR*'

Verfasst: 15. Januar 2012 09:33
von Christian81
QString::utf16() wandelt einen QString in einen UTF-16 (== WCHAR) um - nicht umgekehrt!

Code: Alles auswählen

char *cTest = "Blub";
QString test= QString::fromAscii(cTest );
WCHAR *wCharTest = (WCHAR*)(test.utf16())

Re: Error: cannot convert 'char*' to 'WCHAR*'

Verfasst: 16. Januar 2012 03:07
von Eggord
Ahh Danke Christian!!..dann sollte ich nochmal basics büffeln.

Ich habe jetzt Alles so umgeschrieben dass es keine "Variablen Fehler" mehr gibt: Hauptsächlich alle Variablen char in WCHAR umgewandelt oder die entsprechenden ANSI-Versionen von den Windows API (also einfach ein A hinten dran) aufgerufen!

Jetzt bekomme ich leider zwei neue Probs:
1.: Es steht eine min funktion in dem code, bei der mir Qt sagt, dass es die Funktion nicht kennt obwohl ich #include <algorithm> beigefügt habe und auch die min man Fkt. von windows.h umgangen habe (#define NOMINMAX)
das habe ich dann erstmalm umgangen indem ich nen fixwert reingeschrieben habe aber dann bekomme ich einen Haufen weitere Probleme:
2.:

Code: Alles auswählen

undefined reference to `olDaGetDASSInfo@8'

und der Fehler halt bei allen Fkt. vom Herrsteller nur teilweiße mit anderen Zahlen(4; 12; 16; 20) am Ende der Fehlermeldung
Die Headre sollte ich eigentlich alle eingefügt haben:

Code: Alles auswählen

INCLUDEPATH += C:/Users/Eggord/Documents/Qt-Projekte/SDK/Include
LIBS += -L"C:/Users/Eggord/Documents/Qt-Projekte/SDK/Lib64"
Ich hoffe du kannst mir nochmal helfen

Re: Error: cannot convert 'char*' to 'WCHAR*'

Verfasst: 16. Januar 2012 06:34
von Christian81
min() als Funktion gibt es nicht. Im std Namensraum gibt es eine min() - Funktion -> std::min()
Der Rest - wenn man nicht gegen die Library linkt dann wird er die Funktionen auch nicht finden können. Siehe Doku

Re: Error: cannot convert 'char*' to 'WCHAR*'

Verfasst: 16. Januar 2012 17:04
von Eggord
Ja habe die libs vergessen

Code: Alles auswählen

INCLUDEPATH += c:/Users/Eggord/Documents/Qt-Projekte/SDK/Include
LIBS += -L"c:/Users/Eggord/Documents/Qt-Projekte/SDK/Lib" -loldaapi32 -lolmem32 -lgraph32
damit sind alle Fehler von den Herstellerfkt. weg.
Allerdings bleiben zwei übrig, die irgenwie mit WinMain zu tun haben:

Code: Alles auswählen

c:\Qt\4.8.0\lib/libqtmaind.a(qtmain_win.o): In function `WinMain@16':
C:\\iwmake\\build_mingw_opensource\\src\\winmain/qtmain_win.cpp:131: undefined reference to `qMain(int, char**)'
collect2: ld returned 1 exit status
Habe auch schon im internet gesucht aber nichts dazu gefunden.

Re: Error: cannot convert 'char*' to 'WCHAR*'

Verfasst: 16. Januar 2012 17:11
von franzf
Liegt wohl daran, dass du jetzt kein Windows mehr programmierst, sondern C++. Der Einsprungpunkt ist eigentlich "int main(int, char**)", nicht "WinMain" o.Ä.
Ich hab aber kein Windows, drum kann ich das nicht ausprobieren. Da ihm die "qMain" fehlt, nehm ich aber stark an, dass der Fehler da zu suchen ist.

Re: Error: cannot convert 'char*' to 'WCHAR*'

Verfasst: 16. Januar 2012 18:16
von Christian81
Es fehlt ganz einfach die main() - Funktion... - jetzt sind wir bei C Grundlagen angelangt :(