C ++ LoadImage Bug专用于发布模式

时间:2013-04-28 22:00:49

标签: c++ image winapi bitmap

我一直在努力做一些据说很简单的事情,但是像往常一样,在可疑的情况下,它对我不起作用。我想要做的只是将位图加载到屏幕并保持在那里。 (弹出窗口)窗口没有控件,无法移动,只能通过它的泵处理WM_PAINT;像一个闪屏。

代码编译很好并且在调试模式下运行正常,但是当我切换到发布模式时LoadImage()总是返回NULL,其他一切都因此失败。这是我花在这一方法上的第四个小时,我认为是时候寻求帮助了。 我检查了未初始化的内存,并确保使用的每个类成员都初始化为0,并且可以肯定这不是问题所在。 我将在下面发布以下代码,非常感谢您的帮助。

如果可能的话,我更愿意只使用WinAPI来执行此操作,因为在此应用程序的任何其他位置我都不会使用此功能。当然,我仍然对创意持开放态度,但很可能我只是犯了一个愚蠢的错误。再次,谢谢!


int CreateWindowWithUserFormat()
{   
    SIZE BMSize = {0};
    LoadedBitmap = (HBITMAP) LoadImage(NULL,
    L"Art\\Splash_Screens\\1.bmp", IMAGE_BITMAP,
    NULL, NULL, LR_LOADFROMFILE);

    if(!LoadedBitmap) {
    MessageBox(NULL,
        L"Error loading image to void * HBITMAP",
        L"Error Loading Splash", NULL);
    }

    ScreenDevCtxt = CreateCompatibleDC(NULL);
    if(!ScreenDevCtxt) {
    //Failure
    }

    ReplacedObject = SelectObject(ScreenDevCtxt, (HGDIOBJ) LoadedBitmap);
    if(ReplacedObject == NULL || ReplacedObject == HGDI_ERROR) {
    //Failure
    }

    if( (!GetBitmapDimensionEx(LoadedBitmap, &BMSize) ) ||
    BMSize.cx == 0 || BMSize.cy == 0) {
    //Failure, try alternate:
        BITMAP Bm = {0};
    if( (!GetObject(LoadedBitmap, sizeof(Bm), &Bm) ) ||
        Bm.bmWidth == 0 || Bm.bmHeight == 0) {

    MessageBox(NULL,
        L"Error getting bitmap size; loading aborted.",
        L"Error Loading Splash Image", NULL); 
    }
    // Alternate success; use these as size.
    BMSize.cx = Bm.bmWidth;
    BMSize.cy = Bm.bmHeight;
    }

    {
    RECT WindowSize = {0};
    WinHelper.CenterRectInScreen(WindowSize, BMSize.cx, BMSize.cy);

    if(!Create(L"TitleName",
        WS_POPUPWINDOW | WS_EX_TOPMOST,
        WS_EX_TRANSPARENT,
        WindowSize.left, WindowSize.top,
        WindowSize.right, WindowSize.bottom,
        NULL, NULL) )
    {
        return false;
    }
    return true;
    }
}

值得一提的是,这是在它自己的线程上运行的。线程包装器负责在从应用程序收到信号并且经过一定时间后(5秒,我相信)销毁此窗口。我有理由相信这不是问题的根源,但谁知道;我没有想法。 问题只出现在发布模式中,是的,发布模式仍然可以访问文件(Art\\Splash_Screens\\1.bmp)。我该怎么做才能解决这个问题?

更新 嗯,这之后只花了几分钟就意识到路径是错误的...... 我仍然不知道为什么,但显然如果我们取出中间文件夹并将"1.bmp"直接粘贴在可执行文件旁边,它就可以了。谢谢你们。

2 个答案:

答案 0 :(得分:1)

我经常注意到这样的问题与路径有关。请注意,发布可执行文件的位置无关紧要,而是“当前working directory”是什么。

您可以使用getcwd或(在Win32中)GetCurrentDirectory函数调用获取当前工作目录。

作为一个额外的测试,为了确保文件确实在你相信它的位置(相对于你的CWD),我会抛出一个fopen(..., "r")调用,并检查它是否成功。

答案 1 :(得分:0)

当您从IDE执行应用程序时,工作目录是您的项目目录。但是当您作为调试/发布版本发布时,您的IDE会将您的应用程序放入projectfolder / bin / debug(release)文件夹中。现在它的工作目录不是你的项目文件夹,而是projectfolder / bin / debug(release)。这就是为什么它在IDE中运行时找到你的位图,而不是在发布后作为调试/发布。

您可以执行以下操作:

位图的路径例如是" yourProjectFolder / image / bitmap1.bmp"。您可以在IDE中运行 - >没问题。 您的代码如下所示:

LoadedBitmap = (HBITMAP)LoadImage(NULL,
               "image/bitmap1.bmp", IMAGE_BITMAP,
               NULL, NULL, LR_LOADFROMFILE);

现在您想要作为调试发布。工作目录现在是projectfolder / bin / debug,因此将搜索路径更改为:

LoadedBitmap = (HBITMAP)LoadImage(NULL,
               "../../image/bitmap1.bmp", IMAGE_BITMAP,
               NULL, NULL, LR_LOADFROMFILE);

对于每个../,IDE将逐步升级一个文件夹。这意味着从这里:projectFolder / bin / debug到这里:projectfolder / image机器必须向上步骤两次,直到它到达项目文件夹加上/ image为你的图像文件夹。因此../../image会从bin / debug中导致项目文件夹/图像。

但这是一个解决方法!最好从资源加载图像。