DLLのバージョンを返す処理

DLLのバージョンリソース情報のファイルバージョンを取得して返すだけのつまらないコード :arrow:

HINSTANCE g_hDllInstance;
 
BOOL APIENTRY DllMain(HANDLE hModule,
                                   DWORD  ul_reason_for_call,
                                   LPVOID lpReserved
                                  )
{
    g_hDllInstance = (HINSTANCE)hModule;}
 
char * __stdcall GetVersion(void)
{
    TCHAR strPath[MAX_PATH];
 
    GetModuleFileName(g_hDllInstance, strPath, MAX_PATH);
    return(ReadVersion(strPath));
}
 
static char *ReadVersion(char *strFname)
{
    static char strVersion[(5 + 1) * 4];
 
    DWORD dwSize = GetFileVersionInfoSize(strFname, 0);
    if (dwSize == 0) {
        return("");
    }
    void *buffer = malloc(dwSize);
    if (buffer == NULL) {
        return("");
    }
 
    GetFileVersionInfo(strFname, 0, dwSize, (LPVOID)buffer);
 
    LPVOID retBuffer = NULL;
    UINT uiLength = 0;
 
    VerQueryValue((const LPVOID)buffer, "\\", &retBuffer, &uiLength);
    VS_FIXEDFILEINFO *verInfo = (VS_FIXEDFILEINFO *)retBuffer;
 
    DWORD dwFileVerMS = verInfo->dwFileVersionMS;
    DWORD dwFileVerLS = verInfo->dwFileVersionLS;
    sprintf(strVersion, "%d.%d.%d.%d", dwFileVerMS >> 16, dwFileVerMS & 0xFFFF,
                                                          dwFileVerLS >> 16, dwFileVerLS & 0xFFFF);
    free(buffer);
    return(strVersion);
}

バージョンリソースのファイルバージョンを取得するだけなのに以外に面倒くさかったのでメモ :roll: 雑な部分は適当に :mrgreen:

あ、あとコレだけのためにversion.libをリンクする必要もあったりする…う~ん :?

Be Sociable, Share!

TrackBack URL :

No comments yet. Be the first.

Leave a reply