C++ oder C



  • Moin wie der Titel schon sagt. kann man mit c++ winapi Programmieren oder ist es besser c zu lernen?



  • Die Antwort auf alle Fragen ist: Google!

    In pure WinApi zu programmieren ist dumm und macht krank.
    Such dir eine GUI-Bibliothek wie http://sourceforge.net/projects/wtl/ und verwende diese.

    Und ob C besser ist als C++: Google!



  • Darter schrieb:

    Moin wie der Titel schon sagt. kann man mit c++ winapi Programmieren oder ist es besser c zu lernen?

    Die Winapi ist zum Teil objektorientiert aufgebaut. Das läßt sich besser in C++ abbilden.

    Auch grundsätzlich ist C++ vorteilhafter. Du kannst alles damit machen, was auch in C geht und noch viel mehr.

    C ist veraltet.



  • Hi

    printf(" C ist meiner Meinung nach die schönere Sprache ,glaube für (Nerd's) gibt's (nichts anderes).");

    lowbyte



  • Hi

    Sorry aber mit dieser Ausage liegst du definitiv falsch !

    Die Winapi ist zum Teil objektorientiert aufgebaut. Das läßt sich besser in C++ abbilden.

    Auch grundsätzlich ist C++ vorteilhafter. Du kannst alles damit machen, was auch in C geht und noch viel mehr.

    C ist veraltet.

    Warum soll C veraltet sein. Dein Os ist zu 80% in C geschrieben ! der rest assembler und ein bischen C++ !!!
    Bei Linux wollen wir garnicht davon reden !

    [/quote]
    Du kannst alles damit machen, was auch in C geht und noch viel mehr.
    [quote]

    Der ist ja gut ! 😃
    Das kann ich in C genau so machen !!!

    Also ich verstehe dich überhaupt nicht !

    lowbyte



  • Hi

    Und ausserdem ist C eine Untermenge von C++, also mußt Du C lernen, um C++ zu können.

    Und das was du in C++ schreibst, schreib ich noch lange in C ,wen nicht besser !
    Nichts gegen dein Können, hier gehts lediglich um die Sprachen !

    lowbyte



  • lowbyte_ schrieb:

    Also ich verstehe dich überhaupt nicht !

    Das ist mir bereits aufgefallen. 😃


  • Mod

    lowbyte_ schrieb:

    Und das was du in C++ schreibst, schreib ich noch lange in C ,wen nicht besser !

    Nein!

    Der zeitliche Aufwand um Lösungen in C zu schreiben ist höher als der solche Dinge in C++ abzubilden.
    Ganu und gar wenn man noch einschließt wie das Verständnis in einem Team sein muss. Klassen sind verständlicher, als pure APIs mögen Sie noch so intelligente Namen tragen.

    Just my 2 cents.

    PS: Ich habe gerade ein C Programm komplett nach C++ konvertiert und teilweise neu geschrieben. Der Code ist ganz eindeutig leichert und besser zu verstehen. Geschweige denn, dass er durch die Verwendung von Klassen/Überladungen (auch von operatoren) fast um 30% kürzer ist.
    Und ja: Der C-Code war gut geschrieben und kein Mist 😉



  • @lowbyte_

    schreibe das doch in asm !.... Dann weißt Du auf ein cycle genau was dein prog macht 😛 :schland:



  • Ok danke für die Antworten. Dann hab ich direkt mal eine Frage:
    ich versuche so auf eine dll funktion dynamisch zu binden:

    typedef str (WINAPI * Funktionname) (int,int,int,int,str);
    

    jedoch bekomme ich diesen Fehler:

    ISO C++ forbids declaration of `str' with no type
    

    Die Funktion in dieser Dll liefert mit eben ein str zurück und deshalb muss ja ich wohl auch diesen typ benutzen, nur was mache ich falsch?

    mfg



  • Darter schrieb:

    Die Funktion in dieser Dll liefert mit eben ein str zurück und deshalb muss ja ich wohl auch diesen typ benutzen, nur was mache ich falsch?

    str ist vermutlich ein char* oder wchar_t* (oder eins davon mit "const").
    Was es genau ist, steht in der Dokumentation dieser Funktion (MSDN, o.ä.)
    Oft benutzt Windows eigene defines oder typedefs dafür (LPSTR, LPCTSTR, usw.)



  • naja da werd ich wohl eher nicht fündig werden.
    Wie ich bereit schonmal erwähnt habe komme ich von einer regt niedrigen (Programmiersprache) und ich weiß soviel, dass mir dir Funktion einen String mit informationen zurückgibt und ich als 5 Parameter wiederum auch einen String bzw. Path zu einer Datei angeben muss. str hieß es eben, aber ich denke dann müsste es mit char* evtl auch funktionieren ich werde es mal Probieren.

    Nähere informationen du dr in der DLL enthaltenen Funktion habe ich leider nicht komme ich auch nicht drann, da es keine sehr verbreitete dll ist.



  • kann mir jemand sagen, warum ich hier immer einen Fehler bekomme

    #include <windows.h>
    
    LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
    
    typedef char* (WINAPI * PFNRECT) (int,int,int,int,char*);
    
    int cxClient, cyClient ;
    
    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                        PSTR szCmdLine, int iCmdShow)
    {
         static TCHAR szAppName[] = TEXT ("Mein Fenster") ;
         HWND         hwnd ;
         MSG          msg ;
         WNDCLASS     wndclass ;
    
         wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
         wndclass.lpfnWndProc   = WndProc ;
         wndclass.cbClsExtra    = 0 ;
         wndclass.cbWndExtra    = 0 ;
         wndclass.hInstance     = hInstance ;
         wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
         wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
         wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
         wndclass.lpszMenuName  = NULL ;
         wndclass.lpszClassName = szAppName ;   
    
         if (!RegisterClass (&wndclass))
         {    // UNICODE-Compilierung ist die einzige realistische Fehlermöglichkeit 
              MessageBox (NULL, TEXT ("Programm arbeitet mit Unicode und setzt Windows NT voraus!"), 
                          szAppName, MB_ICONERROR) ;
              return 0 ;
         }
    
         hwnd = CreateWindow (szAppName, TEXT ("Mein Fenster"),
                              WS_OVERLAPPEDWINDOW,
                              CW_USEDEFAULT, CW_USEDEFAULT,
                              CW_USEDEFAULT, CW_USEDEFAULT,
                              NULL, NULL, hInstance, NULL) ;
    
         ShowWindow (hwnd, iCmdShow) ;
         UpdateWindow (hwnd) ;
    
         char* path = "test.bmp";
         HANDLE hLibrary;
         PFNRECT pfnTestFunktion;     
    
         hLibrary = LoadLibrary (TEXT ("Test.DLL"));     
    
         pfnTestFunktion= (PFNRECT) GetProcAddress (hLibrary, TEXT ("TestFunktion"));   
    
         //char* test = static_cast<char*>(hLibrary);    
         //MessageBox (NULL, test, TEXT("Info"), 0);     
    
         while (TRUE)
         {
              if (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE))
              {
                   if (msg.message == WM_QUIT)
                        break ;
                   TranslateMessage (&msg) ;
                   DispatchMessage (&msg) ;
              }
              else
                   ;
         }
         return msg.wParam ;
    }
    
    LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
    {
         switch (iMsg)
         {
         case WM_SIZE:
              cxClient = LOWORD (lParam) ;
              cyClient = HIWORD (lParam) ;
              return 0 ;
    
         case WM_DESTROY:
              PostQuitMessage (0) ;
              return 0 ;
         }
         return DefWindowProc (hwnd, iMsg, wParam, lParam) ;
    }
    

    und zwar den hier:

    invalid conversion from `void*' to `HINSTANCE__*'
    

    ich habe doch die Variable hLibrary mit HANDLE Declariert?



  • So also es ist eine Dll die nennst dich ImagesearchDLL.dll diese erwartet als Parameter ein int für die x anfangskoordinate eines rechteckt, dann ein int für die y anfangskoordinate des rechtecks, ein int die x endkoordinate und ein int für die y endkooridnaten und zu guterletzt einen Path(ich weiß nur aus autoit, dass das als str angegeben wird) zu einer Bilddatei, welches in diesem Rechteck gesucht werden soll.
    Als Rückgabe erhalt man immer einen string(der auch als str declariert wurde soweit mir bekann). Wenn das Bild nicht gefunden wurde ist dieser string einfach 0.
    Wurde das Bild gefunden enthält dieser srting die x und y Koordinato, wo das Bild gefunden wurde, getrennt durch ein |.

    ich mal einen link, wo man sich die dll runterladen kann:
    http://www.fileuploadx.de/474026

    und hier mein script dazu. Als Bildatei kann man einfach einen kleinen ausschnitt vom desktop oder so nehmen, naürlich muss dieser bei der suche auch anzeigt werden 😉

    EDIT:
    hab grad was gefunden. str entspricht in WinAPI LPCSTR/LPSTR

    trodem funktioniert es mit dieser änderung nicht 😞

    #include <windows.h>
    
    LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
    
    typedef char* (WINAPI * PFNRECT) (int,int,int,int,char*);
    
    char* path = TEXT("test.bmp") ;
    char* rueckgabe ;
    HINSTANCE hLibrary ;
    PFNRECT pfnImageSearch ;   
    
    int cxClient, cyClient ;
    
    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                        PSTR szCmdLine, int iCmdShow)
    {
         static TCHAR szAppName[] = TEXT ("RandRect") ;
         HWND         hwnd ;
         MSG          msg ;
         WNDCLASS     wndclass ;
    
         wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
         wndclass.lpfnWndProc   = WndProc ;
         wndclass.cbClsExtra    = 0 ;
         wndclass.cbWndExtra    = 0 ;
         wndclass.hInstance     = hInstance ;
         wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
         wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
         wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
         wndclass.lpszMenuName  = NULL ;
         wndclass.lpszClassName = szAppName ;   
    
         if (!RegisterClass (&wndclass))
         {    // UNICODE-Compilierung ist die einzige realistische Fehlermöglichkeit 
              MessageBox (NULL, TEXT ("Programm arbeitet mit Unicode und setzt Windows NT voraus!"), 
                          szAppName, MB_ICONERROR) ;
              return 0 ;
         }
    
         hwnd = CreateWindow (szAppName, TEXT ("Zufällige Rechtecke"),
                              WS_OVERLAPPEDWINDOW,
                              CW_USEDEFAULT, CW_USEDEFAULT,
                              CW_USEDEFAULT, CW_USEDEFAULT,
                              NULL, NULL, hInstance, NULL) ;
    
         ShowWindow (hwnd, iCmdShow) ;
         UpdateWindow (hwnd) ;     
    
         hLibrary = LoadLibrary (TEXT ("ImageSearchDLL.dll")) ;     
    
         pfnImageSearch = (PFNRECT) GetProcAddress (hLibrary, TEXT ("ImageSearch")) ;   
    
         MessageBox (NULL, path, TEXT("Info"), 0); 
    
         //DllCall("ImageSearchDLL.dll","str","ImageSearch","int",$x1,"int",$y1,"int",$right,"int",$bottom,"str",$findImage)  
         //_ImageSearchArea($findImage,$resultPosition,$x1,$y1,$right,$bottom,ByRef $x, ByRef $y, $tolerance)
    
         //rueckgabe = pfnImageSearch(0,0,1680,1050,path);
         //char* test = static_cast<char*>(hLibrary);  
         //MessageBox (NULL, rueckgabe, TEXT("Info"), 0);     
    
         while (TRUE)
         {
              if (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE))
              {
                   if (msg.message == WM_QUIT)
                        break ;
                   TranslateMessage (&msg) ;
                   DispatchMessage (&msg) ;
              }
              else
                     rueckgabe = pfnImageSearch(0,0,1680,1050,path);
                     //char* test = static_cast<char*>(hLibrary);  
                     MessageBox (NULL, TEXT (rueckgabe), TEXT("Info"), 0);   
         }
         return msg.wParam ;
    }
    
    LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
    {
         switch (iMsg)
         {
         case WM_SIZE:
              cxClient = LOWORD (lParam) ;
              cyClient = HIWORD (lParam) ;
              return 0 ;
    
         case WM_DESTROY:
              FreeLibrary(hLibrary);
              PostQuitMessage (0) ;
              return 0 ;
         }
         return DefWindowProc (hwnd, iMsg, wParam, lParam) ;
    }
    


  • LoadLibrary(..) gibt aber kein HANDLE zurück, sondern ein HMODULE.
    Guck in der MSDN nach.
    Simon



  • Wieso hier eine neue Diskussion C versus C++?

    Die WinApi-Schnittstelle zur Programmierung ist weiterhin ANSI-C, nicht C++ - und das ist auch gut so. Wer will kann darüber gestülpte Programmieroberflächen mit C++ einsetzen (MFC, VCL, ...) und damit seinen Programmieraufwand vielleicht reduzieren. Das bleibt Geschmackssache und muss jeder selbst entscheiden. Tatsache ist, auch die Programmieroberflächen transformieren alles auf ANSI-C.

    Ich selbst programmiere gemischt. Für eigene Dinge viel mit C++, für die Schnittstelle zur WinApi allein ANSI-C. Damit behalte ich alles im Griff und bleibe weitestgehend unabhängig. Einen veralteten oder unzumutbaren Aufwand sehe ich da nicht.



  • Hi

    So sehe ich das auch ! Danke berniebutt.
    Assembler brauch ich nur, wen nötig. Ansonnsten bleib ich C treu, trotz vieleicht ein bisschen mehr Aufwand.

    lowbyte



  • ok ich habs jetzt nochmal so probiert, leider bleibt die msgbox aber immer noch leer. wie gesagt, wenn das bild nicht gefunden wurde wird ne 0 zurückgegeben und wenn es efunden wurde einen string der x und y koordinate, die durch ein | getrennt sind

    Außerdem hab ich das al C++ Projekt gestartet liegt da vllt der Fehler?

    #include <windows.h>
    
    LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
    
    typedef LPCSTR (WINAPI *PFNRECT) (int,int,int,int,LPCSTR);
    
    LPCSTR path = "test.bmp" ;
    LPCSTR rueckgabe ;
    HMODULE hLibrary ;
    PFNRECT pfnImageSearch ;   
    
    int cxClient, cyClient ;
    
    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                        PSTR szCmdLine, int iCmdShow)
    {
         static TCHAR szAppName[] = TEXT ("RandRect") ;
         HWND         hwnd ;
         MSG          msg ;
         WNDCLASS     wndclass ;
    
         wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
         wndclass.lpfnWndProc   = WndProc ;
         wndclass.cbClsExtra    = 0 ;
         wndclass.cbWndExtra    = 0 ;
         wndclass.hInstance     = hInstance ;
         wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
         wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
         wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
         wndclass.lpszMenuName  = NULL ;
         wndclass.lpszClassName = szAppName ;   
    
         if (!RegisterClass (&wndclass))
         {    // UNICODE-Compilierung ist die einzige realistische Fehlermöglichkeit 
              MessageBox (NULL, TEXT ("Programm arbeitet mit Unicode und setzt Windows NT voraus!"), 
                          szAppName, MB_ICONERROR) ;
              return 0 ;
         }
    
         hwnd = CreateWindow (szAppName, TEXT ("Zufällige Rechtecke"),
                              WS_OVERLAPPEDWINDOW,
                              CW_USEDEFAULT, CW_USEDEFAULT,
                              CW_USEDEFAULT, CW_USEDEFAULT,
                              NULL, NULL, hInstance, NULL) ;
    
         ShowWindow (hwnd, iCmdShow) ;
         UpdateWindow (hwnd) ;     
    
         hLibrary = LoadLibrary (TEXT ("ImageSearchDLL.dll")) ;     
    
         pfnImageSearch = (PFNRECT) GetProcAddress (hLibrary, TEXT ("ImageSearch")) ;   
    
         MessageBox (NULL, path, TEXT("Info"), 0); 
    
         //DllCall("ImageSearchDLL.dll","str","ImageSearch","int",$x1,"int",$y1,"int",$right,"int",$bottom,"str",$findImage)  
         //_ImageSearchArea($findImage,$resultPosition,$x1,$y1,$right,$bottom,ByRef $x, ByRef $y, $tolerance)
    
         //rueckgabe = pfnImageSearch(0,0,1680,1050,path);
         //char* test = static_cast<char*>(hLibrary);  
         //MessageBox (NULL, rueckgabe, TEXT("Info"), 0);     
    
         while (TRUE)
         {
              if (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE))
              {
                   if (msg.message == WM_QUIT)
                        break ;
                   TranslateMessage (&msg) ;
                   DispatchMessage (&msg) ;
              }
              else
                     rueckgabe = pfnImageSearch(0,0,1680,1050,path);
                     //char* test = static_cast<char*>(hLibrary);  
                     MessageBox (NULL, TEXT (rueckgabe), TEXT("Info"), 0);   
         }
         return msg.wParam ;
    }
    
    LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
    {
         switch (iMsg)
         {
         case WM_SIZE:
              cxClient = LOWORD (lParam) ;
              cyClient = HIWORD (lParam) ;
              return 0 ;
    
         case WM_DESTROY:
              FreeLibrary(hLibrary);
              PostQuitMessage (0) ;
              return 0 ;
         }
         return DefWindowProc (hwnd, iMsg, wParam, lParam) ;
    }
    


  • Hallo Darter,

    das hat alles mit der Unterscheidung von C oder C++ nicht das geringste zu tun.

    Du willst aus einer DLL ein Bild (bmp) laden und dieses im Programm einsetzen. Dafür lädst du erst einmal die DLL mit hLibrary = LoadLibrary("name.dll"). Wenn hLibrary ungleich null ist die DLL verfügbar. Jetzt steht da irgendwo in der DLL das Bild (es können mehrere sein). Dieses bekommst du mit hBitmap = LoadBitmap(hLibrary, ...) geliefert. Liefert hBitmap ungleich null hast du das Bild, ansonsten ist der Aufruf von LoadBitmap unvollständig oder falsch.

    Teile bitte mit, wie die DLL erstellt ist und wo sich darin das Bild befindet!

    Ich verwende für diesen Zweck den Vorschlag von Charles Petzold zur Bildung einer reinen Bitmap-DLL und besorge mir dann das gewünschte Bild mit:
    hBitmap = LoadBitmap(hLibrary,MAKEINTRESOURCE(intResource));

    Noch ein Vorschlag: überprüfe bei solchen mehrstufigen Dingen stets die Rückgabewerte der WinApi-Funktionen. Dann weisst du genau, wo etwas klemmt. Deine Fragestellung hat einige hier irritiert und eine unnötige Diskussion ausgelöst. :p



  • ob du C oder C++ nimmst ist als ob du ein oder zwei steaks nimmst.

    C++ kann <alles> was C kann, fügt aber neue sachen hinzu. du kannst also
    ganz normal in C schreiben, und an einigen stellen C++ nutzen.

    daher würde ich dir C++ empfehlen. printf gibt es da auch!

    :schland:


Anmelden zum Antworten