Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Не подключается библитотека


Автор: IIGGOORR 26.4.2007, 13:33
Извините за беспокойство. У меня такая проблема - Я создаю простое MFC приложение, мне надо загружать в нём bmp картинки и обрабатывать их. Мне нужны методы класса Image, соответственно они содержатся в библиотеках gdiplus.dll, gdiplus.lib. Когда я подключаю с помощью #include <...> заголовочные файлы из класса Image, например, Gdiplusheaders.h, gdiplus.h, то компилятор выдаёт  много ошибок. Когда я пишу стандартный конструктор класса Image компилятор сообщает, что такого класса нет. Помогите пожалуйста, как подключить библиотеки класса Image?

Автор: _hunter 26.4.2007, 13:57
Цитата(IIGGOORR @  26.4.2007,  13:33 Найти цитируемый пост)
 то компилятор выдаёт  много ошибок

их не помешало бы привести...

Цитата(IIGGOORR @  26.4.2007,  13:33 Найти цитируемый пост)
 Мне нужны методы класса Image, соответственно они содержатся в библиотеках gdiplus.dll, gdiplus.lib. 

что за класс такой? CImage в atlimage.h описан...

Автор: korbian 26.4.2007, 14:00
Если я все правильно понял, то
#pragma comment( lib, "gdiplus.lib" )
или (для Visual Studio) project->properties->linker->input->additional dependencies: gdiplus.lib

Автор: IIGGOORR 26.4.2007, 19:53
Спасибо за ответ. Не помогло, ошибки следующие:

Код

void CSecondDlg::OnBnClickedOk()
{
    // TODO: Add your control notification handler code here
    Bitmap::Bitmap( m_initial_path, FALSE ) *pBitmap = new Bitmap::Bitmap();

    OnOK();
}


Error    1    error C2653: 'Bitmap' : is not a class or namespace name
Error    2    error C2065: 'pBitmap' : undeclared identifier
Error    3    error C3861: 'Bitmap': identifier not found
Error    4    error C2061: syntax error : identifier '{ctor}'

Автор: Earnest 26.4.2007, 20:21
Очевидно, компилятор не находит объявлений. Т.е. не подключен соответствующий хедер. Какой, сказать не могу, т.к. GDI+ не использую, но, если не найдешь в документации, можно, на худой конец, файловым поиском найти, где это все определяется. И еще, обрати внимание на пространство имен, возможно просто некорректно его указываешь.

Автор: IIGGOORR 26.4.2007, 20:52
Earnest спасибо за советы.

Цитата

Очевидно, компилятор не находит объявлений. Т.е. не подключен соответствующий хедер.


В том то и дело, когда подключаю соответствующие хедеры, компилятор выдаёт ошибку в каждой строчке этого хедера.

Цитата

И еще, обрати внимание на пространство имен, возможно просто некорректно его указываешь.


А что значит некорректно указывать пространство времён и где оно вообще указывается?

Благодарен за помощь.

Автор: Earnest 26.4.2007, 21:16
Цитата(IIGGOORR @  26.4.2007,  21:52 Найти цитируемый пост)
В том то и дело, когда подключаю соответствующие хедеры, компилятор выдаёт ошибку в каждой строчке этого хедера.

Какой хедер и какие ошибки?

Лучше всего, конечно, найти пример использования GDI+ (причем любого) и списать слова. Может, там какой-то порядок подключаемых хедоров нужен.

Цитата(IIGGOORR @  26.4.2007,  21:52 Найти цитируемый пост)
А что значит некорректно указывать пространство времён и где оно вообще указывается?

Ну например, у тебя (т.е. в стандартном хедере), есть такое объявление:
Код

namespace XXX
{
   ...

   class YYY { ... };
}


Ты подключаешь это хедер и пытаешься использовать символ YYY, на что компилятор ругается, т.к. ты должен писать XXX::YYY.

Кстати, твой код:
Код

   Bitmap::Bitmap( m_initial_path, FALSE ) *pBitmap = new Bitmap::Bitmap();
Выглядит совершенно безумно: не только у компилятора, у меня тоже крыша едет.
Но, поскольку я умнее компилятора smile, то могу предположить, что ты имел в виду следующее:
Код

   Bitmap* pBitmap = new Bitmap (m_initial_path, FALSE ); 


Только нужно писать не просто Bitmap, XXX::Bitmap, где XXX - то пространство имен, где класс Bitmap объявлен.

И наконец: что-то про GDI+ было на форуме. Поищи, может найдешь примеры. И книжку какую-нибудь про С++ прочитай, азы хотя бы...

