Problem beim DLL-Einbinden und GetProcAddress()
Von: , Frage gestellt am Mi, 8. Aug 2007
Moin!
Ich verzweifle am korrekten Einbinden einer DLL. Obwohl ich mich, denke ich, an die zahlreichen Beispiele im Internet gehalten habe, klappt es einfach nicht. Wäre nett, wenn mal jemand drüber gucken könnte.
Und bitte nicht auf Google verweisen, da habe ich nun schon etliche Stunden erfolglos investiert...
Das Einbinden per LoadLibrary() klappt, jedoch liefert GetProcAddress() kein gültiges Handle. GetLastError() liefert 127 (The specified procedure could not be found) zurück.
myDLL.h :
#ifdef MYDLL_EXPORTS #define MYDLL_API __declspec(dllexport) #else #define MYDLL_API __declspec(dllimport) #endif MYDLL_API void ScreenShotWholeDesktop(void);
myDLL.cpp :
#include "stdafx.h"
#include "myDLL.h"
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
MYDLL_API void ScreenShotWholeDesktop(void) {
//--------------------------------------------------------------------------------------------------------------------------
//__declspec(dllexport) void _cdecl ScreenShotWholeDesktop(void) {
//--------------------------------------------------------------------------------------------------------------------------
int nWidth = GetSystemMetrics(SM_CXSCREEN);
int nHeight = GetSystemMetrics(SM_CYSCREEN);
HWND hWnd = ::GetDesktopWindow();
HDC hdc = ::GetDC(hWnd);
HDC memDC = ::CreateCompatibleDC(hdc);
HBITMAP hbm = ::CreateCompatibleBitmap(hdc, nWidth, nHeight);
HBITMAP hbmOld = (HBITMAP)::SelectObject(memDC, hbm);
::BitBlt(memDC, 0, 0, nWidth, nHeight, hdc, 0, 0, SRCCOPY);
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 = 32 * 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);
SetDIBits(memDC,hbm,0,bmi.bmiHeader.biHeight,pbBits,&bmi,DIB_RGB_COLORS);
// StretchBlt(*hDC, 0, 0, WinSizeX,WinSizeY,memDC, 0, 0,WinSizeX/2,WinSizeY/2,SRCCOPY);
// BitBlt(*hDC, 0, 0, GetSystemMetrics(SM_CXSCREEN)-1,GetSystemMetrics(SM_CYSCREEN)-1,memDC, 0, 0, SRCCOPY);
HANDLE hfile = CreateFile( "__TMP__SCRNSHOT__2357__.BMP",
GENERIC_WRITE,
0,
0,
CREATE_ALWAYS,
0,
0 );
if(hfile==INVALID_HANDLE_VALUE) {
MessageBox(NULL,"Datei konnte nicht erzeugt werden!",NULL,MB_OK);
}
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);
::DeleteDC(memDC);
::ReleaseDC(hWnd,hdc);
::DeleteObject(hbm);
delete[] pbBits;
return;
}
testDLL.cpp :
#include "stdafx.h"
#include "..\\myDLL.h"
typedef void (*DLLFUNC)(void);
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow) {
//
HMODULE hDLL = LoadLibrary("..\\debug\\myDLL.dll");
DLLFUNC pfnDllScreenShotWholeDesktop = NULL;
if(hDLL==NULL) {
MessageBox(NULL,"LoadLibrary NICHT erfolgreich!",NULL,MB_OK);
}
pfnDllScreenShotWholeDesktop = (DLLFUNC)GetProcAddress((HINSTANCE)hDLL,"ScreenShotWholeDesktop");
if(pfnDllScreenShotWholeDesktop==NULL) {
MessageBox(NULL,"GetProcAddress NICHT erfolgreich!",NULL,MB_OK);
char sTmp[10]={0};
wsprintf(sTmp,"Error: %i",GetLastError());
MessageBox(NULL,sTmp,NULL,MB_OK);
}
//pfnDllScreenShotWholeDesktop();
FreeLibrary(hDLL);
return 0;
}
Im Voraus schonmal vielen Dank!
Gruß Matze
