2013-04-28 71 views
-1

我一直試圖做一些所謂簡單,但像往常一樣,它不是爲我工作,在可疑的情況。我想要做的只是在屏幕上加載一個位圖並保存在屏幕上。 (彈出)窗口將沒有控件,不能移動,並且只能通過它的泵來處理WM_PAINT;像一個閃屏。C++的LoadImage錯誤獨家發佈模式

代碼編譯良好,並且在調試模式下運行正常,但是當我切換到釋放模式時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"。感謝你們。

+0

您的圖片加載路徑看起來相對於您的cwd。你確實在你的可執行文件下面部署了圖像?或者調試版本部署到「正確」的位置,並且發佈版本不是那麼正確? – 2013-04-28 22:07:53

+0

@JonathonReinhart爲了驗證,我直接將整個「藝術」文件夾直接複製到發佈可執行文件的位置。 – 2013-04-28 22:08:11

+0

@JonathonReinhart好吧,你說得對 - 對我來說沒有多大意義,但將1.bmp移出中間目錄並將其直接放在.exe旁邊可以使其正常工作。我可以接受評論作爲答案嗎? – 2013-04-28 22:22:40

回答

1

很多時候,我注意到這樣的問題是路徑相關。請注意,發佈可執行文件的位置並不重要,而是「當前working directory」是什麼。

您可以通過getcwd或(在Win32中)GetCurrentDirectory函數調用獲取currect工作目錄。

作爲一個額外的測試,爲了確保文件確實是你相信它的地方(相對於你的CWD),我會拋出一個fopen(..., "r")調用,並檢查它是否成功。

0

當您從IDE運行你的應用程序的工作目錄是您的項目目錄。但是當您作爲調試/發行版發佈時,您的IDE會將您的應用程序放到文件夾projectfolder/bin/debug(release)中。現在它的工作目錄不是你的projectfolder,而是projectfolder/bin/debug(release)。這就是爲什麼它在IDE中運行時找到您的位圖,而不是在調試/發佈後發佈。

你可以做如下:

路徑到您的位圖,例如「yourProjectFolder /圖像/ bitmap1.bmp」。你可以在你的IDE裏運行 - >沒問題。 您的代碼如下所示:

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

現在您想要作爲調試發佈。工作目錄是現在projectfolder /斌/調試,以便更改搜索路徑:

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

對於每個../ IDE將一步一個文件夾級別了。這意味着從這裏:projectFolder /斌/調試到這裏:項目文件夾/圖像機器必須步驟兩次,直到它到達項目文件夾加圖像文件夾。所以../../image導致bin/debug中的projectfolder/image。

但這是一個工作!它更好地從資源加載圖像。

+0

三年後!如果我現在還沒有弄清楚我路名上的錯字,我懷疑我還會繼續努力! :) – 2016-03-24 23:03:33