Автор: Greeen 27.4.2007, 09:12
Вот тебе листинг файлега, подключаешь его инклудом и юзай GDI+ без проблем
Код

#ifndef _GDIPLUSH_H_INCLUDED_
#define _GDIPLUSH_H_INCLUDED_

// 
// GDI+ helper file v1.0
// 
// Written by Zoltan Csizmadia (zoltan_csizmadia@yahoo.com)
// 

// GDIPLUS_NO_AUTO_INIT:
// GDI+ won't be initialized at program startup, 
// you have to create GdiPlus::GdiPlusInitialize object to 
// initialize GDI+ ( GDI+ will be uninitialized, when destructor
// is called.
//#define GDIPLUS_NO_AUTO_INIT

// GDIPLUS_USE_GDIPLUS_MEM:
// GdipAlloc and GdipFree is used for memory operations
// In this case _Crt functions cannot be used to detect 
// memory leaks
//#define GDIPLUS_USE_GDIPLUS_MEM

// GDIPLUS_NO_AUTO_NAMESPACE:
// Gdiplus namespace wont' be defined as a used namespace
// In this case you have to use Gdiplus:: prefix
//#define GDIPLUS_NO_AUTO_NAMESPACE

#ifdef _GDIPLUS_H
#error Gdiplus.h is already included. You have to include this file instead.
#endif

// Fix for STL iterator problem
#define iterator _iterator
#define list _list
#define map _map

#define _GDIPLUSBASE_H

namespace Gdiplus
{
    namespace DllExports
    {
        #include "GdiplusMem.h"
    };

    class GdiplusBase
    {
    public:
#ifdef _DEBUG
        static void* __cdecl GdiplusAlloc( size_t nSize, LPCSTR szFileName, int nLine )
        {
#ifdef GDIPLUS_USE_GDIPLUS_MEM
            UNREFERENCED_PARAMETER(szFileName);
            UNREFERENCED_PARAMETER(nLine);
            return DllExports::GdipAlloc(nSize); 
#else
            return ::operator new( nSize, szFileName, nLine );
#endif
        }

        static void GdiplusFree( void* pVoid, LPCSTR szFileName, int nLine )
        {
#ifdef GDIPLUS_USE_GDIPLUS_MEM
            UNREFERENCED_PARAMETER(szFileName);
            UNREFERENCED_PARAMETER(nLine);
            DllExports::GdipFree(pVoid); 
#else
            ::operator delete( pVoid, szFileName, nLine );
#endif
        }
        
        void* (operator new)(size_t nSize) 
        { 
            return GdiplusAlloc( nSize, __FILE__, __LINE__ );
        }
        void* (operator new[])(size_t nSize) 
        { 
            return GdiplusAlloc( nSize, __FILE__, __LINE__ );
        }
        void * (operator new)(size_t nSize, LPCSTR lpszFileName, int nLine) 
        { 
            return GdiplusAlloc( nSize, lpszFileName, nLine );
        }
        void (operator delete)(void* pVoid) 
        { 
            GdiplusFree( pVoid, __FILE__, __LINE__ );
        }
        void (operator delete[])(void* pVoid) 
        { 
            GdiplusFree( pVoid, __FILE__, __LINE__ );
        }
        void operator delete(void* pVoid, LPCSTR lpszFileName, int nLine) 
        { 
            GdiplusFree( pVoid, lpszFileName, nLine);
        }
#else // _DEBUG

        static void* __cdecl GdiplusAlloc( size_t nSize )
        {
#ifdef GDIPLUS_USE_GDIPLUS_MEM
            return DllExports::GdipAlloc(nSize); 
#else
            return ::operator new(nSize);
#endif
        }

        static void GdiplusFree( void* pVoid )
        {
#ifdef GDIPLUS_USE_GDIPLUS_MEM
            DllExports::GdipFree(pVoid); 
#else
            ::operator delete( pVoid );
#endif
        }

        void* (operator new)(size_t nSize) 
        { 
            return GdiplusAlloc( nSize );
        }
        void* (operator new[])(size_t nSize) 
        { 
            return GdiplusAlloc( nSize );
        }
        void (operator delete)(void* pVoid) 
        { 
            GdiplusFree( pVoid );
        }
        void (operator delete[])(void* pVoid) 
        { 
            GdiplusFree( pVoid );
        }
#endif
    };
};

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

#include <Gdiplus.h> 

#ifdef _DEBUG
#undef new
#endif

#pragma comment (lib, "Gdiplus.lib")

