WinApi Dll
-
Heyho!
Ich google jetzt schon seid mehreren Tagen und werde einfach nicht fündig
Ich hatte vor mir für ein Projeckt eine DLL zu machen, die automatisch einen Screenshot vom Bildschirm in das Temp Verzeichnis macht...
Dies hab ich als erstes als exe gemacht, die übrigens auch wie gewünscht funktioniert... Als ich die exe jedoch in eine DLL umgeformt hatte und probiert habe sie zu compilen, bekam ich für alle WinApi befehle einen Linker Error (z.B. [Linker error] undefined reference to `BitBlt@36' ).
Das dies normalerweise passiert, wenn man ein Winapiscript versucht in einer ConsolenAplication zu kompilen ist mir klar... doch wie stelle ich die dll auf Winapi um?
das ist mein dll Code:#include <windows.h> #include <string> #include <iostream> #define _T TEXT using namespace std; extern "C" int __declspec(dllexport) Screenshot () { int nWidth = GetSystemMetrics(SM_CXSCREEN); int nHeight = GetSystemMetrics(SM_CYSCREEN); char temp[256]; GetTempPath(256, temp); char Path[269]; strcpy(Path, temp); strcat(Path, "Desktop.bmp"); HDC hdc = ::GetDC(0); HDC memDC = ::CreateCompatibleDC(hdc); HBITMAP hbm = ::CreateCompatibleBitmap(hdc, nWidth, nHeight); HBITMAP hbmOld = (HBITMAP)::SelectObject(memDC, hbm); HCURSOR hcursor; HICON cursoricon; ICONINFO iconsize; hcursor=GetCursor(); cursoricon=CopyIcon(hcursor); ::GetIconInfo(cursoricon, &iconsize); POINT pt; ::GetCursorPos(&pt); //char temp2[25]; //sprintf(temp2, "Maus: x: %i, y: %i", pt.x, pt.y); //MessageBox(0, temp2, 0, 0); ::BitBlt(memDC, 0, 0, nWidth, nHeight, hdc, 0, 0, SRCCOPY); DrawIcon(memDC, pt.x-iconsize.xHotspot, pt.y-iconsize.yHotspot, cursoricon); DeleteObject(iconsize.hbmMask); DeleteObject(iconsize.hbmColor); DestroyIcon(cursoricon); BITMAPINFO bmi; ZeroMemory(&bmi, sizeof(bmi)); bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); bmi.bmiHeader.biWidth = nWidth; bmi.bmiHeader.biHeight = nHeight; bmi.bmiHeader.biBitCount = 24; bmi.bmiHeader.biPlanes = 1; bmi.bmiHeader.biCompression = BI_RGB; bmi.bmiHeader.biSizeImage = bmi.bmiHeader.biBitCount * nWidth * nHeight / 8; BYTE *pbBits = new BYTE[bmi.bmiHeader.biSizeImage]; ::GetDIBits( memDC, hbm, 0, bmi.bmiHeader.biHeight, pbBits, &bmi, DIB_RGB_COLORS ); BITMAPFILEHEADER bfh; bfh.bfType = ('M' << 8) + 'B'; bfh.bfSize = sizeof(BITMAPFILEHEADER) + bmi.bmiHeader.biSizeImage + sizeof(BITMAPINFOHEADER); bfh.bfReserved1 = 0; bfh.bfReserved2 = 0; bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); HANDLE hfile = CreateFile( _T(Path), GENERIC_WRITE, 0, 0, OPEN_ALWAYS, 0, 0 ); DWORD dwWritten; WriteFile(hfile,&bfh, sizeof(bfh), &dwWritten, NULL); WriteFile(hfile,&bmi.bmiHeader, sizeof(BITMAPINFOHEADER), &dwWritten, NULL); WriteFile(hfile,pbBits, bmi.bmiHeader.biSizeImage, &dwWritten, NULL); CloseHandle(hfile); SelectObject(memDC, hbmOld); ReleaseDC(0,hdc); DeleteDC(memDC); DeleteDC(hdc); DeleteObject(hbm); delete[] pbBits; return 2; }Ich bin dankbar für jede Hilfe

-
Visual Studio benutzen.
-
Mit Visual Studio bin ich auf Kriegspfad... Hab da irwi immer Probleme mit.. Habs trotzdem versucht, aber da geht das mit dem Tempdir dann nicht mehr richtig/erzeugt error meldungen
-
Deathly Assassin schrieb:
erzeugt error meldungen
Cool.
-
lol

Danke trotzdem für den Vorschlag....
Hat sonst noch wer eine idee wie man (möglichst mit Dev-C++) eine WinApi DLL erstellen kann?
-
Gdi32.lib linken.
-
WHOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOOOOOOOO!!!!!!!!!!!!!!!!!!! vielen dank!!!!!!!!!!!!!!!!!!!!!!

Das zauberwort war dann -lgdi32 in der compiler command line =DDEdit:\\
Nächste frage, lol^^
gibt es hier ein Tutorial über eine 16/8 bit bmp/Screenshot?
Sufu und google geben mir leider keine ergebnisse dazu
-
Deathly Assassin schrieb:
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Manchmal ist weniger mehr.
-
sry, freu mich ja bloß, weil ich solange an diesem problem gesessen habe^^
-
Google ersetzt nicht die Hilfen der WinApi oder des Compilers. Da steht normalerweise alles drin, was man zum Programmieren so braucht. DLLs für
ConsolAnwendungen und WindowsAnwendungen sind ein wenig unterschiedlich.
-
Kennt keiner ein Tutorial über das erstellen einer 16 oder 12 Bit .bmp datei?
-
ok, hat sich erledigt.... habs hinbekommen

weiß denn wer, wie man eine bmp kleiner macht? also z.b. von 1280*1024 in 1024*768 convertiert?
oder wie man eine bmp in ein png oder jpg formatiert?
-
*push*

-
Die Größe ändern kannst du z.B., indem du mit StretchBlt umkopierst. Da brauchst du einfach nur eine neue Zielgröße anzugeben. Konvertieren in andere Formate kannst du mit entsprechenden Bibliotheken (ich kenn grad keine), such einfach mal über Google...
-
dank dir

-
StretchBlt war nen guter tipp, die qualität is aber doch zu schlecht... wenn ich es von 1280*1024 auf 1024*768 konvertiere sind überall schwarze streifen und schrift ist kaum/garnicht lesbar

wenn man mit programmen wie "gimp" zumbeispiel zurück scrollt ist die qualität doch auch noch ziemlich gut und wenn man dann einen screenshot macht und es ausschneidest kommt man ja aufs selbe ergebnis... jedes programm bei dem man zurück scrollen kann, verkleinert das bild... aber mit was für einem befehl/en kann man das machen, dass die qualität dann noch verhältnis mäßig normal bleibt? Hab auch schon nach GDI befehlen dafür gegoogelt aber bin auch nicht fündig geworden

Trotzdem danke für den guten vorschlag mit StrechBlt!
-
Meine Frage besteht immernoch (tut mir leid, dass ich immer pushe.. werd leider anders nicht fündig
)
-
Google mit "image processing library":
-
Wenn ich probiere die CImg.h zu includen (#include "CImg.h"), kriege ich jedesmal diesen error
: C:\C++\libarys\CImg_1.3.0\CImg-1.3.0\CImg.h In member function `cimg_library::CImg<T>& cimg_library::CImg<T>::draw_triangle(int, int, int, int, int, int, const tc*, float, float, float, float)':
-
Irgendwie fehlt da was. Was genau steht denn nach dem Doppelpunkt?
Bist du immer noch mit Dev-C++ unterwegs? Wenn du schon kein VS nutzen möchtest, probiere doch wenigstens mal Code::Blocks. Da wäre dann auch ein neuer Compiler bei. Vielleicht liegts ja daran...