2014년 10월 27일 월요일

윈도우 미디어 플레이어 버전을 얻어오기(MFC) - Get Windows Media Player version.

원본글 데브피아 권용휘님(저작권자 권용휘님)

http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=51&MAEULNo=20&no=7981&ref=7981

[윈도우 미디어 플레이어 버전 정보 알아오기]

윈도우 미디어 플레이어의 버전 정보를 알아오는 것은 참으로 애매하다.

일반적으로 Application 들의 버전 정보를 알아오는 것은 그 Application 의 정보를 철저히 분석하여야지만 가능한 것인데, Media Player 의 경우에도 예외가 될 수 없기 때문이다.



그 프로그램이 어디 설치되는지 등에 대한 정보는 그 프로그램을 사용하는 사람이 마음대로 바꿀 수 있기 때문에, 대부분 설치하는 경로에 Media Player 가 있을것이라고 가정하는 것은 금물이다.



윈도우 미디어 플레이어의 버전 정보를 알아오는 방법은, 가장 간단한 방법으로 미디어 플레이어 객체를 생성하여 그 객체에게 버전 정보를 얻어오면 된다. 하지만, 이런 경우에, 미디어 플레이어는 사용하지 않고 버전 정보만 알고싶은데, 미디어 플레이어 컨트롤 까지 생성해야 하는 부담이 있다.



미디어 플레이어가 COM 객체라는 것을 감안하면, 이보다 훨씬 간단한 방법이 있다. 바로 COM 객체로 등록되어있는 미디어 플레이어 dll 의 버전을 알아오는 것이다.



이 방법을 사용하면 매우 빠르고 간편하게 미디어 플레이어 버전을 얻어올 수 있다.



다음은 이것을 하는 코드이다.



#include <atlbase.h>



CString GetMediaPlayerVersion()

{

        CString szVer;

        CRegKey oReg;      

        char szMediaPlayerFilePath[1024] = { 0, };

        DWORD dwCount = 1023;      

        WORD wMajorVer, wMinorVer, wBuildVer, wRevisionVer;      

        BOOL bFound = FALSE;



        if(oReg.Open(HKEY_CLASSES_ROOT, "CLSID\\{6BF52A52-394A-11d3-B153-00C04F79FAA6}\\InprocServer32", KEY_QUERY_VALUE) == ERROR_SUCCESS) {              

                if(oReg.QueryValue(szMediaPlayerFilePath, "", &dwCount) == ERROR_SUCCESS) {

                        bFound = TRUE;

                }

                oReg.Close();

        }

     

        if(bFound == FALSE) {

                return "0";

        }



        if(!GetAppVersion( szMediaPlayerFilePath, &wMajorVer, &wMinorVer, &wBuildVer, &wRevisionVer )){

                return "0";

        }



        szVer.Format("%d.%d.%d.%d", wMajorVer, wMinorVer, wBuildVer, wRevisionVer);

     

        return szVer;

}



BOOL GetAppVersion( char *LibName, WORD *MajorVersion, WORD *MinorVersion, WORD *BuildNumber, WORD *RevisionNumber )

{

  DWORD dwHandle, dwLen;
 UINT BufLen;
 LPTSTR lpData;
 VS_FIXEDFILEINFO *pFileInfo;
 char   targetpath[2048];

 ExpandEnvironmentStrings( LibName, targetpath, sizeof(targetpath));

 dwLen = GetFileVersionInfoSize( targetpath, &dwHandle );

 if (!dwLen)   return FALSE;
 lpData = (LPTSTR) malloc (dwLen);

 if (!lpData)   return FALSE;

 if( !GetFileVersionInfo( targetpath, dwHandle, dwLen, lpData ) ) {
  free (lpData);
  return FALSE;
 }

 if( VerQueryValue( lpData, "\\", (LPVOID*) &pFileInfo, (PUINT)&BufLen ) )  {
  *MajorVersion = HIWORD(pFileInfo->dwFileVersionMS);
  *MinorVersion = LOWORD(pFileInfo->dwFileVersionMS);
  *BuildNumber = HIWORD(pFileInfo->dwFileVersionLS);
  *RevisionNumber = LOWORD(pFileInfo->dwFileVersionLS);
  free (lpData);
  return TRUE;
 }

 free (lpData);
 return FALSE;

}

수정[090902] : 비스타와 윈도우7의 레지스트리에 기록되어 있는 wmp.dll의 경로는 시스템변수를 이용해 기록되어 있다.(%SystemRoot%system32\wmp.dll)

그래서 ExpandEnvironmentStrings 함수를 이용하여, 실제 경로로 변환하여, 버전을 읽어와야 한다.



이 코드를 사용하려면 단지, GetMediaPlayerVersion 함수를 호출하여 리턴값을 보면 된다.



정리

이것으로 미디어 플레이어 버전 정보를 얻어오는 방법을 알아보았다. 이 방법은 미디어 플레이어의 버전에 따라 다르게 동작하여야 하는 프로그램들에 유용하게 사용될 수 있을 것이다.

댓글 없음: