c++ HBITMAP per Socket senden.



  • hallo Leute, ich arbeite seit einiger zeit auf ein Remote-app, sodass ich meine PC remoten kann, habe nun eine Problem und zwar, ich habe bereit screenshot gemacht, und möchte das HBITMAP per socket senden(keine BITMAP file sondern Hbitmap).
    ich wäre dankbar wenn ihr mir helfen könntet.





  • vielen Dank für deine schnelle Antwort , ich habe s auch schon mal probiert (GetDIBits und SetDIBits funktion), allerdings habe ich nicht geschafft, liegt natürlich an mir.Wenn du weißt wie ich das verwenden kann, das wäre sehr super. danke nochmal.



  • Was hast du genau probiert und was hat nicht funktioniert? Wie hast du den Speicher reserviert? Als Kommentar unter der Funktion steht nämlich sowas:

    [...]the only safe buffer to pass to lpvBits is one that you have directly allocated using a single call to VirtualAlloc. Do not use malloc, operator new, GlobalAlloc, HeapAlloc, or other heap allocators; they are not safe to use.



  • also was ich verstanden habe, dass die Daten die man per socket senden kann sind in lpbi gespeichert, und habe getDibits so aufgerufen

    GetDIBits(OffscrDC, OffscrBmp, 0, height, lpvBits, lpbi, DIB_RGB_COLORS)

    und lpbi per socket gesendet. auf der anderen Seite habe versucht mit SetDibits die Daten rückgängig zu machen, hat nicht funktioniert.



  • Meinst du echt dass wir mit deiner Beschreibung dessen was du probiert hast und deiner Fehlerbreschreibung was anfangen können?
    Versetz dich mal in unsere Lage.
    Woher sollen wir wissen was in den ganzen Variablen in

    GetDIBits(OffscrDC, OffscrBmp, 0, height, lpvBits, lpbi, DIB_RGB_COLORS)
    

    drinnen steht?
    Oder wie du es versucht hast auf der Gegenseite "rückgängig zu machen".
    Oder was "hat nicht funktioniert" genau bedeutet.



  • ich weiße auch nicht was du nicht verstanden hast!!!!
    die Frage lautet: wie kann man HBITMAP per socket senden?
    Antwort GetDibits.
    Frage wie kann man GetDibits verwenden?
    was gibt hier zu erklären....!



  • reger-men schrieb:

    ich weiße auch nicht was du nicht verstanden hast!!!!
    die Frage lautet: wie kann man HBITMAP per socket senden?
    Antwort GetDibits

    Das ist falsch. Richtige Antwort lautet: send



  • @reger-men
    rofl

    Dein erster Thread hier, und du machst dich gleich richtig beliebt. Weiter so!

    Meinst du echt ich schreib dir jetzt ein Beispiel zusammen wie du GetDIBits+send+recv+SetDIBits verwenden kannst, um Bitmap-Daten zu übertragen? Kleiner Tip: tu ich sicher nicht. Und ob sich jemand anderer findet der dazu bereit ist -- naja, wenn du meinst dass das passieren wird...

    Wenn du den Code postest mit dem du es probiert hast + Beschreibung was genau nicht funktioniert, stehen die Chancen auf jeden Fall viel besser dass es sich jmd. ansieht und dir erklärt wo du welchen Fehler gemacht hast.

    Jetzt ist nur noch die Frage ob dir deine Arroganz wichtiger ist als eine Antwort zu bekommen.

    reger-men schrieb:

    Frage wie kann man GetDibits verwenden?

    Antwort: indem du es mit passenden Parametern aufrufst. Wie genau das geht, steht in der MSDN.
    "Was gibt's da noch zu fragen...!"



  • Belli schrieb:

    reger-men schrieb:

    ich weiße auch nicht was du nicht verstanden hast!!!!
    die Frage lautet: wie kann man HBITMAP per socket senden?
    Antwort GetDibits

    Das ist falsch. Richtige Antwort lautet: send

    Ja, klar. Weil schon seine Fragestellung Unsinn ist. Weil er in Wirklichkeit gar nicht "das HBITMAP" versenden will -- was ja auch keinen Sinn machen würde, weil's auf der anderen Seite einfach nur ne Hausnummer ist.
    Bei diesem Herrn denke ich war es wirklich ein Fehler über diesen Fehler hinwegzusehen.



  • man sieht sich immer zweimal im leben Glugscheiß sogar n mal (n→∞)
    das Problem ist gelöst, hier das CODE für Leute die arbeiten können nicht schwätzen...!
    [code]
    DWORD WINAPI SendImage(LPVOID param) //sends the bitmap data
    {
    BITMAPINFO bi;
    BYTE* data = new BYTE[256*256*256];
    BYTE* buf = new BYTE[256*256*256];
    BYTE *packetsize1, *packetsize2;
    int biSize = sizeof(BITMAPINFO);
    int i, clocks, oldclocks=0;

    while(true)
    {
    clocks=clock();

    if((clocks-oldclocks)*CLOCKS_PER_SEC<0.1)
    {
    continue;
    }

    oldclocks=clocks;

    if(bConnected)
    {
    GetScreenData(&bi, buf);

    i=0;

    data[i++]=3;
    packetsize1=&data[i++];
    packetsize2=&data[i++];

    memcpy(data+i, &bi, biSize);

    i+=biSize;

    memcpy(data+i, buf, bi.bmiHeader.biSizeImage);

    printf("Sending image...\n");

    i+=bi.bmiHeader.biSizeImage;

    *packetsize1=int(i/256);
    *packetsize2=int(i%256);

    send(s, (char*)data, i, 0);
    }
    }
    }



  • reger-men schrieb:

    das CODE

    Krasses Code 😃



  • Das krasse CODE von das krasse reger-men, uh jeah Bebi!!1

    ----

    Noch jmd. anderer der das gerade überhaupt nicht packt, oder geht's nur mir so?



  • hustbaer schrieb:

    Noch jmd. anderer das gerade überhaupt nicht packt, oder geht's nur mir so?

    Ich bin mir nicht sicher... Ich halte das zu raffiniert für einen Trollversuch, aber kann mir grad irgendwie schlecht vorstellen, dass es funktionieren könnte, außer rein zufällig.



  • Mal davon abgesehen dass der Code der GetScreenData Funktion fehlt (ist ja keine Windows-Funktion)...

    Ach ich kann mir schon vorstellen dass der Code funktioniert.
    Vorausgesetzt er baut es auf der anderen Seite korrekt zusammen auseinander.
    Und davon abgesehen dass er mit an Sicherheit grenzender Wahrscheinlichkeit auf der Empfängerseite recv falsch aufruft.

    Aber darum geht's ja nicht. Sein CODE ist nicht das was ich nicht packe, da hab ich schon viel schlimmeres gesehen was dann auch irgendwie funktioniert.



  • Danke hat geholfen 🙂



  • reger-men schrieb:

    man sieht sich immer zweimal im leben Glugscheiß sogar n mal (n→∞)
    das Problem ist gelöst, hier das CODE für Leute die arbeiten können nicht schwätzen...!

    Na hoffentlich kommt der nicht wieder.

    Wenn doch: Lieber "reger-men", hustbaer und die anderen, die hier geantwortet haben, sind bestimmt keine Klugscheißer. Wenn Du sagst, dass etwas nicht funktioniert hat, ist das eine sehr unvollständige Fehlerbeschreibung, auf die man nicht wirklich anders antworten kann, als mit der Bitte, sie zu präzisieren. Hat der Compiler eine Fehlermeldung ausgespuckt? Wenn ja, welche? Gab es einen Linkerfehler? Ist das Programm abgestürzt? Mit welchen Parametern hast Du die Funktionen aufgerufen? Gab es einen Fehlercode als Rückgabe? Du siehst, es gibt einfach zu viele Fragen, die unbeantwortet bleiben, um Dir wirklich helfen zu können.

    Und selbst der CODE für Leute, die behaupten arbeiten zu können hat schon beim ersten Blick gleich zumindest mal einen Memory leak. Und was clock() da zu suchen hat, erschließt sich nicht wirklich.

    Als beim nächsten mal versuchst Du einfach mal respektvoll mit den Leuten umzugehen, die Dir helfen wollen. Auch wenn die Antworten unfreundlich wirken sollten, dann solltest Du Dir überlegen, ob es ziel führend ist, den potentiellen Helfern Arroganz entgegen zu bringen.


Anmelden zum Antworten