namespace Gdiplus
{
    class GdiPlusInitialize
    {
    public:
        GdiPlusInitialize()
        {
            GdiplusStartupInput Startup;
            GdiplusStartup( &m_Token, &Startup, NULL );
        }

        ~GdiPlusInitialize()
        {
            GdiplusShutdown( m_Token );
        }

    protected:
        ULONG_PTR m_Token;
#ifndef GDIPLUS_NO_AUTO_INIT
        static GdiPlusInitialize m_Initialize;
#endif
    };
#ifndef GDIPLUS_NO_AUTO_INIT
    GdiPlusInitialize GdiPlusInitialize::m_Initialize;
#endif
}

#ifndef GDIPLUS_NO_AUTO_NAMESPACE
using namespace Gdiplus;
#endif

// STL problem
#undef iterator
#undef list
#undef map

#endif

Автор: IIGGOORR 27.4.2007, 14:17
Спасибо за дельные советы.

2 Earnest 

коструктор:
 
Код

const WCHAR *filename;
    BOOL useIcm;

    filename = m_initial_path;
    useIcm = TRUE;

    Bitmap::Bitmap( *filename, useIcm ) *pBitmap = new Bitmap::Bitmap();


взял из MSDN.
Цитата

Какой хедер и какие ошибки?

Хедер: Gdiplusheaders.h, ошибки исчезли с подключенным файлом от Greeen'a


2 Greeen

Ваш файл подключил. Первые две ошибки исчезли, а именно:
Цитата

Error    1    error C2653: 'Bitmap' : is not a class or namespace name
Error    3    error C3861: 'Bitmap': identifier not found


т. е., я как понимаю, библиотека всё таки подключиласьsmile, но остались две ошибки:

Цитата

Error    1    error C2065: 'pBitmap' : undeclared identifier
Error    2    error C2061: syntax error : identifier '{ctor}'


Видимо я всё-таки неправильно делаю коструктор, хотя в  MSDN"е он присутствует, либо в опциях линковщика, что-то не то ставлю:

Цитата

Runtime library                            Multi-threaded (/MT)
Enable Incremental Linking         Yes (/INCREMENTAL)
Link Library Dependencies          Yes
Use Library Dependeny Inputs   Yes


Какие опции вообще влияют на подключение библиотек?

Заранее спасибо за ответы.

Автор: Greeen 27.4.2007, 14:54
Опции линковщика и компилятора тут не при чем. Давай приводи свой код потому, что ругается на то, что нет объявления pBitmap. Может ты просто забыл чего то. Короче код в студию.

Только что заметил. Вот этот твой код
Код
Bitmap::Bitmap( *filename, useIcm ) *pBitmap = new Bitmap::Bitmap();
мягко говоря никуда не годится. Поэтому, соглашаясь с Earnest (и не соглашаясь с компилятором  smile ), предполагаю что тебе нужно следующее:
Код

Bitmap* pBitmap = new Bitmap(m_initial_path, FALSE);

Автор: IIGGOORR 27.4.2007, 20:51
Greeen, Earnest, Огромное спасибо за вашу помощь. Действительно мой конструктор не работал, ваш - работает, но честное слово 
Код

Bitmap::Bitmap( *filename, useIcm ) *pBitmap = new Bitmap::Bitmap();

не я придумал, как в MSDN"е написано, так и писал.
Цитата

Bitmap::Bitmap Constructor

--------------------------------------------------------------------------------

Creates a Bitmap object based on an image file.

Syntax

Bitmap(          const WCHAR *filename,
    BOOL useIcm
);
Parameters

filename
[in] Pointer to a null-terminated string that specifies the path name of the image file. The graphics file formats supported by GDI+ are BMP, GIF, JPEG, PNG, TIFF, Exif, WMF, and EMF. 
useIcm
[in] Optional. Boolean value that specifies whether the new Bitmap object applies color correction according to color management information that is embedded in the image file. Embedded information can include International Color Consortium (ICC) profiles, gamma values, and chromaticity information. TRUE specifies that color correction is enabled, and FALSE specifies that color correction is not enabled. The default value is FALSE. 
Return Value

No return value.


Автор: Earnest 28.4.2007, 19:51
Цитата(IIGGOORR @  27.4.2007,  21:51 Найти цитируемый пост)
не я придумал, как в MSDN"е написано, так и писал.

Из приведенной цитаты вовсе не следует такая запись как ты сочинил, а следует ровно то, что мы с грином написали.
Я уже вроде говорили и еще раз повторю: изучай матчасть, т.е. C++. В документации предполагается, что ты знаешь, как надо вызывать конструктор.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)