none
mfc 에서 gdi+로gif파일달라그에서보이기할때 사용시 initinstance 에러나는이유?... RRS feed

  • 질문

  • #include "stdafx.h"
    #include "지프차연습55.h"
    #include "지프차연습55Dlg.h"
    #include "ImageEx.h"

    #include "gdiplus.h"



    #ifdef _DEBUG
    #define new DEBUG_NEW
    #endif


    // C지프차연습55App

    BEGIN_MESSAGE_MAP(C지프차연습55App, CWinApp)
    ON_COMMAND(ID_HELP, &CWinApp::OnHelp)
    END_MESSAGE_MAP()


    // C지프차연습55App 생성

    C지프차연습55App::C지프차연습55App()
    {
    // 다시 시작 관리자 지원
    m_dwRestartManagerSupportFlags = AFX_RESTART_MANAGER_SUPPORT_RESTART;

    // TODO: 여기에 생성 코드를 추가합니다.
    // InitInstance에 모든 중요한 초기화 작업을 배치합니다.
    }


    // 유일한 C지프차연습55App 개체입니다.

    C지프차연습55App theApp;


    // C지프차연습55App 초기화

    BOOL C지프차연습55App::InitInstance()
    {
    // 응용 프로그램 매니페스트가 ComCtl32.dll 버전 6 이상을 사용하여 비주얼 스타일을
    // 사용하도록 지정하는 경우, Windows XP 상에서 반드시 InitCommonControlsEx()가 필요합니다.
    // InitCommonControlsEx()를 사용하지 않으면 창을 만들 수 없습니다.
    INITCOMMONCONTROLSEX InitCtrls;
    InitCtrls.dwSize = sizeof(InitCtrls);
    // 응용 프로그램에서 사용할 모든 공용 컨트롤 클래스를 포함하도록
    // 이 항목을 설정하십시오.
    InitCtrls.dwICC = ICC_WIN95_CLASSES;
    InitCommonControlsEx(&InitCtrls);

    CWinApp::InitInstance();


    AfxEnableControlContainer();

    // 대화 상자에 셸 트리 뷰 또는
    // 셸 목록 뷰 컨트롤이 포함되어 있는 경우 셸 관리자를 만듭니다.
    CShellManager *pShellManager = new CShellManager;

    // 표준 초기화
    // 이들 기능을 사용하지 않고 최종 실행 파일의 크기를 줄이려면
    // 아래에서 필요 없는 특정 초기화
    // 루틴을 제거해야 합니다.
    // 해당 설정이 저장된 레지스트리 키를 변경하십시오.
    // TODO: 이 문자열을 회사 또는 조직의 이름과 같은
    // 적절한 내용으로 수정해야 합니다.
    SetRegistryKey(_T("로컬 응용 프로그램 마법사에서 생성된 응용 프로그램"));





    // START GDI+ SUB SYSTEM
     GdiplusStartup(&m_gdiplusToken, &m_gdiplusStartupInput, NULL);



    C지프차연습55Dlg dlg;
    m_pMainWnd = &dlg;
    INT_PTR nResponse = dlg.DoModal();
    if (nResponse == IDOK)
    {
    // TODO: 여기에 [확인]을 클릭하여 대화 상자가 없어질 때 처리할
    //  코드를 배치합니다.
    }
    else if (nResponse == IDCANCEL)
    {
    // TODO: 여기에 [취소]를 클릭하여 대화 상자가 없어질 때 처리할
    //  코드를 배치합니다.
    }

    // 위에서 만든 셸 관리자를 삭제합니다.
    if (pShellManager != NULL)
    {
    delete pShellManager;
    }

    // 대화 상자가 닫혔으므로 응용 프로그램의 메시지 펌프를 시작하지 않고  응용 프로그램을 끝낼 수 있도록 FALSE를
    // 반환합니다.
    return FALSE;
    }

    ////////////////////////////////////////////////

    int C지프차연습55App::ExitInstance() 
    {
    // Shutdown GDI+ subystem
    GdiplusShutdown(m_gdiplusToken);

    return CWinApp::ExitInstance();
    }


    ////////////////////////////////////

     

    // C지프차연습55App:
    // 이 클래스의 구현에 대해서는 지프차연습55.cpp을 참조하십시오.
    //

    class C지프차연습55App : public CWinApp
    {
    public:
    C지프차연습55App();

      // GDI+
       GdiplusStartupInput m_gdiplusStartupInput;
       ULONG_PTR m_gdiplusToken;




    // 재정의입니다.
    public:
    virtual BOOL InitInstance();

    virtual int ExitInstance();
    // virtual int ExitInstance();


    // 구현입니다.

    DECLARE_MESSAGE_MAP()
    };

    extern C지프차연습55App theApp;

    /////////////////////////////////////////////

      // 지프차연습55Dlg.h : 헤더 파일
    //

    #pragma once
    //#include "ImageEx.h"

    // C지프차연습55Dlg 대화 상자
    class C지프차연습55Dlg : public CDialogEx
    {
    // 생성입니다.
    public:
    C지프차연습55Dlg(CWnd* pParent = NULL); // 표준 생성자입니다.
    ~C지프차연습55Dlg();

    // class ImageEx  ;
    // GDI+
    // class ImageEx* m_image;

    // GDI+
    ImageEx* m_image;

    // Image* m_image55;




    // 대화 상자 데이터입니다.
    enum { IDD = IDD_MY55_DIALOG };

    protected:
    virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 지원입니다.


    // 구현입니다.
    protected:
    HICON m_hIcon;

    // 생성된 메시지 맵 함수
    virtual BOOL OnInitDialog();
    afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
    afx_msg void OnPaint();
    afx_msg HCURSOR OnQueryDragIcon();
    DECLARE_MESSAGE_MAP()
    };

    //////////////////////////////////

    //

    #include "stdafx.h"
    #include "지프차연습55.h"
    #include "지프차연습55Dlg.h"
    #include "afxdialogex.h"
    #include "ImageEx.h"




    // 응용 프로그램 정보에 사용되는 CAboutDlg 대화 상자입니다.

    class CAboutDlg : public CDialogEx
    {
    public:
    CAboutDlg();

    // 대화 상자 데이터입니다.
    enum { IDD = IDD_ABOUTBOX };

    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 지원입니다.

    // 구현입니다.
    protected:
    DECLARE_MESSAGE_MAP()
    };

    CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
    {
    }

    void CAboutDlg::DoDataExchange(CDataExchange* pDX)
    {
    CDialogEx::DoDataExchange(pDX);
    }

    BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
    END_MESSAGE_MAP()


    // C지프차연습55Dlg 대화 상자




    C지프차연습55Dlg::C지프차연습55Dlg(CWnd* pParent /*=NULL*/)
    : CDialogEx(C지프차연습55Dlg::IDD, pParent)
    {
    ///처음 시작 만들기 다이알로긔.. 기본 설정하기...

    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);



    // GDI+
    m_image = NULL;





    }

    void C지프차연습55Dlg::DoDataExchange(CDataExchange* pDX)
    {
    CDialogEx::DoDataExchange(pDX);
    }

    /*

    C지프차연습55Dlg::~CTestDlgDlg()
    {
    // GDI+
    delete m_image;

    //delete m_image2;

    }

    &*/

    BEGIN_MESSAGE_MAP(C지프차연습55Dlg, CDialogEx)
    ON_WM_SYSCOMMAND()
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    END_MESSAGE_MAP()


    // C지프차연습55Dlg 메시지 처리기

    BOOL C지프차연습55Dlg::OnInitDialog()
    {
    CDialogEx::OnInitDialog();

    // 시스템 메뉴에 "정보..." 메뉴 항목을 추가합니다.

    // IDM_ABOUTBOX는 시스템 명령 범위에 있어야 합니다.
    ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    ASSERT(IDM_ABOUTBOX < 0xF000);

    CMenu* pSysMenu = GetSystemMenu(FALSE);
    if (pSysMenu != NULL)
    {
    BOOL bNameValid;
    CString strAboutMenu;
    bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
    ASSERT(bNameValid);
    if (!strAboutMenu.IsEmpty())
    {
    pSysMenu->AppendMenu(MF_SEPARATOR);
    pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
    }
    }

    ////////////////////////////////////

    // // GDI+/////////// ImageEx* m_image;
    // m_image=   ImageEx( L"GIF", L"IDR_GIF1" );
    //ImageEx*
    // m_image   = new ImageEx((LPCTSTR)"GIF", (LPCTSTR)"HEARTS" );
    m_image   = new ImageEx(  "GIF",  "HEARTS" );
    // Image* m_image55;
    //Image* m_image55 =   Image::FromFile(L"hearts.gif"); 
    //ImageEx( L"GIF", L"IDR_GIF1" );
    //m_image2 = new ImageEx( "GIF", "IDR_GIF2" );

    CRect rc;
    GetClientRect(rc);

    int cx = (rc.Width() - m_image->GetWidth()) / 2;


    m_image->InitAnimation(m_hWnd, CPoint(cx,10));
    // m_image2->InitAnimation(m_hWnd, CPoint(cx,33));
    // Set the icon for this dialog.  The framework does this automatically
    //  when the application's main window is not a dialog







    // 이 대화 상자의 아이콘을 설정합니다. 응용 프로그램의 주 창이 대화 상자가 아닐 경우에는
    //  프레임워크가 이 작업을 자동으로 수행합니다.
    SetIcon(m_hIcon, TRUE); // 큰 아이콘을 설정합니다.
    SetIcon(m_hIcon, FALSE); // 작은 아이콘을 설정합니다.

    ShowWindow(SW_MAXIMIZE);

    // TODO: 여기에 추가 초기화 작업을 추가합니다.

    return TRUE;  // 포커스를 컨트롤에 설정하지 않으면 TRUE를 반환합니다.
    }

    void C지프차연습55Dlg::OnSysCommand(UINT nID, LPARAM lParam)
    {
    if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    {
    CAboutDlg dlgAbout;
    dlgAbout.DoModal();
    }
    else
    {
    CDialogEx::OnSysCommand(nID, lParam);
    }
    }

    // 대화 상자에 최소화 단추를 추가할 경우 아이콘을 그리려면
    //  아래 코드가 필요합니다. 문서/뷰 모델을 사용하는 MFC 응용 프로그램의 경우에는
    //  프레임워크에서 이 작업을 자동으로 수행합니다.

    void C지프차연습55Dlg::OnPaint()
    {
    if (IsIconic())
    {
    CPaintDC dc(this); // 그리기를 위한 디바이스 컨텍스트입니다.

    SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

    // 클라이언트 사각형에서 아이콘을 가운데에 맞춥니다.
    int cxIcon = GetSystemMetrics(SM_CXICON);
    int cyIcon = GetSystemMetrics(SM_CYICON);
    CRect rect;
    GetClientRect(&rect);
    int x = (rect.Width() - cxIcon + 1) / 2;
    int y = (rect.Height() - cyIcon + 1) / 2;

    // 아이콘을 그립니다.
    dc.DrawIcon(x, y, m_hIcon);
    }
    else
    {
    CDialogEx::OnPaint();
    }
    }

    // 사용자가 최소화된 창을 끄는 동안에 커서가 표시되도록 시스템에서
    //  이 함수를 호출합니다.
    HCURSOR C지프차연습55Dlg::OnQueryDragIcon()
    {
    return static_cast<HCURSOR>(m_hIcon);
    }

    //////////////////

    // GDIPlusHelper.h: interface for the CGDIPlusHelper class.
    //
    //////////////////////////////////////////////////////////////////////

    #if !defined(AFX_GDIPLUSHELPER_H__BD5F6266_5686_43E2_B146_5EA1217A56FE__INCLUDED_)
    #define AFX_GDIPLUSHELPER_H__BD5F6266_5686_43E2_B146_5EA1217A56FE__INCLUDED_

    #if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000


    class ImageEx : public Image
    {
    public:
    ImageEx(IN LPCTSTR  sResourceType, IN LPCTSTR  sResource);
    ImageEx(const WCHAR* filename, BOOL useEmbeddedColorManagement = FALSE);


    ~ImageEx();
    public:

    void Draw(CDC* pDC);
    CSize GetSize();

    bool IsAnimatedGIF() { return m_nFrameCount > 1; }
    void SetPause(bool bPause);
    bool IsPaused() { return m_bPause; }
    bool InitAnimation(HWND hWnd, CPoint pt);
    void Destroy();

    protected:

    bool TestForAnimatedGIF();
    void Initialize();
    bool DrawFrameGIF();

    IStream* m_pStream;

    bool LoadFromBuffer(BYTE* pBuff, int nSize);
    bool GetResource(LPCTSTR lpName, LPCTSTR lpType, void* pResource, int& nBufSize);
    bool Load(CString sResourceType, CString sResource);

    void ThreadAnimation();

    static UINT WINAPI _ThreadAnimationProc(LPVOID pParam);

    HANDLE m_hThread;
    HANDLE m_hPause;
    HANDLE m_hExitEvent;
    HINSTANCE m_hInst;
    HWND m_hWnd;
    UINT m_nFrameCount;
    UINT m_nFramePosition;
    bool m_bIsInitialized;
    bool m_bPause;
    PropertyItem* m_pPropertyItem;
    CPoint m_pt;
    };


    #endif // !defined(AFX_GDIPLUSHELPER_H__BD5F6266_5686_43E2_B146_5EA1217A56FE__INCLUDED_)

    // stdafx.h : 자주 사용하지만 자주 변경되지는 않는
    // 표준 시스템 포함 파일 및 프로젝트 관련 포함 파일이 
    // 들어 있는 포함 파일입니다.

    #pragma once

    #ifndef _SECURE_ATL
    #define _SECURE_ATL 1
    #endif

    #ifndef VC_EXTRALEAN
    #define VC_EXTRALEAN            // 거의 사용되지 않는 내용은 Windows 헤더에서 제외합니다.
    #endif

    #include "targetver.h"

    #define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS      // 일부 CString 생성자는 명시적으로 선언됩니다.

    // MFC의 공통 부분과 무시 가능한 경고 메시지에 대한 숨기기를 해제합니다.
    #define _AFX_ALL_WARNINGS

    #include <afxwin.h>         // MFC 핵심 및 표준 구성 요소입니다.
    #include <afxext.h>         // MFC 확장입니다.


    #include <afxdisp.h>        // MFC 자동화 클래스입니다.




    // SUPPORT FOR THE GDI+ SUBSYSTEM 지디아이 뿔뿔연결하기
    #pragma comment(lib,"gdiplus.lib")
    #include <gdiplus.h>
    using namespace Gdiplus;

    #include "ImageEx.h"





    #ifndef _AFX_NO_OLE_SUPPORT
    #include <afxdtctl.h>           // Internet Explorer 4 공용 컨트롤에 대한 MFC 지원입니다.
    #endif
    #ifndef _AFX_NO_AFXCMN_SUPPORT
    #include <afxcmn.h>             // Windows 공용 컨트롤에 대한 MFC 지원입니다.
    #endif // _AFX_NO_AFXCMN_SUPPORT

    #include <afxcontrolbars.h>     // MFC의 리본 및 컨트롤 막대 지원









    #ifdef _UNICODE
    #if defined _M_IX86
    #pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")
    #elif defined _M_X64
    #pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"")
    #else
    #pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
    #endif
    #endif

    /////////

    //

    #include "stdafx.h"
    #include "지프차연습55.h"
    #include "지프차연습55Dlg.h"
    #include "afxdialogex.h"
    #include "ImageEx.h"




    // 응용 프로그램 정보에 사용되는 CAboutDlg 대화 상자입니다.

    class CAboutDlg : public CDialogEx
    {
    public:
    CAboutDlg();

    // 대화 상자 데이터입니다.
    enum { IDD = IDD_ABOUTBOX };

    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 지원입니다.

    // 구현입니다.
    protected:
    DECLARE_MESSAGE_MAP()
    };

    CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
    {
    }

    void CAboutDlg::DoDataExchange(CDataExchange* pDX)
    {
    CDialogEx::DoDataExchange(pDX);
    }

    BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
    END_MESSAGE_MAP()


    // C지프차연습55Dlg 대화 상자




    C지프차연습55Dlg::C지프차연습55Dlg(CWnd* pParent /*=NULL*/)
    : CDialogEx(C지프차연습55Dlg::IDD, pParent)
    {
    ///처음 시작 만들기 다이알로긔.. 기본 설정하기...

    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);



    // GDI+
    m_image = NULL;





    }

    void C지프차연습55Dlg::DoDataExchange(CDataExchange* pDX)
    {
    CDialogEx::DoDataExchange(pDX);
    }

    /*

    C지프차연습55Dlg::~CTestDlgDlg()
    {
    // GDI+
    delete m_image;

    //delete m_image2;

    }

    &*/

    BEGIN_MESSAGE_MAP(C지프차연습55Dlg, CDialogEx)
    ON_WM_SYSCOMMAND()
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    END_MESSAGE_MAP()


    // C지프차연습55Dlg 메시지 처리기

    BOOL C지프차연습55Dlg::OnInitDialog()
    {
    CDialogEx::OnInitDialog();

    // 시스템 메뉴에 "정보..." 메뉴 항목을 추가합니다.

    // IDM_ABOUTBOX는 시스템 명령 범위에 있어야 합니다.
    ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    ASSERT(IDM_ABOUTBOX < 0xF000);

    CMenu* pSysMenu = GetSystemMenu(FALSE);
    if (pSysMenu != NULL)
    {
    BOOL bNameValid;
    CString strAboutMenu;
    bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
    ASSERT(bNameValid);
    if (!strAboutMenu.IsEmpty())
    {
    pSysMenu->AppendMenu(MF_SEPARATOR);
    pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
    }
    }

    ////////////////////////////////////

    // // GDI+/////////// ImageEx* m_image;
    // m_image=   ImageEx( L"GIF", L"IDR_GIF1" );
    //ImageEx*
    // m_image   = new ImageEx((LPCTSTR)"GIF", (LPCTSTR)"HEARTS" );
    m_image   = new ImageEx(  "GIF",  "HEARTS" );
    // Image* m_image55;
    //Image* m_image55 =   Image::FromFile(L"hearts.gif"); 
    //ImageEx( L"GIF", L"IDR_GIF1" );
    //m_image2 = new ImageEx( "GIF", "IDR_GIF2" );

    CRect rc;
    GetClientRect(rc);

    int cx = (rc.Width() - m_image->GetWidth()) / 2;


    m_image->InitAnimation(m_hWnd, CPoint(cx,10));
    // m_image2->InitAnimation(m_hWnd, CPoint(cx,33));
    // Set the icon for this dialog.  The framework does this automatically
    //  when the application's main window is not a dialog







    // 이 대화 상자의 아이콘을 설정합니다. 응용 프로그램의 주 창이 대화 상자가 아닐 경우에는
    //  프레임워크가 이 작업을 자동으로 수행합니다.
    SetIcon(m_hIcon, TRUE); // 큰 아이콘을 설정합니다.
    SetIcon(m_hIcon, FALSE); // 작은 아이콘을 설정합니다.

    ShowWindow(SW_MAXIMIZE);

    // TODO: 여기에 추가 초기화 작업을 추가합니다.

    return TRUE;  // 포커스를 컨트롤에 설정하지 않으면 TRUE를 반환합니다.
    }

    void C지프차연습55Dlg::OnSysCommand(UINT nID, LPARAM lParam)
    {
    if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    {
    CAboutDlg dlgAbout;
    dlgAbout.DoModal();
    }
    else
    {
    CDialogEx::OnSysCommand(nID, lParam);
    }
    }

    // 대화 상자에 최소화 단추를 추가할 경우 아이콘을 그리려면
    //  아래 코드가 필요합니다. 문서/뷰 모델을 사용하는 MFC 응용 프로그램의 경우에는
    //  프레임워크에서 이 작업을 자동으로 수행합니다.

    void C지프차연습55Dlg::OnPaint()
    {
    if (IsIconic())
    {
    CPaintDC dc(this); // 그리기를 위한 디바이스 컨텍스트입니다.

    SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

    // 클라이언트 사각형에서 아이콘을 가운데에 맞춥니다.
    int cxIcon = GetSystemMetrics(SM_CXICON);
    int cyIcon = GetSystemMetrics(SM_CYICON);
    CRect rect;
    GetClientRect(&rect);
    int x = (rect.Width() - cxIcon + 1) / 2;
    int y = (rect.Height() - cyIcon + 1) / 2;

    // 아이콘을 그립니다.
    dc.DrawIcon(x, y, m_hIcon);
    }
    else
    {
    CDialogEx::OnPaint();
    }
    }

    // 사용자가 최소화된 창을 끄는 동안에 커서가 표시되도록 시스템에서
    //  이 함수를 호출합니다.
    HCURSOR C지프차연습55Dlg::OnQueryDragIcon()
    {
    return static_cast<HCURSOR>(m_hIcon);
    }

    //////////////

    기본디렉에 gdi 라이브러리를 넣고 했는데도 에러가 납니다..

     코드를 생성하고 있습니다...
    1>지프차연습55.obj : error LNK2019: "public: virtual __thiscall C지프차연습55Dlg::~C지프차연습55Dlg(void)" (??1C지프차연습55Dlg@@UAE@XZ) 외부 기호(참조 위치: "public: virtual int __thiscall C지프차연습55App::InitInstance(void)" (?InitInstance@C지프차연습55App@@UAEHXZ) 함수)에서 확인하지 못했습니다.
    1>지프차연습55Dlg.obj : error LNK2001: "public: virtual __thiscall C지프차연습55Dlg::~C지프차연습55Dlg(void)" (??1C지프차연습55Dlg@@UAE@XZ) 외부 기호를 확인할 수 없습니다.
    1>C:\지프차연습프로그램만들기\지프차연습55\Debug\지프차연습55.exe : fatal error LNK1120: 1개의 확인할 수 없는 외부 참조입니다.
    1>
    1>빌드하지 못했습니다.
    1>
    1>경과 시간: 00:00:06.82
    ========== 모두 다시 빌드: 성공 0, 실패 1, 생략 0 ==========

    바꾼것이 없는데 에러가 나는이유는 공개된 gif 를 다아일러그에 보여주는것을 사용했는데..

    gif 파일은 리소스에 추가하고...

    ㅇ에라가 납니다..

    2017년 7월 20일 목요일 오전 11:48

답변