Есть приложение, оно компилится. В нем есть динамическая линковка GDI+: HMODULE hGDIPlsu = LoadLibrary(_T("gdiplus.dll"));
В хэдере объявлен структура для хранения адресов функций из "gdiplus.dll":
| Код | typedef struct{ Status (WINAPI *pfnGdiplusStartup)(ULONG_PTR*, const GdiplusStartupInput*, GdiplusStartupOutput*); VOID (WINAPI *pfnGdiplusShutdown)(ULONG_PTR); Status (WINAPI *pfnGetImageEncoders)(UINT, UINT, ImageCodecInfo*); Status (WINAPI *pfnGetImageEncodersSize)(UINT*, UINT*); Status (WINAPI *pfnGdipCreateBitmapFromScan0)(INT, INT, INT, PixelFormat, BYTE*, GpBitmap**); Status (WINAPI *pfnGdipBitmapLockBits)(GpBitmap*, const GpRect*, UINT, PixelFormat, BitmapData*); Status (WINAPI *pfnGdipBitmapUnlockBits)(GpBitmap*, BitmapData*); Status (WINAPI *pfnGdipSaveImageToFile)(GpImage*, const WCHAR*, const CLSID*, const EncoderParameters*); Image (WINAPI *pfnGetThumbnailImage)(UINT, UINT, GetThumbnailImageAbort, VOID*); Status (WINAPI *pfnGdipCreateBitmapFromHBITMAP)(HBITMAP, HPALETTE, GpBitmap**); }DYN_DLLS, *LPDYN_DLLS; |
В cpp-файле она заполняется нужными значениями:
| Код | (FARPROC&)DynDlls.pfnGdiplusStartup = GetProcAddress(hGDIPlsu, "GdiplusStartup"); (FARPROC&)DynDlls.pfnGdiplusShutdown = GetProcAddress(hGDIPlsu, "GdiplusShutdown"); (FARPROC&)DynDlls.pfnGetImageEncoders = GetProcAddress(hGDIPlsu, "GdipGetImageEncoders"); (FARPROC&)DynDlls.pfnGetImageEncodersSize = GetProcAddress(hGDIPlsu, "GdipGetImageEncodersSize"); (FARPROC&)DynDlls.pfnGdipCreateBitmapFromScan0 = GetProcAddress(hGDIPlsu, "GdipCreateBitmapFromScan0"); (FARPROC&)DynDlls.pfnGdipBitmapLockBits = GetProcAddress(hGDIPlsu, "GdipBitmapLockBits"); (FARPROC&)DynDlls.pfnGdipBitmapUnlockBits = GetProcAddress(hGDIPlsu, "GdipBitmapUnlockBits"); (FARPROC&)DynDlls.pfnGdipSaveImageToFile = GetProcAddress(hGDIPlsu, "GdipSaveImageToFile"); |
Вставляю в него свой кусок кода, для сохранения скриншота в файл на диске:
| Код | int Width, Height; HDC scrdc, memdc; HBITMAP membit; scrdc = GetDC(0); Height = GetSystemMetrics(SM_CYSCREEN); Width = GetSystemMetrics(SM_CXSCREEN); memdc = CreateCompatibleDC(scrdc); membit = CreateCompatibleBitmap(scrdc, Width, Height); SelectObject(memdc, membit); BitBlt(memdc, 0, 0, Width, Height, scrdc, 0, 0, SRCCOPY); Bitmap *bmp = new Bitmap(membit, NULL); Image *img = bmp->GetThumbnailImage(Width, Height); CLSID imgClsid; EncoderParameters encoderParams; int quality = 65; encoderParams.Count = 1; encoderParams.Parameter[0].Guid = EncoderQuality; encoderParams.Parameter[0].Type = 4; encoderParams.Parameter[0].NumberOfValues = 1; encoderParams.Parameter[0].Value = &quality; GetEncoderClsid(L"image/jpeg", &imgClsid); //result = img->Save(L"Z:\\ImageDesktop.jpeg", &imgClsid, &encoderParams); // САМЫЙ ГЛАВНЫЙ МОМЕНТ, НО ПОКА ЗАКОММЕНЧУ //if (DynDlls.pfnGdipSaveImageToFile(img, L"Z:\\ImageDesktop.jpeg", &imgClsid, &encoderParams) == Ok) // bRes = TRUE;
delete bmp; delete img;
DeleteObject(membit); DeleteObject(memdc); ReleaseDC(0, scrdc); |
Начинают выдаваться компилятором следующие сообщения:
| Цитата | error LNK2001: unresolved external symbol _EncoderQuality GdiplusTest.obj : error LNK2019: unresolved external symbol _GdipFree@4 referenced in function "public: static void __cdecl Gdiplus::GdiplusBase::operator delete(void *)" (??3GdiplusBase@Gdiplus@@SAXPAX@Z) error LNK2019: unresolved external symbol _GdipAlloc@4 referenced in function "public: static void * __cdecl Gdiplus::GdiplusBase::operator new(unsigned int)" (??2GdiplusBase@Gdiplus@@SAPAXI@Z) error LNK2019: unresolved external symbol _GdipDisposeImage@4 referenced in function "public: class Gdiplus::Image * __thiscall Gdiplus::Image::GetThumbnailImage(unsigned int,unsigned int,int (__stdcall*)(void *),void *)" (?GetThumbnailImage@Image@Gdiplus@@QAEPAV12@IIP6GHPAX@Z0@Z) error LNK2019: unresolved external symbol _GdipGetImageThumbnail@24 referenced in function "public: class Gdiplus::Image * __thiscall Gdiplus::Image::GetThumbnailImage(unsigned int,unsigned int,int (__stdcall*)(void *),void *)" (?GetThumbnailImage@Image@Gdiplus@@QAEPAV12@IIP6GHPAX@Z0@Z) error LNK2019: unresolved external symbol _GdipCloneImage@8 referenced in function "public: virtual class Gdiplus::Image * __thiscall Gdiplus::Image::Clone(void)" (?Clone@Image@Gdiplus@@UAEPAV12@XZ) error LNK2019: unresolved external symbol _GdipCreateBitmapFromHBITMAP@12 referenced in function "public: __thiscall Gdiplus::Bitmap::Bitmap(struct HBITMAP__ *,struct HPALETTE__ *)" (??0Bitmap@Gdiplus@@QAE@PAUHBITMAP__@@PAUHPALETTE__@@@Z) .\Debug/GdiplusTest.exe : fatal error LNK1120: 7 unresolved externals |
Нужно указанные компилятором функции GdipFree, GdipAlloc, GdipDisposeImage, GdipGetImageThumbnail, GdipCloneImage, GdipCreateBitmapFromHBITMAP прописать в структуре DYN_DLLS, расположенной в хэдере? |