C++ oder C



  • 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:



  • berniebutt schrieb:

    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

    Danke für den beitrag aber ich glaube du hast es nicht ganz verstnden.

    ALso nochmal:

    Ich will aus der Dll kein Bild laden sondern ich übergebe der dll einen Path zu einer Bilddatei, die dann in den Koordianten die als int, parameter auch der dll übergeben werden. Diese dll Such dass innerhalb den angegebenen Koordinaten nach diesem Bild. Verstanden?

    Wenn nun diese Bild(den path den ich übergeben habe) in dem Rechteck gefunden wurde, gibt mir die Funktion in der Dll einen String mit den x und y Koordinaten, welche durch ein | getrennt sind zurück. Wurde das Bild nicht Gefunden erhalte ich auch einen String indem eine 0 steht.

    Ach ich sollte vllt erwähnen es wird natürlich überpüft, was gerade auf dem Bildschift angezeigt wird(vllt deshalb die unklarheiten).

    mfg Darter



  • AfroMan with Peace schrieb:

    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!

    Ich hab die GUI Bibliothek mal ausprobiert. Leider funktioniert bei mir ncihtmal eines der mitgelieferten Samples.

    mfg Darter :schland:



  • Hi

    C++ kann <alles> was C kann, fügt aber neue sachen hinzu.

    Ja klar aber nur in dem hinblick ,das dir sachen erleichtert oder abgenommen werden (abstraktion).!! Und sonnst nichts !!

    Dass wir das Thema auch gleich abhacken können ,

    C equ C++

    lowbyte



  • lowbyte_ schrieb:

    C equ C++

    Das geht jetzt aber auch nicht mehr unwidersprochen durch! 🕶



  • Hi

    Schon klar !
    Glaube weisst was ich meine.

    lowbyte



  • Ja klar aber nur in dem hinblick ,das dir sachen erleichtert oder abgenommen werden (abstraktion).!! Und sonnst nichts !!

    Huh?
    Templates. Bessere Typensicherheit.

    Um nur mal 2 Gründe jenseits oop/Abstraktion zu nennen 😉



  • Hi

    Klar bietet dir die Sprache gewisse Vorteile, von wegen Sicherheit, Objectorientiert etc. Doch ein Sicherheitsbewuster C Programmierer nimmt auch diese Hürde. Und schon sind wir wider beim Thema (Abstraktion) in gewisser weise.

    Will man ein kleiner Absatz aus einem C Buch posten.

    Viele Leute raten von C ab, da C keinen objektorientierten Ansatz mitbringt und man sich um die Speicherverwaltung selbst kümmern muss, was einige Gefahren mit sich bringt. Ich bin der Meinung, dass Sie mit C eine gute Wahl getroffen haben. Die Tatsache, dass man bei C vieles selbst von Hand erledigen muss, sehe ich eher als Vorteil an. Durch den Umgang mit diesen Unbequemlichkeiten stellt sich ein hohes Verständnis für das Betriebssystem und die Arbeitsweise Ihres Computers ein.

    C-Programmierung schafft so eine solide Grundlage, die es Ihnen ermöglicht, andere Sprachen schnell zu verstehen, zu erlernen und einzusetzen, da Sie ein grundsätzliches Verständnis von dem haben, was der Computer im Hintergrund tatsächlich macht.

    Aber C ist in meinen Augen keinesfalls eine Sprache, die nur zum Einstieg und Lernen der Programmierung dient. Im Gegenteil, mit C können Sie im Grunde alles programmieren – auch einen eigenen objektorientierten Ansatz oder eine komfortable Speicherverwaltung. Nicht ohne Grund sind fast alle modernen Betriebssysteme in C geschrieben.

    Das sind die Gründe warum ich in C schreibe.(zu 90%)

    lowbyte



  • lowbyte_ schrieb:

    Das sind die Gründe warum ich in C schreibe.(zu 90%)

    Weil du so viele Betriebssysteme entwickelst?



  • Hi

    Lassen wir es einfach.

    lowbyte


Anmelden zum Antworten