Anfängerproblem
-
Hallo Community!
Melde mich heute mit meinem 1. Problem.
Da ich einige Zeit in der Konsole programmiert habe, habe ich mich heute entschlossen mich an die WinAPI zu wagen.
Heraus kam dies:[cpp]#include <windows.h> #include <tchar.h> LPARAM WINAPI winProc( HWND p_hWnd, UINT p_uiMessage, WPARAM p_wParam, LPARAM p_lParam ) { switch ( p_uiMessage ) { case WM_DESTROY: { PostQuitMessage(0); break; } } return ( DefWindowProc( p_hWnd, p_uiMessage, p_wParam, p_lParam ) ); } int WINAPI WinMain( HINSTANCE p_hInstance, HINSTANCE p_hPrevInstance, LPSTR p_szCmdLine, int p_nShowCmd ) { // Fensterklasse WNDCLASS WindowClass; // NachrichtenStruktur für das Fenster MSG WindowMessages; // Fensterhandle HWND WindowHandle; // Name unserer Fensterklasse const TCHAR* WinClassName = _T("WinAPI_1"); // Alle Werte zurücksetzen ZeroMemory( &WindowClass, sizeof( WNDCLASS ) ); ZeroMemory( &WindowMessages, sizeof( MSG ) ); ZeroMemory( &WindowHandle, sizeof( HWND ) ); WindowClass.style = CS_HREDRAW|CS_VREDRAW|CS_CLASSDC|CS_DBLCLKS; WindowClass.lpfnWndProc = winProc; WindowClass.hInstance = p_hInstance; WindowClass.hIcon = LoadIcon (NULL, IDI_APPLICATION); WindowClass.hCursor = LoadCursor (NULL, IDC_ARROW); WindowClass.hbrBackground = static_cast<HBRUSH>(GetStockObject(BLACK_BRUSH)); WindowClass.lpszClassName = WinClassName; if( !RegisterClass( &WindowClass ) ) return -1; WindowHandle = CreateWindow( WinClassName, _T("TestWindow"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 800, 600, NULL, NULL, p_hInstance, NULL ); if( !IsWindow( WindowHandle ) ) return -1; ShowWindow( WindowHandle, SW_SHOWNORMAL ); UpdateWindow( WindowHandle ); while( GetMessage( &WindowMessages, NULL, 0, 0 ) ) { TranslateMessage( &WindowMessages ); DispatchMessage( &WindowMessages ); } return 0; }[/cpp]Wenn ich es aber kompiliere, erhalte ich folgende Fehlermeldung:
MSVCRT.lib(crtexe.obj) : error LNK2001: Nicht aufgelöstes externes Symbol "_main".
Was ist damit gemeint oO
Danke im Voraus für eure Hilfe!
-
Erzeug in Visual Studio einfach ein "Win32 Project" (nicht(!) "Console")
-
Für Dein Projekt heißt das Linker Optionen ändern: Subsystem Windows nicht Console!
-
wie dämlich...da hätt ich auch selbst drauf kommen können

danke!
-
Hi!
hab vor kurzem mit winapi angefangen, bin noch wirklich nicht gut darin..
ich habe jetzt mal versucht einen Texteditor zu programmieren, nur leider werden nicht die Zeichen angezeigt, die eigentlich angezeigt werden sollten ondern nur Striche: ||||||||||||||||||||||||||||||||| <--- so in etwas, bei jeder Datei.
Die meiner Meinung nach verantwortliche Funktion ist die LOADTEXT();
Ein Ausschnitt aus meinem Code istLRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { ............ ............ case WM_COMMAND: wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); // Menüauswahl bearbeiten: switch (wmId) { case IDM_LOAD: // wie Öffnen bei windowsanwendungen OpenFileBox(hWnd); break; ........... ............ void OpenFileBox(HWND hWnd) { OPENFILENAME ofn; TCHAR szFileName[MAX_PATH] = L""; ZeroMemory(&ofn,sizeof(ofn)); ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = hWnd; ofn.lpstrFilter = L"Text Datei (*.txt)\0*.txt\0" //spezielle Dateien L"C Datei(*.c)\0*.c\0" // L"Alle Dateien (*.*)\0*.*\0" ofn.lpstrFile = szFileName; ofn.nMaxFile = MAX_PATH; ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST| OFN_HIDEREADONLY; ofn.lpstrDefExt = L"txt"; if(GetOpenFileName (&ofn)) { HWND hEdit = GetDlgItem(hWnd, IDC_MAIN_EDIT); if(LoadText(hEdit, szFileName)) { SendDlgItemMessage(hWnd, IDC_MAIN_STATUS,SB_SETTEXT,0,(LPARAM)"&Parameter laden"); SendDlgItemMessage(hWnd, IDC_MAIN_STATUS,SB_SETTEXT,1,(LPARAM)szFileName); } } } und schließlich : 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) { LPWSTR pszFileText; pszFileText = (LPWSTR) 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] = '\0'; if (SetWindowText(hEdit, pszFileText)) bSuccess = TRUE; } GlobalFree(pszFileText); } } CloseHandle(hFile); } return bSuccess; }der compiler zeigt keine Fehler an, der Debugger setzt eine Markierung bei GlobalFree();
kann mir jemand helfen? wär euch sehr dankbar, notfalls poste ich den ganzen code..
-
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