c++ - 从资源加载图像不起作用(C++ Dll)

标签 c++ dll resources icons logitech

我正在为 MusicBee 编写一个罗技插件。 我遇到的唯一问题是无法加载艺术作品的图像、播放和暂停图像。 我已经测试了很多不同的方式来使用 VS2012 资源文件中的图像。但它们都不起作用。我必须在 dll 文件中加载图像,并且图像必须是 HICON 或 HBITMAP。 以下是我的项目的完整类(class)。完整的项目可以在 Bitbucket 找到.

//This is the code I have used for loading an image.
    playIcon = LoadIcon (GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_ICON1));
playIconHandle = m_lcd.AddIcon(playIcon, 16, 16);
m_lcd.SetOrigin(playIconHandle, 2, 2);



 //-----------------------------------------------------------------
    // Logitech File
    // C++ Source - Logitech.cpp - version 2012 v1.0
    //-----------------------------------------------------------------

    //-----------------------------------------------------------------
    // Include Files
    //-----------------------------------------------------------------
    #include "stdafx.h"
    #include "Logitech.h"

    //-----------------------------------------------------------------
    // Logitech methods
    //-----------------------------------------------------------------

    //This LogitechObject is a instance of the Logitech class for using in the thread
    Logitech * Logitech::LogitechObject;

    Logitech::Logitech():   stopthread(false), firstTime(true), position(0), duration(0)
    {
        LogitechObject = this;
    }

    Logitech::~Logitech()
    {
        stopthread = true;
        this->state = StatePlay::Undefined;
        timerThread.detach();
    }

    bool Logitech::getFirstTime()
    {
        return firstTime;
    }

    //Initialise Logitech LCD
    BOOL Logitech::OnInitDialog()
    {
        HRESULT hRes = m_lcd.Initialize(_T("MusicBee"), LG_DUAL_MODE, FALSE, TRUE);

        if (hRes != S_OK)
        {
            return FALSE;
        }

        m_lcd.SetAsForeground(true);

        //Create home screen Logitech Color LCD
        if(m_lcd.IsDeviceAvailable(LG_COLOR))
        {
            m_lcd.ModifyDisplay(LG_COLOR);
            m_lcd.SetBackground(RGB(245,245,245));
            logo = m_lcd.AddText(LG_STATIC_TEXT, LG_BIG, DT_CENTER, LGLCD_QVGA_BMP_WIDTH);
            m_lcd.SetOrigin(logo, 0, 50);
            m_lcd.SetText(logo, _T("MusicBee"));
            m_lcd.SetTextFontColor(logo, RGB(0,0,0));
            m_lcd.Update();
        }

        //Create home screen Logitech Monochrome LCD
        else if(m_lcd.IsDeviceAvailable(LG_MONOCHROME))
        {
            m_lcd.ModifyDisplay(LG_MONOCHROME);
            logo = m_lcd.AddText(LG_STATIC_TEXT, LG_BIG, DT_CENTER, LGLCD_BW_BMP_WIDTH);
            m_lcd.SetOrigin(logo, 0, 5);
            m_lcd.SetText(logo, _T("MusicBee"));
            m_lcd.Update();
        }

        //Start thread
        timerThread = thread(&Logitech::startThread);

        return TRUE;  // return TRUE  unless you set the focus to a control
    }

    //Create playing screen for Logitech Monochrome LCD
    VOID Logitech::createMonochrome()
    {
        m_lcd.RemovePage(0);
        m_lcd.AddNewPage();
        m_lcd.ShowPage(0);

        if (logo != 0)
        {
            delete logo;
            logo = 0;
        }

        artist = m_lcd.AddText(LG_SCROLLING_TEXT, LG_MEDIUM, DT_CENTER, LGLCD_BW_BMP_WIDTH);
        m_lcd.SetOrigin(artist, 0, 0);

        title = m_lcd.AddText(LG_SCROLLING_TEXT, LG_MEDIUM, DT_CENTER, LGLCD_BW_BMP_WIDTH);
        m_lcd.SetOrigin(title, 0, 13);

        progressbar = m_lcd.AddProgressBar(LG_FILLED);
        m_lcd.SetProgressBarSize(progressbar, 136, 5);
        m_lcd.SetOrigin(progressbar, 12, 38);

        time = m_lcd.AddText(LG_STATIC_TEXT, LG_SMALL, DT_LEFT, 80);
        m_lcd.SetOrigin(time, 12, 29);

        time1 = m_lcd.AddText(LG_STATIC_TEXT, LG_SMALL, DT_LEFT, 80);
        m_lcd.SetOrigin(time1, 125, 29);

        playIcon = static_cast<HICON>(LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_PNG2), IMAGE_BITMAP, 16, 16, LR_MONOCHROME));
        playIconHandle = m_lcd.AddIcon(playIcon, 16, 16);
        m_lcd.SetOrigin(playIconHandle, 2, 29);

        firstTime = false;
        changeArtistTitle(this->artistString, this->albumString, this->titleString, this->duration, this->position);
    }

    //Create playing screen for Logitech Color LCD
    VOID Logitech::createColor()
    {
        m_lcd.RemovePage(0);
        m_lcd.AddNewPage();
        m_lcd.ShowPage(0);

        if (logo != 0)
        {
            delete logo;
            logo = 0;
        }

        //background.LoadFromResource(NULL, AfxGetInstanceHandle(), IDB_G19BACKGROUND, _T("PNG"));
        //HBITMAP bmpBkg_ = background.GetHBITMAP();
        //m_lcd.SetBackground(bmpBkg_);

        m_lcd.SetBackground(RGB(184,220,240));

        artist = m_lcd.AddText(LG_SCROLLING_TEXT, LG_MEDIUM, DT_CENTER, LGLCD_QVGA_BMP_WIDTH);
        m_lcd.SetOrigin(artist, 5, 5);
        m_lcd.SetTextFontColor(artist, RGB(0,0,0));

        album = m_lcd.AddText(LG_SCROLLING_TEXT, LG_MEDIUM, DT_CENTER, LGLCD_QVGA_BMP_WIDTH);
        m_lcd.SetOrigin(album, 5, 30);
        m_lcd.SetTextFontColor(album, RGB(0,0,0));

        title = m_lcd.AddText(LG_SCROLLING_TEXT, LG_MEDIUM, DT_CENTER, LGLCD_QVGA_BMP_WIDTH);
        m_lcd.SetOrigin(title, 5, 55);
        m_lcd.SetTextFontColor(title, RGB(0,0,0));

        time = m_lcd.AddText(LG_STATIC_TEXT, LG_SMALL, DT_LEFT, 80);
        m_lcd.SetOrigin(time, 5, 80);
        m_lcd.SetTextFontColor(time, RGB(0,0,0));

        time1 = m_lcd.AddText(LG_STATIC_TEXT, LG_SMALL, DT_LEFT, 40);
        m_lcd.SetOrigin(time1, 275, 80);
        m_lcd.SetTextFontColor(time1, RGB(0,0,0));

        progressbar = m_lcd.AddProgressBar(LG_FILLED);//320×240 pixel color screen
        m_lcd.SetProgressBarSize(progressbar, 310, 20);
        m_lcd.SetProgressBarColors(progressbar, RGB(25,71,94),NULL);
        m_lcd.SetOrigin(progressbar, 5, 100);

        /*playIcon = static_cast<HICON>(LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_PNG1), IMAGE_ICON, 16, 16, LR_COLOR));
        playIconHandle = m_lcd.AddIcon(playIcon, 16, 16);
        m_lcd.SetOrigin(playIconHandle, 5, 29);*/

        firstTime = false;
        changeArtistTitle(this->artistString, this->albumString, this->titleString, this->duration, this->position);
    }

    void Logitech::startThread()
    {
        while(!LogitechObject->stopthread)
        {
            this_thread::sleep_for( chrono::milliseconds(500) );

            if(!LogitechObject->stopthread && LogitechObject->progressbar != NULL)
            {
                //Update progressbar and position time on the screen after 1 second of music.
                if(LogitechObject->state == StatePlay::Playing)
                {
                    this_thread::sleep_for( chrono::milliseconds(500) );
                    LogitechObject->position++;
                    float progresstime = ((float)LogitechObject->position / (float)LogitechObject->duration)*100;
                    LogitechObject->m_lcd.SetProgressBarPosition(LogitechObject->progressbar, static_cast<FLOAT>(progresstime));
                    LogitechObject->m_lcd.SetText(LogitechObject->time, LogitechObject->getTimeString(LogitechObject->position).c_str());
                }

                //If music stopped then the progressbar and time must stop immediately
                else if(LogitechObject->state == StatePlay::Stopped)
                {
                    LogitechObject->position = 0;
                    LogitechObject->m_lcd.SetProgressBarPosition(LogitechObject->progressbar, 0);
                    LogitechObject->m_lcd.SetText(LogitechObject->time, LogitechObject->getTimeString(LogitechObject->position).c_str());
                }

                LogitechObject->m_lcd.Update();
            }
        }
    }

    void Logitech::changeArtistTitle(wstring artistStr, wstring albumStr, wstring titleStr, int duration, int position)
    {
        this->artistString = artistStr;
        this->albumString = albumStr;
        this->titleString = titleStr;
        this->durationString = getTimeString(duration/1000);
        this->position = position;
        this->duration = duration/1000;

        if(!firstTime)
        {
            if(m_lcd.IsDeviceAvailable(LG_COLOR))
            {
                m_lcd.SetText(album, albumStr.c_str());
            }


            m_lcd.SetText(artist, artistStr.c_str());
            m_lcd.SetText(title, titleStr.c_str());
            m_lcd.SetText(time, getTimeString(position).c_str());

            string s( durationString.begin(), durationString.end() );

            if(s.size() < 5)
            {
                s = "0" + s;
            }

            wstring ws( s.begin(), s.end() );

            m_lcd.SetText(time1, ws.c_str());
            ws.clear();

            ///*playIcon = static_cast<HICON>(LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_PNG1), IMAGE_ICON, 16, 16, LR_COLOR));
            //playIconHandle = m_lcd.AddIcon(playIcon, 16, 16);
            //m_lcd.SetOrigin(playIconHandle, 5, 29);*/

            m_lcd.Update();

            artistStr.clear();
            albumStr.clear();
            titleStr.clear();

        }
    }

    //Set current playing position
    void Logitech::setPosition(int pos)
    {
        this->position = pos/1000;
        m_lcd.SetText(time, getTimeString(this->position).c_str());
        m_lcd.Update();
    }

    void Logitech::setDuration(int duration)
    {
        this->duration = duration/1000;
        m_lcd.SetText(time1, getTimeString(this->duration).c_str());
        m_lcd.Update();
    }

    //Change play state of the current playing song
    void Logitech::changeState(StatePlay state)
    {
        this->state = state;

        if(state == StatePlay::Playing && firstTime)
        {
            if(m_lcd.IsDeviceAvailable(LG_COLOR))
            {
                createColor();
            }

            else if(m_lcd.IsDeviceAvailable(LG_MONOCHROME))
            {
                createMonochrome();
            }
        }
    }


    //Change int of time to string
    wstring Logitech::getTimeString(int time)
    {
        string minutes = to_string((int)time /60);
        string seconds = to_string((int)time%60);

        if(minutes.size() < 2)
        {
            minutes = "0" + minutes;
        }

        if(seconds.size() < 2)
        {
            seconds = "0" + seconds;
        }

        string timeString = minutes + ":" + seconds;

        return wstring( timeString.begin(), timeString.end() );
    }

最佳答案

  LoadImage(GetModuleHandle(NULL), ...)

这在插件中是不正确的。 GetModuleHandle(NULL) 返回 EXE 的句柄,而不是您的 DLL。假设您将资源嵌入到插件 DLL 中,您将需要使用 DLL 的模块句柄,即在 DllMain() 函数中传递给您的那个,第一个参数。

关于c++ - 从资源加载图像不起作用(C++ Dll),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14029887/

相关文章:

c++ - 为什么 const 变量不需要在模板类中初始化,直到实际使用该类?

java - 将 Java 中的 C++ DLL 与 JNA 结合使用

mysql - 执行语句是否总是为结果集占用内存?

java - 布局 xml 中的资源,但编译器错误为 "not found"

C++ 函数编译错误

c++ - 如何在不创建新配置的情况下对两个不同解决方案使用的一个项目使用不同的#defines

c++ - 对于 QDoubleSpinBox,我可以给一个范围 0.0<min<max<1.0.如果是,我如何让步骤按钮使用它

visual-c++ - 如果我删除 _USRDLL 预处理器定义会产生什么后果?

c# - 如何在其所有者进程退出时删除要删除的 DLL?

java - 我的资源未加载 - "Input stream must not be null"