Zum Inhalt springen

PL1994

Mitglieder
  • Gesamte Inhalte

    77
  • Benutzer seit

  • Letzter Besuch

Alle Inhalte von PL1994

  1. Ja, das war es. Danke! Ich merke mir für die Zukunft, mich um Rückgabewerte zu kümmern ...
  2. Also, mehr als 1) "Zugriffsverletzung beim Lesen" und 2) "Ausnahmefehler während eines Benutzerrückrufs" habe ich leider nicht an Fehlermeldungen. In der Hoffnung, dass das weiterhilft, hier der vollständige Code: #include "Controller.h" Controller::Controller() throw(...) { view.wndCls.lpfnWndProc = WndProc; SetWindowLongPtr(view.hWnd, GWLP_USERDATA, (LONG_PTR)this); RegisterClass(&view.wndCls); view.create(); view.show(); while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } } Controller::~Controller() { } LRESULT CALLBACK Controller::WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_COMMAND: switch (wParam) { case EXIT_ITEM: SendMessage(hWnd, WM_CLOSE, 0, 0); break; } break; case WM_DESTROY: { PostQuitMessage(0); return 0; } case WM_PAINT: { PAINTSTRUCT ps; HDC hDC; hDC = BeginPaint(hWnd, &ps); { Controller* cPtr = (Controller*)GetWindowLongPtr(hWnd, GWLP_USERDATA); TextOut(hDC, cPtr->view.rcTreeview.right + 10, cPtr->view.rcTreeview.top + 110, "Test", sizeof("Test") - 1); } EndPaint(hWnd, &ps); return 0; } } return DefWindowProc(hWnd, message, wParam, lParam); }
  3. Danke schon mal für den Rat. Wenn ich das richtig verstanden habe, funktioniert das Zuweisen so: SetWindowLongPtr(view.hWnd, GWLP_USERDATA, (LONG_PTR)this); Ich kann auch wieder auf die Instanz zugreifen (wenigstens die Zuweisung funktioniert), die zweite Zeile aber nicht mehr. Ich bekomme die Fehlermeldung "Ausnahmefehler während eines Benutzerrückrufs". Habe ich was vergessen (oder vielleicht den Pfeiloperator falsch verwendet)? :confused: Controller* cPtr = (Controller*)GetWindowLongPtr(hWnd, GWLP_USERDATA); TextOut(hDC, cPtr->view.rcTreeview.right + 10, cPtr->view.rcTreeview.top + 110, "Test", sizeof("Test") - 1);
  4. Wenn ich sie aber statisch definiere, kann ich nicht mehr auf nicht-statische Member - etwa die Instanz der Klasse "view" - verweisen, was aber notwendig ist. Wie soll ich das machen? Edit: Das zum Beispiel möchte ich in der Funktion machen: PAINTSTRUCT ps; HDC hDC; hDC = BeginPaint(hWnd, &ps); { TextOut(hDC, view.rcTreeview.right + 10, view.rcTreeview.bottom + 10, "Test", sizeof("Test") - 1); } EndPaint(hWnd, &ps);
  5. Hallo, ich habe - basierend auf diesem Tutorial: WinAPI - (02.) Ein eigenes Fenster - ein Fenster erstellt. Nur, dass ich das Fenster in einer anderen Klasse definiere (was auch funktioniert) und die Callback-Funktion gerne als Member der Hauptklasse hätte (was nicht funktioniert). Um es deutlicher zu machen: Das klappt: Controller.cpp #include "Controller.h" LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); Controller::Controller() throw(...) { view.wndCls.lpfnWndProc = WndProc; RegisterClass(&view.wndCls); view.create(); view.show(); while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } } Controller::~Controller() { } LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { return DefWindowProc(hWnd, message, wParam, lParam); } Das hier aber nicht: Controller.h #pragma once #include "View.h" #include <windows.h> class Controller { private: MSG msg; View view; public: Controller() throw(...); ~Controller(); LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); }; Controller.cpp #include "Controller.h" Controller::Controller() throw(...) { view.wndCls.lpfnWndProc = &Controller::WndProc; RegisterClass(&view.wndCls); view.create(); view.show(); while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } } Controller::~Controller() { } LRESULT CALLBACK Controller::WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { return DefWindowProc(hWnd, message, wParam, lParam); } Die Fehlermeldung: "LRESULT (__stdcall Controller::*)(HWND,UINT,WPARAM,LPARAM) kann nicht in WNDPROC konvertiert werden". Warum denn jetzt nicht mehr? Die Funktion hat sich doch gar nicht verändert, nur die Definition steht an anderer Stelle!? Gruß PL 1994
  6. PL1994

    Toolbar mit WinAPI

    Danke dir! Daran lag es
  7. PL1994

    Toolbar mit WinAPI

    Vielen Danke schon mal für die Antwort. Nein, die habe ich nicht vergessen - wäre ja auch zu schön gewesen ... Entwicklungsumgebung ist Visual Studio Express 2013. Das Folgende ist nur ein Teil des gesamten Programmes, aber ich schätze, dass das Problem da liegen müsste: View.h #pragma once #define STRICT #define EXIT_ITEM 0 #include <CommCtrl.h> #include <windows.h> class View { public: View(); ~View(); void create(), hide(), show(); const int imageListId = 0, numToolbarButtons = 4, toolbarImageSize = 48; HIMAGELIST hImageList; HMENU hMenu, hMenubar; HWND hWnd, hWndToolbar; WNDCLASS wndCls; }; View.cpp (Wahrscheinlich irrelevant, da ich außer "include" und der Definition einer "HIMAGELIST" noch gar nichts mit der Bibliothek gemacht habe) #include "Resources.h" #include "View.h" View::View() { wndCls.style = CS_HREDRAW | CS_VREDRAW; wndCls.cbClsExtra = 0; wndCls.cbWndExtra = 0; wndCls.hInstance = GetModuleHandle(0); wndCls.hCursor = LoadCursor(NULL, IDC_ARROW); wndCls.hIcon = LoadIcon(GetModuleHandle(0), MAKEINTRESOURCE(PROGRAM_ICON)); wndCls.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wndCls.lpszClassName = "Anwendung"; wndCls.lpszMenuName = NULL; } View::~View() { } void View::create() { hWnd = CreateWindow("Anwendung", "Anwendung", WS_OVERLAPPEDWINDOW, GetSystemMetrics(SM_CXSCREEN)/2-400, GetSystemMetrics(SM_CYSCREEN)/2-300, 800, 600, NULL, NULL, GetModuleHandle(0), NULL); hMenu = CreateMenu(); hMenubar = CreateMenu(); AppendMenu(hMenu, MF_STRING, EXIT_ITEM, "Schließen"); AppendMenu(hMenubar, MF_POPUP, (UINT_PTR)hMenu, "Datei"); SetMenu(hWnd, hMenubar); } void View::hide() { ShowWindow(hWnd, SW_HIDE); UpdateWindow(hWnd); } void View::show() { ShowWindow(hWnd, SW_SHOW); UpdateWindow(hWnd); }
  8. Hallo, ich möchte eine Toolbar erstellen, wie es hier beschrieben wird: https://msdn.microsoft.com/en-us/library/hh298381(v=vs.85).aspx. Wie andere Tutorials zeigen, brauche ich dafür den Header "CommCtrl.h" und muss "Comctl32.lib" verlinken. Das habe ich getan. Beim Erstellen bekomme ich jetzt allerdings etliche Fehlermeldungen, alle bezogen auf den Header "prsht.h". Da gibt es fehlende Typspezifizierer, unzählige Syntaxfehler und letztlich die Meldung: "Mehr als 100 Fehler gefunden; Kompilierung wird abgebrochen". Kann es sein, das ich noch andere Bibliotheken brauche? Wenn ja, welche? Wenn nein, woran kann das dann liegen? Gruß PL1994
  9. Hallo, ich habe (immer noch) das Problem, dass ich es einfach nicht fertig bringe, eine wxApp aus einer statischen Bibliothek im Hauptprogramm zu implementieren. Dabei entstanden stets Memoryleaks, wobei ich nicht weiß, ob das tatsächlich die Ursache dafür ist, dass die ganze App nicht läuft. Durch Auskommentieren habe ich festgestellt, dass es nicht an einer Anweisung innerhalb des App-Quellcodes scheitert, sondern schon beim implementieren, also durch die Anweisung "IMPLEMENT_APP". Da nicht mehr viel Code übrig geblieben ist, zitiere ich den hier jetzt komplett: Zum einen das Hauptprogramm "Controller.exe" Controller.h #include <ViewDeclaration.h> #include <stdlib.h> #include <crtdbg.h> #ifndef _CONTROLLER_H_ #define _CONTROLLER_H_ using namespace ModelClasses; class Controller { public: Controller() throw(...); ~Controller(); }; #endif Controller.cpp #include "Controller.h" #include <iostream> using namespace std; IMPLEMENT_APP(View); Controller::Controller() { } Controller::~Controller() { } void main() { Controller(); } Zum anderen die View als Bibliothek "View.lib" ViewDecalaration.h #include <wx\wx.h> #ifdef __WXMSW__ #include <wx/msw/msvcrt.h> #endif #ifndef _VIEWDECLARATION_H_ #define _VIEWDECLARATION_H_ using namespace std; class View : public wxApp { public: View(); ~View(); }; #endif View.cpp #include <ViewDeclaration.h> View::View() { } View::~View() { } Es soll also eigentlich bei der Version noch überhaupt nichts passieren - trotzdem schon Memoryleaks. Es muss also, schätze ich, an der "IMPLEMENT_APP"-Anweisung liegen, respektive am Programmaufbau, da es funktioniert hat, als ich alles innerhalb eines Programmes ohne Bibliotheken getestet habe. Wie bekomme ich es jetzt hin, dass das auch als Bibliothek funktioniert? Eignet sich das Makro überhaupt für einen Aufruf an dieser Stelle? Welche Alternativen gibt es? Ich habe schon gesucht und bin dabei auf solches gestoßen: wxApp::SetInstance( new MyWxApp() ); wxEntryStart( argc, argv ); wxTheApp->OnInit(); // you can create top level-windows here or in OnInit() ... // do your testing here wxTheApp->OnRun(); wxTheApp->OnExit(); wxEntryCleanup(); Das habe ich schon versucht, hat den gleichen Effekt. Bitte helft mir. Gruß PL1994
  10. Das funktioniert schon mal. Danke dafür. Ich habe jetzt auch ein paar Zeilennummern. Dazu eine Frage: Ist es normal, dass bei einigen Meldungen die Datei- und Zeilenangabe fehlt, während sie bei anderen dabeisteht? Sieht dann so aus: c:[...]\wxwidgets\include\wx\hashmap.h(121) : {949} normal block at 0x008E2658, 772 bytes long. Data: < > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 {948} normal block at 0x008E2458, 28 bytes long. Data: <X& > 58 26 8E 00 C1 00 00 00 00 00 00 00 CD CD CD CD {947} normal block at 0x008E25F8, 32 bytes long. Data: <w x V a r i a n > 77 00 78 00 56 00 61 00 72 00 69 00 61 00 6E 00 {946} normal block at 0x008E25B0, 8 bytes long. Data: <P% > 50 25 8E 00 00 00 00 00 {945} normal block at 0x008E2550, 36 bytes long. Data: < % % > B0 25 8E 00 F8 25 8E 00 CD CD CD CD CD CD CD CD Denkbar ungünstig ist auch, dass sich die Meldung auf eine Datei der wxWidgets bezieht; an der werde ich jetzt nicht rumpfuschen. Kann ich irgendwie feststellen, an welcher Stelle meines Quellcodes der Ablauf genau scheitert?
  11. Wo genau soll ich das definieren? Bei den Präprozessordefinitionen?
  12. Das habe ich in der Headerdatei vom Hauptprogramm getan: #define _CRTDBG_MAP_ALLOC #include <stdlib.h> #include <crtdbg.h> Reicht das nicht?
  13. Hallo, seit ich meine wxWidgets-Anwendung zu einer statischen Bibliothek gemacht habe , bekomme ich Memory Leaks. Die Fehlermeldung war sehr unspezifisch, ich bin auf diese Seite gestoßen: Suchen von Arbeitsspeicherverlusten mit der CRT-Bibliothek. Dort wird beschrieben, wie man eine Ausgabe erzeugt, die Datei und Zeilennummer enthält. So könnte ich wenigstens feststellen, wo die Memory Leaks verursacht werden (habe schon etliche möglicherweise ursächliche Anweisungen auskommentiert, war aber nicht aufschlussreich). Das Problem: Ich bekomme einfach keine vernünftige Ausgabe. Ich habe mich an die Anweisungen auf der verlinkten Seite gehalten, aber was ich erhalte sieht so aus (Auszug): {187} normal block at 0x00B2DB78, 36 bytes long. Data: < <D > 8C 3C 44 01 00 00 00 00 E8 03 00 00 0C 01 00 00 {164} normal block at 0x00B25850, 12 bytes long. Data: < 5D > E4 35 44 01 E4 04 00 00 00 00 00 00 {145} normal block at 0x00B2F140, 772 bytes long. Data: < > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 {140} normal block at 0x00B2EE00, 772 bytes long. Data: < > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Sagt mir gar nichts. Sollte das, wie es auf der Seite beschrieben ist, funktionieren, wenn ich die entsprechenden Anweisungen in das Hauptprogramm einbaue, die Memory Leaks aber durch eine Klasse einer Bibliothek verursacht werden? Oder muss ich auch in den Bibliotheksklassen Änderungen vornehmen? __ Andere Überlegung: Kann ich das IMPLEMENT_APP-Makro von wxWidgets überhaupt innerhalb der Klasse einer statischen Bibliothek verwenden oder führt das zu Problemen? Gruß PL1994
  14. Habe es jetzt doch anders gelöst: Mit "WideCharToMultiByte" bekomme ich meinen char* und kann "SHGetFolderPath" verwenden Danke euch!
  15. Wie meinst du das? Ich habe dataDirectory jetzt zu einem char* gemacht. Kann ich SHGetFolderPathA denn überhaupt verwenden mit einem Unicode-Zeichensatz?
  16. Danke schon einmal für die Antworten. "CString" kann ich leider nicht verwenden. Bei VS Express ist ATL nicht dabei. "SHGetFolderPathA" habe ich versucht, dann bekomme ich einen Ausnahmefehler in SHCore.dll (Zugriffsverletzung) - woran kann das liegen?
  17. Hallo, mein Programm verwendet einen Unicode-Zeichensatz, weshalb die gängigste Lösung für mein Problem, die ich finden konnte, nicht funktioniert (einfach zu char* casten). Ich möchte eine Datenbank öffnen (SQLite) mit "sqlite3_open". Als erstes Argument erwartet die Funktion einen const char*. Ich will die Datenbank in einem bestimmten Verzeichnis öffnen, basierend auf dem AppData-Verzeichnis, das ich so bekomme: SHGetFolderPath(NULL, CSIDL_LOCAL_APPDATA, NULL, 0, dataDirectory) "dataDirectory" ist dann ein TCHAR[]. 1. Problem: Was mache ich mit der Variable "dataDirectory", um sie als const char* verwenden zu können (einfach casten geht grauenvoll schief)? 2. Problem: Ich würde beim Aufruf von "sqlite3_open" gerne noch einen String anhängen, ohne dabei die Variable "dataDirectory" zu verändern (also nicht mit strcat oder Ähnlichen) - mit "+" klappt das nur bei "string"-Variablen, wie geht das ansonsten? Gruß PL1994
  18. Okay, bis jetzt hatte ich das Problem nicht - der Ausgabestream wurde immer in einem Konsolenfenster dargestellt und mit "system("pause")" am Schluss "gehalten". Jetzt sehe ich aber gerade, dass das Konsolenfenster jetzt nicht mehr die Ausgabe des Programmes ausgibt, sondern überhaupt erst von "system("pause")" erzeugt wird - das ist natürlich nicht Sinn der Sache. Wie kann ich denn grundsätzlich eine Konsolenausgabe nutzen - praktisch das C++-Äquivalent zum "System.out.print" in Java?
  19. Hallo, ich habe jetzt eine wxApp. Ich würde gerne eine Kontrollausgabe machen (weil etwas mit dem Icon für den wxFrame nicht funktioniert). Dafür wollte ich den Ausgabestream "cout" verwenden. Zum Schluss folgt "system("pause")", damit die Ausgabe nicht gleich wieder verschwindet. Egal, was ich auszugeben versuche, ich sehe nur die die Standardausgabe von "system("pause")". Da ich "cout" sonst problemlos verwenden kann, gehe ich davon aus, dass das irgendwie mit der App in Konflikt steht. Wie kann ich jetzt trotzdem eine Ausgabe erzeugen, ohne die gleich in den Frame integrieren zu müssen? Gruß PL1994
  20. So, nachdem ich jetzt endlich mal dazu gekommen bin, das auszuprobieren: Danke schon einmal für deine Ratschlage und den Link zur Doku Nachdem ich noch einmal die Anleitung in meinem Buch durchgegangen bin, habe ich auch dort eine Liste mit den benötigten Bibliotheken gefunden - und endlich funktioniert es.
  21. Ja, das war es Jetzt habe ich das Problem eines nicht aufgelösten externen Symbols. Hängt wahrscheinlich damit zusammen, dass ich eben nicht die richtigen Bibliotheken angegeben habe. Wo kann ich nachsehen, welche Bibliotheken ich zum Beispiel für wxApp brauche?
  22. Hallo, um wxWidgets verwenden zu können, muss man ja einige zusätzliche Abhängigkeiten beim Linker einstellen. Laut dieser (wxWidgets für Visual C++ CwCity.de - Tutorial -) Anleitung genau diese: wxmsw28_core.lib wxbase28.lib wxtiff.lib wxjpeg.lib wxpng.lib wxzlib.lib wxregex.lib wxexpat.lib winmm.lib comctl32.lib rpcrt4.lib wsock32.lib odbc32.lib Erstes Problem: Einige davon finde ich nicht in den Bibliotheksverzeichnissen, nämlich: winmm.lib comctl32.lib rpcrt4.lib wsock32.lib odbc32.lib Angegeben habe ich für mein Projekt jetzt (an die aktuelle wxWidgets-Version angepasst) diese: wxmsw30u_core.lib wxbase30u.lib wxtiff.lib wxjpeg.lib wxpng.lib wxzlib.lib wxregexu.lib wxexpat.lib Zweites Problem: Ich bekomme eine Fehlermeldung vom Linker, nämlich: Linkertoolwarnung LNK4098 Ich soll also außer LIBC.lib alle mit /NODEFAULTLIB versehen. Ich habe das bei der Option Linker > Eingabe > Bestimmte Standardbibliotheken ignorieren mit dieser Zeile zu bewirken versucht: /NODEFAULTLIB:[LIBCMT.lib, MSVCRT.lib, LIBCD.lib, LIBCMTD.lib, MSVCRTD.lib] Funktioniert leider nicht - gleiche Fehlermeldung ... ich habe noch mehr Fehlermeldungen, aber hängen sicher mit letzterer zusammen. Ich verzweifle langsam mit den Widgets ... :confused: Gruß PL1994
  23. Ja, ich hatte von einem früheren Versuch noch "#include <wx\setup.h>" drin. Damit ist wohl irgendetwas kollidiert ... danke dir! Jetzt habe ich zwar eine andere, ziemlich lange Fehlerliste, aber das versuche ich erst einmal selbst zu beheben
  24. Tatsache, das kann ich ... Ich habe mal die Projekteigenschaften verglichen: Ein Unterschied ist, dass die zusätzlichen Include- und Bibliotheksverzeichnisse nicht als absolute, sondern relative Pfade angegeben sind. Das sollte aber nicht stören, schätze ich. Außerdem sind bei Linker > Eingabe > Zusätzliche Abhängigkeiten einige weitere Bibliotheken angegeben. Kann es sein, dass man die generell angeben muss?

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...