LPCWSTR und char*

cwriter

Erfahrenes Mitglied
Hallo Welt

Wenn ich in Dev-C++ folgendes eingebe:
C:
//[...]
WIN32_FIND_DATA wfd;
fHandle=FindFirstFile("Test\\*",&wfd);
//[...]
...läuft alles ganz prima.
Wenn ich dasselbe aber im VC++ 2010 Express eingebe, gibt's den Error: "Konvertierung von char* in LPCWSTR nicht möglich."
Dies resultiert darin, dass ich es so schreibe:

C:
//[...]
WIN32_FIND_DATA wfd;
fHandle=FindFirstFile(L"Test\\*",&wfd);
//[...]
Wenn ich jetzt aber später
C:
printf("%s",wfd);
aufrufe, kommen Sonderzeichen. Ich habe es schon auf viele Arten versucht, unter anderem
C:
printf("%s",TEXT(wfd));
aber dann kommen weitere Fehlermeldungen, z.B. "lwfd wurde nicht intitialisiert". Weshalb kann nun eine total verstaubte, uralte und seit 2005 nicht mehr weiterentwickelte IDE unkomplizerter sein als die moderne VC++ IDE?

Gibt es eine Funktion zur Behebung des Problems oder muss ich mich zwischen den IDEs hin- und herquälen? Ich möchte aber nicht die MultiByteToLong &co verwenden.

Wisst ihr irgendetwas, das mich erlöst?

cwriter
 
Das Dilemma resultiert daraus, das Visual Studio standardmäßig Projekte mit Unicode-Unterstützung anlegt. Entweder man stellt das in den Projekteinstellungen um oder man passt seine Programmierung entsprechend an.

Ohne die Projekteinstellungen zu verändern schreibt man entweder (ANSI):
C++:
WIN32_FIND_DATAA wfd;
fHandle=FindFirstFileA("Test\\*",&wfd);
printf("%s",wfd.cFileName);
oder (UNICODE):
C++:
WIN32_FIND_DATA wfd;
fHandle=FindFirstFile(L"Test\\*",&wfd);
wprintf(L"%s",wfd.cFileName);

Gruß
MCoder
 
Hallo,

man kann aber auch Code schreiben, der sowohl mit Unicode als auch mit Multi-Byte-Zeichensatz zurecht kommt:

C++:
#include <tchar.h>
// ...
WIN32_FIND_DATA wfd;
fHandle=FindFirstFile(_T("Test\\*"),&wfd);
_tprintf(_T("%s"),wfd.cFileName);

Grüße,
Matthias
 
Also in beiden Fällen mit Unicode kommen bei mir Fragezeichen... Wenn ich Unicodeunterstützung ausschalte auch...

Weiss jemand etwas?
 
Ich habe mal den code 12001 Unicode utf-32BE genommen, auch andere ausprobiert, aber nichts läuft. Wie kann man auf Lucida umstellen? Und ist das überhaupt notwendig, denn das Programm funktioniert, nur die Ausgabe des Textes oben ist Frag(ezeichen)lich.

cwriter
 
Ich habe mal den code 12001 Unicode utf-32BE genommen, auch andere ausprobiert, aber nichts läuft.
Wenn im Zusammenhang mit Windows die Rede von Unicode ist, meint man utf16-le.
Wie kann man auf Lucida umstellen?
Stell es einfach über die Konsoleneigenschaften ein.
Und ist das überhaupt notwendig, denn das Programm funktioniert, nur die Ausgabe des Textes oben ist Frag(ezeichen)lich.
Ja, das ist notwendig, da der Standardfont nur einen sehr begrenzten Zeichensatz hat und somit z.B. kyrillische Buchstaben und andere Sonderzeichen nicht dargestellt werden können.

Vermutlich ist es aber am besten du zeigst uns nochmal worüber du überhaupt redest (Code / Screenshots).

Gruß
 
Auch mit UTF-16 läuft's nicht.
C:
#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
#include "windows.h"
#include "direct.h"
#include "urlmon.h"
#pragma comment (lib,"urlmon.lib")

int main(int argc, char* argv[])
{
	BOOL WINAPI SetConsoleOutputCP(1200);
	char Dateiname[256];

	if(argv[1] == NULL)
	{
		//Dateidialog
		printf("Waehle eine Datei aus.\n");
		
		HANDLE fHandle;
		WIN32_FIND_DATA wfd;

		int i=0;

		fHandle=FindFirstFile(L"..\\",&wfd);

		do
		{
			if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
			{
			}
			else
			{
				wprintf(L"%s",wfd.cFileName);
			}
			i++;
		} while (FindNextFile(fHandle,&wfd));
		FindClose(fHandle);
		
		system("PAUSE");
		return 0;
	}
	strcpy(Dateiname,argv[1]);
	puts(Dateiname);


	char Einlesen[2048];
	FILE* f;
	f = fopen(argv[1],"r");
	if(f == NULL) 
	{
		printf("Datei nicht vorhanden!\n");
		system("PAUSE");
		return 0;
	}

	while(fgets(Einlesen,2048,f) != NULL) printf("%s",Einlesen);

	fclose(f);
	printf("\n\n");
	system("PAUSE");
	return 0;
}
Die Ausgabe ist angehängt.
Und ja, ich weiss dass ich noch nicht alle Header brauche, aber das kommt noch später.

cwriter
 

Anhänge

  • Unbenannt.PNG
    Unbenannt.PNG
    19,8 KB · Aufrufe: 23
Hi.

Du hast ganz einfach Mist programmiert.

Du prüst nicht auf Fehler.

Laut MSDN FindFirstFile:
pFileName [in]

This parameter should not [...] end in a trailing backslash (\).
Nachdem du FindFirstFile aufgerufen hast, mußt du als allererstes prüfen ob nicht INVALID_HANDLE_VALUE zurückgegeben wurde. Schau in die MSDN oder such hier im Forum.

Gruß
 
Jep, das habe ich wohl. Das "*" fehlte.

Gruss

cwriter

EDIT: Noch eine Frage: Was ist, wenn ich eine Variable bzw. einen String verwenden will?
 
Zuletzt bearbeitet:
Zurück