Anfängerproblem
-
sind das zu wenig info´s, oder zu unpräzise gestellt, oder wisst ihr auch nicht was zu tun ist :)?
-
Bitte Code-Tags benutzen

LPWSTR pszFileText; <-- Besteht deine Textdatei tatsächlich aus WideChars?
Textdateien sind meistens eher Ansi oder UTF-8, das normalerweise erst konvertiert werden muss...
-
danke für die antwort:
normalerweise müsste folgendes doch dann gehen (Änderungen):
LPSTR pszFileText; pszFileText = (char*) GlobalAlloc(GPTR, dwFileSize+1);dann meldet der compiler
SetWindowText: konvertierung des 2 Parameters von LPSTR in LPCWSTR nicht möglich
obwohl doch Setwindowtext LPCTSTR zurückliefert
-
@criso: Es gibt Code-Tags

-
sorry das ist durchs kopieren gekommen...
-
An LPCSTR is a 32-bit pointer to a constant null-terminated string of 8-bit Windows (ANSI) characters. This type is declared as follows: typedef const char* LPCSTR; An LPCWSTR is a 32-bit pointer to a constant string of 16-bit Unicode characters, which MAY be null-terminated. This type is declared as follows: typedef const wchar_t* LPCWSTR;Ein LPCTSTR wiederrum ist je nachdem ob Unicode aktiv ist entweder gleichbedeutend mit LPCWSTR oder mit LPCSTR. Dies wird zur Compilezeit festgelegt.
Du hast Unicode-aktiv und müsstest daher selbst von char* nach wchar_t* konvertieren...
-
Kann man die konvertierung so durchführen:
wchar_t pszFileTextW //zusätlich initialisieren
//vor dem aufruf setwindowText
MultiByteTowideChar(CP_ACP,0,pszFileText,dwFileSize,pszFileTextW,0);
if (SetWindowText(hEdit,pszFileTextW)
....Konvertierung des parameters 5 von wchar_t in LPWSTR nicht möglich
wieso geht das denn nicht
-
MultiByteTowideChar() möchte einen Zeiger auf deinen Speicherbereich haben wo es den umgewandelten String ablegen darf.
Du gibts ihm keinen Zeiger (wchar_t* / LPWSTR), sondern nur ein Zeichen (wchar_t)
-
ja du hast recht, hab ich übersehen, danke
-
Das merkwürdige daran ist nur
ich hab trotzdem keine Ä und Ü´s in meiner Textdatei, wenn ich sie öffne.Ich dachte genau das wär der Grund wieso ich unicode verwende
-
ok kein wunder ich hatte SetWindowTextA() stehen, das bedeutet er setzt ANSI.
alles in allem geht der code immer noch nicht, er sieht so aus:
wchar_t* pszFileText; BOOL LoadText(HWND hEdit, LPCTSTR pszFileName) { HANDLE hFile; BOOL bSuccess = FALSE; hFile = CreateFile (pszFileName, GENERIC_READ, FILE_SHARE_READ,NULL, OPEN_EXISTING,0,NULL); if(hFile != INVALID_HANDLE_VALUE) //prüfe: hat hFile Datei erfolgreich geöffnet { DWORD dwFileSize; dwFileSize = GetFileSize(hFile, NULL); //GetFileSize ermittelt die Länge des Textes in Bytes if (dwFileSize != 0xFFFFFFFF) { LPSTR pszFileText; pszFileText = (LPSTR) GlobalAlloc(GPTR,dwFileSize+1); if (pszFileText != NULL) { DWORD dwRead; if (ReadFile(hFile, pszFileText, dwFileSize,&dwRead,NULL)) //lesen aus Handle hFile,dwFileSize in den Puffer pszFileText { //dwRead enthält die Anzahl erfolgreich gelesener Bytes pszFileText[dwFileSize] = L'\0'; MultiByteToWideChar (CP_ACP,0,pszFileText,dwFileSize,pszFileTextW,0); if (SetWindowText(hEdit,pszFileTextW)) bSuccess = TRUE; } GlobalFree(pszFileText); } } CloseHandle(hFile); } return bSuccess; }der compiler bringt diesmal keine fehler und beim öffnen von dateien steht einfach gar nichts mehr da...ich stell mich ziemlich blöd an, aber ich find keine guten unterlagen zum nachschlagen...habt ihr tipps?
-
mensch die code tags gehen immer flöten wenn ich die nachricht absende
-
criso schrieb:
mensch die code tags gehen immer flöten wenn ich die nachricht absende
1. Nein! Du hast keine gesetzt

2. Kann man mal die Doku lesen:
MultiByteToWideChar
http://msdn.microsoft.com/en-us/library/bb202786.aspxRemarks
If lpMultiByteStr and lpWideCharStr pointers are the same, the function fails, and GetLastError returns the value ERROR_INVALID_PARAMETER. The function fails if MB_ERR_INVALID_CHARS is set and it encounters an invalid character in the source string.
-
Das machts aber auch nicht besser:
MultiByteToWideChar (CP_ACP,0,pszFileText,-1,pszFileTextW,sizeof(pszFileTextW))
außerdem sind die doch nicht gleich bei mir,siehe dein zitat
-
MultiByteToWideChar (CP_ACP,0,pszFileText,dwFileSize,pszFileTextW,0);Wenn du den letzten Parameter auf 0 lässt macht die Funktion gar nichts außer als Rückgabewert die Anzahl der benötigten Zeichen zurückzuliefern.
Wo hast du pszFileTextW initialisiert?
-
ich habs als global initialisiert, weil der compiler sonst immer gemeldet hat:
Die nicht initialisierte lokale Variable pszFileTExtW wurde nicht verwendet
-
// Eingabe-String: char inputStr[]="Dies ist ein Test-String öäü €"; // Ermitteln wieviele Zeichen das umgewandelt in WideChars ergibt: int charsNeeded=MultiByteToWideChar(CP_ACP,0,inputStr,-1,NULL,0); if (charsNeeded==0) { // Failed! } // Passend großen Speicher organisieren: wchar_t* outputStr=(wchar_t*)malloc(sizeof(wchar_t)*charsNeeded); // Umwandeln: if (MultiByteToWideChar(CP_ACP,0,inputStr,-1,outputStr,charsNeeded)==0) { // Failed! } // Testweise im Debug-Output ausgeben: OutputDebugStringW(outputStr); OutputDebugStringW(L"\r\n"); // Speicher freigeben: free(outputStr);
-
ich danke dir echt geeky für deine bemühungen.
da ich aber n begnadeter anfänger bin, hab ich keine ahnung was ich damit anfangen soll.
-
Hi
Dieser Code von geeky macht nichts anderes als von char in MultiByteToWideChar() zu convertieren, wie du sehen kannst.
lowbyte
-
ok ich verstehe, aber du kannst doch nicht einfach inputStr []
definieren und dann bei MultibyteStr (zeile5) das als einen wert inputStr verwenden?