Compiler fehler C2664,C2440
-
hey Leute, ich bekomme immer folgenden Fehler beim erstellen meines Projekts.
1>DllLoader.cpp(19): error C2664: 'CreateDirectoryA': Konvertierung des Parameters 1 von 'const wchar_t *' in 'LPCSTR' nicht möglich 1>Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat. 1>DllLoader.cpp(22): error C2664: 'FindFirstFileA': Konvertierung des Parameters 1 von 'const wchar_t *' in 'LPCSTR' nicht möglich 1>Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat. 1>DllLoader.cpp(31): error C2440: 'Typumwandlung': 'CHAR [260]' kann nicht in 'std::wstring' konvertiert werden 1>Quelltyp konnte von keinem Konstruktor angenommen werden, oder die Überladungsauflösung des Konstruktors ist mehrdeutig 1>DllLoader.cpp(32): error C2664: 'LoadLibraryA': Konvertierung des Parameters 1 von 'const wchar_t *' in 'LPCSTR' nicht möglich 1>Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat.
Dies ist der Code zu dem Projekt
#include "StdAfx.h" #include "DllLoader.h" #include <string> IPlugins::IPlugins() { this->Load(); } void IPlugins::Load() { std::wstring Path = L"./dlls/"; WIN32_FIND_DATA DataFound; HANDLE hFind = INVALID_HANDLE_VALUE; CreateDirectory(Path.c_str(), NULL); Path += L"*.dll"; hFind = FindFirstFile(Path.c_str(), &DataFound); if (hFind != INVALID_HANDLE_VALUE) { do { if (!(DataFound.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) { std::wstring FullName = L"./dlls/" + (std::wstring)DataFound.cFileName; LoadLibrary(FullName.c_str()); } } while (FindNextFile(hFind, &DataFound)); } FindClose(hFind); }
Ich nutze Windows 7 64bit und Microsoft Visual C++ 2010
ich hoffe mir kann jemand einen Tip oder nen schubs in die richtige Richtung geben
Grüße Christian
-
Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x und C++11) in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Du hast Unicode nicht aktiviert. Projekteigenschaften -> Allgemein -> Unicode
-
nwp3 schrieb:
Du hast Unicode nicht aktiviert. Projekteigenschaften -> Allgemein -> Unicode
Nun bekomme ich den selben Fehler von meinem IniReader.
1>IniReader.cpp(14): error C2664: 'GetPrivateProfileIntW': Konvertierung des Parameters 1 von 'char *' in 'LPCWSTR' nicht möglich 1>Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat. 1>IniReader.cpp(23): error C2664: 'GetPrivateProfileStringW': Konvertierung des Parameters 1 von 'char *' in 'LPCWSTR' nicht möglich 1>Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat. 1>IniReader.cpp(24): warning C4244: '=': Konvertierung von 'double' in 'float', möglicher Datenverlust 1>IniReader.cpp(33): error C2664: 'GetPrivateProfileStringW': Konvertierung des Parameters 1 von 'char *' in 'LPCWSTR' nicht möglich 1>Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat. 1>IniReader.cpp(43): error C2664: 'GetPrivateProfileStringW': Konvertierung des Parameters 1 von 'char *' in 'LPCWSTR' nicht möglich 1>Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat.
-
Noch kurz zur Begründung:
Ursprünglich war Windows nicht für Unicode ausgelegt. Die ganzen Funktionen, die Strings annahmen, waren auf "const char*" oder soetwas ausgelegt. Nun kam die Zeit des Unicode und man hatte die Wahl einen zweiten Satz Funktionen anzubieten oder sich etwas anderes zu überlegen. Man traf die Wahl, zwei neue Sätze von Funktionen anzubieten, der eine endet auf "A" und bezeichnet die Ansi-Version und der andere "W" was zunächst eine Wide-Character Version und am Schluss UTF-16 wurde. Da jetzt die ursprünglichen Funktionsnamen frei wurden, nahmen Makros ihren Platz ein, die abhängig von den Compiler-Switches entweder auf die A- oder auf die W-Variante umleiten.
Wenn man nun vergisst, den Unicode-Parameter einzustellen, dann leiten die Makros an die A-Variante weiter, was natürlich nicht funktionieren kann, wenn man ihnen Unicode-Argumente übergibt.
-
String-Literale für die Unicode-Parameter sehen folgendermaßen aus:
L"In Microsoft C++ UTF-16 String"
Für Ansi-Varianten:
"Ansi-Parameter"
Und allgemein:
[cpp]
_T("Abhängig vom Compiler-Switch")
[cpp]
-
decimad schrieb:
Noch kurz zur Begründung:
Ursprünglich war Windows nicht für Unicode ausgelegt. Die ganzen Funktionen, die Strings annahmen, waren auf "const char*" oder soetwas ausgelegt. Nun kam die Zeit des Unicode und man hatte die Wahl einen zweiten Satz Funktionen anzubieten oder sich etwas anderes zu überlegen. Man traf die Wahl, zwei neue Sätze von Funktionen anzubieten, der eine endet auf "A" und bezeichnet die Ansi-Version und der andere "W" was zunächst eine Wide-Character Version und am Schluss UTF-16 wurde. Da jetzt die ursprünglichen Funktionsnamen frei wurden, nahmen Makros ihren Platz ein, die abhängig von den Compiler-Switches entweder auf die A- oder auf die W-Variante umleiten.
Wenn man nun vergisst, den Unicode-Parameter einzustellen, dann leiten die Makros an die A-Variante weiter, was natürlich nicht funktionieren kann, wenn man ihnen Unicode-Argumente übergibt.Danke schön, das hat mir geholfen es funktioniert jetzt
-
Und LPCWSTR bedeutet "const wchar_t*", während LPCSTR "const char*" bedeutet.