2013-07-12 75 views
0

我試圖使用這個函數來抓取任何文件的版本,但我的問題是當我把它看起來像一個鏟子的價值。我知道這裏沒有什麼錯,我在屏幕上的值打印,所以它必須是我的功能內的東西....我只是不知道它可能是什麼。我嘗試將字符串更改爲CompleteVer的char數組,但存在一些問題。絃樂價值如何?

string GetFileVersion(HANDLE hprocess) 
{ 
    VS_FIXEDFILEINFO* FFI; 
    UINT FFISize; 
    BYTE* VersionInfo; 
    char Path[MAX_PATH]; 
    int VersionSeg[4] = {0}; 
    string CompleteVer; 

    if(GetModuleFileNameEx(hprocess,0,Path,sizeof(Path))) 
     if(int FilePropSize = GetFileVersionInfoSize(Path,0)) 
     { 
      VersionInfo = new BYTE[FilePropSize]; 
      if(GetFileVersionInfo(Path,0,FilePropSize,VersionInfo)) 
       if(VerQueryValue(VersionInfo,"\\",(void**)&FFI,&FFISize)) 
       { 
        VersionSeg[0] = HIWORD(FFI->dwFileVersionMS); 
        VersionSeg[1] = LOWORD(FFI->dwFileVersionMS); 
        VersionSeg[2] = HIWORD(FFI->dwFileVersionLS); 
        VersionSeg[3] = LOWORD(FFI->dwFileVersionLS); 
        delete[] VersionInfo; 

        for(int x = 0;x < 4;x++) 
        { 
         CompleteVer += VersionSeg[x]; 
        } 

        return CompleteVer; 
       } 
      else 
       return "3"; 
     } 
     else 
      return "2"; 
    else 
     return "1"; 
} 

輸出:♠

+0

絕對是我見過的更可怕的UB形式之一。 – Potatoswatter

+4

你怎麼知道這是黑桃王牌..?這只是spa ... – NREZ

+0

什麼是HIWORD和LOWORD? 'VersionSeg'中的值是什麼? – Potatoswatter

回答

0

它看起來像你從結構抓住一些int值並將其追加爲一個字符串而無需首先轉換爲字符。如果您抓取的值是ASCII,那麼您應該聲明VersionSegchar [4],如果它們不是,那麼您需要執行一些操作,如添加到'0'。並檢查它們是否小於10的十進制數字。

+0

另外,OP可能必須實際將數字轉換爲ASCII字符串。 'VersionSeg'中的每個數字可能包含多個數字的值。 – yzt

+0

@yzt不可告知。他沒有在他們之間增加小數點。無論如何,要點是一樣的。 – Potatoswatter