2009-03-30 14 views
0

同じアプリケーション内でVS_VERSION_INFO(例:FILEVERSION)から情報を抽出する方法はありますか?私が知っている 、おそらくのパスに思考:
1. GetModuleFileNameは(...)
2. GetFileVersionInfoSize(...)
3. GetFileVersionInfo(...)
4. VerQueryValue(.. 。)
BUT! "ひねり"があります:私はそれを独自のバージョンを抽出するActiveXコントロールを作成する必要があります。したがって、GetModuleFileNameは正しいファイル名を返しません。親アプリケーション名になるので、バージョン情報は親アプリケーションからもアクティブなコントロールではありません。ActiveXコントロール内のVS_VERSION_INFOから情報を取得する方法

アイデア?

答えて

1

ステップ1では、GetModuleFileNameを呼び出して、DLLのhModuleを渡すことができます。あなたは)(のDllMainでHMODULEを得る:ここで

extern "C" 
BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID /*lpReserved*/) 
{ 
    if (dwReason == DLL_PROCESS_ATTACH) 
    { 
     DWORD length = ::GetModuleFileName(hInstance, fullFilename, MAX_PATH); 
     // ... 
    } 
} 
+0

はい、それがうまくいくかもしれない、私はしようとします。 – Ma99uS

2

はeventiuly私のために働いていたコードがある(そしてはい、それは、MFC ActiveXコントロールのためです):

CString modFilename; 
if(GetModuleFileName(AfxGetInstanceHandle(), modFilename.GetBuffer(MAX_PATH), MAX_PATH) > 0) 
{ 
    modFilename.ReleaseBuffer(MAX_PATH); 
    DWORD dwHandle = 0; 
    DWORD dwSize = GetFileVersionInfoSize(modFilename, &dwHandle); 
    if(dwSize > 0) 
    { 
     LPBYTE lpInfo = new BYTE[dwSize]; 
     ZeroMemory(lpInfo, dwSize); 
     if(GetFileVersionInfo(modFilename, 0, dwSize, lpInfo)) 
     { 
      //// Use the version information block to obtain the FILEVERSION. 
          //// This will extract language specific part of versio resources. 040904E4 is English(US) locale, 
          //// it should match to your project 
      //UINT valLen = MAX_PATH; 
      //LPVOID valPtr = NULL; 
      //if(::VerQueryValue(lpInfo, 
      // TEXT("\\StringFileInfo\\040904E4\\FileVersion"), 
      // &valPtr, 
      // &valLen)) 
      //{ 
      // CString valStr((LPCTSTR)valPtr); 

      // AfxMessageBox(valStr); 
      //} 

          //// This will extract so called FIXED portion of the version info 
      UINT valLen = MAX_PATH; 
      LPVOID valPtr = NULL; 
      if(::VerQueryValue(lpInfo, 
       TEXT("\\"), 
       &valPtr, 
       &valLen)) 
      { 
       VS_FIXEDFILEINFO* pFinfo = (VS_FIXEDFILEINFO*)valPtr; 

       // convert to text 
       CString valStr; 
       valStr.Format(_T("%d.%d.%d.%d"), 
        (pFinfo->dwFileVersionMS >> 16) & 0xFFFF, 
        (pFinfo->dwFileVersionMS) & 0xFFFF, 
        (pFinfo->dwFileVersionLS >> 16) & 0xFFFF, 
        (pFinfo->dwFileVersionLS) & 0xFFFF 
        ); 

       AfxMessageBox(valStr); 
      } 
     } 
     delete[] lpInfo; 
    } 
} 
+0

ありがとう、それはVS2010で完璧に動作します –

関連する問題