Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Динамическая линковка GDI+: C2065: 'Bitmap' : undeclared identifier (и Image )  (Прочитано 6831 раз)
0 Пользователей и 3 Гостей смотрят эту тему.
malor
Опытный

ru
Offline Offline

« : 06-07-2011 15:01 » new

Сделал в заголовочном файле объявления типов наподобие:
typedef long(__stdcall*GDIPLUSSTARTUP)(unsigned long*, const GDIPLUS_STARTUP_INPUT*, void*);

В cpp-файле
GDIPLUSSTARTUP GdiplusStartup;
Также и по остальным функциям:  GdiplusShutdown, GdipCreateBitmapFromHBITMAP etc.

Для компилятора типы Bitmap и Image неизвестны:
Цитата
c:\createjpg\createjpg\savescreen.cpp(194) : error C2065: 'Bitmap' : undeclared identifier
c:\createjpg\createjpg\savescreen.cpp(194) : error C2065: 'bmp' : undeclared identifier
c:\createjpg\createjpg\savescreen.cpp(194) : error C2061: syntax error : identifier 'Bitmap'
c:\createjpg\createjpg\savescreen.cpp(195) : error C2065: 'Image' : undeclared identifier
c:\createjpg\createjpg\savescreen.cpp(195) : error C2065: 'img' : undeclared identifier
c:\createjpg\createjpg\savescreen.cpp(195) : error C2065: 'bmp' : undeclared identifier
c:\createjpg\createjpg\savescreen.cpp(195) : error C2227: left of '->GetThumbnailImage' must point to class/struct/union/generic type
        type is ''unknown-type''
c:\createjpg\createjpg\savescreen.cpp(201) : error C2065: 'EncoderQuality' : undeclared identifier
c:\createjpg\createjpg\savescreen.cpp(208) : error C2065: 'bmp' : undeclared identifier
c:\createjpg\createjpg\savescreen.cpp(208) : error C2541: 'delete' : cannot delete objects that are not pointers
c:\createjpg\createjpg\savescreen.cpp(209) : error C2065: 'img' : undeclared identifier
c:\createjpg\createjpg\savescreen.cpp(209) : error C2541: 'delete' : cannot delete objects that are not pointers
Как их объявлять?  Да что ты говоришь?..

Код:
// Сохраннение в файл на диске в формате JPG
int SaveScreenShotJPG()
{
    int result = 0;

    //Остатки прошлого кода, когда GDI+ линковался статически
    //ULONG_PTR gdiplusToken;
    //GdiplusStartupInput gdiplusStartupInput;
    //GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

    // В ней мы вызываем LoadLibrary(...) и получаем адреса функций через GetProcAddress()
    InitDeinitGdiPlus(true);

    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;
    ENCODER_PARAMETERS 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); 

    delete bmp;
    delete img;

    //GdiplusShutdown(gdiplusToken);
    InitDeinitGdiPlus(false);

    DeleteObject(membit);
    DeleteObject(memdc);
    ReleaseDC(0, scrdc);

    return result;
}

* CreateJPG_0707.rar (21.1 Кб - загружено 1008 раз.)
Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 06-07-2011 21:09 » 

Эти типы находятся в пространстве имён Gdiplus. У тебя директива using для него закомментирована, и явно оно тоже не используется. Соответственно, в глобальном пространстве имён таких типов нет, а больше нигде компилятор и не смотрит.
Записан
malor
Опытный

ru
Offline Offline

« Ответ #2 : 07-07-2011 14:39 » 

Раскомментировал
using namespace Gdiplus;

Соответственно закомментил в хэдере строки вида
//typedef long(__stdcall*GDIPLUSSTARTUP)(unsigned long*, const GDIPLUS_STARTUP_INPUT*, void*);
а в cpp-файле:
//GDIPLUSSTARTUP GdiplusStartup;

Есть следующие error'ы:
Цитата
error C2065: 'GdipCreateHBITMAPFromBitmap' : undeclared identifier   
error C2065: 'GdipCreateBitmapFromHBITMAP' : undeclared identifier
error C2065: 'GdipGetImageEncodersSize' : undeclared identifier   
................. etc ..........................
Хотя если встать, например, на GdipCreateHBITMAPFromBitmap и нажать "Go To Definition", то описание студия покажет:
Цитата: c:\Microsoft SDKs\Windows\v6.0A\Include\GdiPlusFlat.h
GpStatus WINGDIPAPI
GdipCreateHBITMAPFromBitmap(GpBitmap* bitmap,
                            HBITMAP* hbmReturn,
                            ARGB background);
Почему так?..
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines