2009-06-24 16 views
3

C++で2つのCOMクラスを作成しました.1つのMFC DLLに含まれています。それらはサードパーティのアプリケーションによってプラグインとしてロードされています。アプリケーション名を呼び出さずにDLL名を取得する

これらのクラスの中からDLLのファイル名とバージョン番号を取得するにはどうすればよいですか? hInstance

答えて

1
CString GetCallingFilename(bool includePath) 
{ 
    CString filename; 
    GetModuleFileName(AfxGetInstanceHandle(), filename.GetBuffer(MAX_PATH), MAX_PATH); 

    filename.ReleaseBuffer(); 

    if(!includePath) 
    { 
     int filenameStart = filename.ReverseFind('\\') + 1; 
     if(filenameStart > 0) 
     { 
      filename = filename.Mid(filenameStart); 
     } 
    } 

    return filename; 
} 

CString GetCallingVersionNumber(const CString& filename) 
{ 
    DWORD fileHandle, fileVersionInfoSize; 
    UINT bufferLength; 
    LPTSTR lpData; 
    VS_FIXEDFILEINFO *pFileInfo; 

    fileVersionInfoSize = GetFileVersionInfoSize(filename, &fileHandle); 
    if(!fileVersionInfoSize) 
    { 
     return ""; 
    } 

    lpData = new TCHAR[fileVersionInfoSize]; 
    if(!lpData) 
    { 
     return ""; 
    } 

    if(!GetFileVersionInfo(filename, fileHandle, fileVersionInfoSize, lpData)) 
    { 
     delete [] lpData; 
     return ""; 
    } 

    if(VerQueryValue(lpData, "\\", (LPVOID*)&pFileInfo, (PUINT)&bufferLength)) 
    { 
     WORD majorVersion = HIWORD(pFileInfo->dwFileVersionMS); 
     WORD minorVersion = LOWORD(pFileInfo->dwFileVersionMS); 
     WORD buildNumber = HIWORD(pFileInfo->dwFileVersionLS); 
     WORD revisionNumber = LOWORD(pFileInfo->dwFileVersionLS); 

     CString fileVersion; 
     fileVersion.Format("%d.%d.%d.%d", majorVersion, minorVersion, buildNumber, revisionNumber); 

     delete [] lpData; 
     return fileVersion; 
    } 

    delete [] lpData; 
    return ""; 
} 
6
TCHAR fileName[MAX_PATH + 1]; 
GetModuleFileName(hInstance, fileName, MAX_PATH); 

あなたはDllMain機能で取得一つです。 GetModuleHandle(0)は、ホストアプリケーションのHINSTANCEを返すため、使用しないでください。

+0

私はDllMain内にプロジェクト内のすべての参照を見つけることができない、私はそれは、Win32の1とは対照的に、MFC DLLだからです想定していますか?また、サードパーティのアプリケーションは、COMクラスにinstlを呼び出すのではなく、LoadLibraryを呼び出すのではなく、DllMain(または同等のもの)を実行し、hInstanceをCOMクラスに渡す方法はstdafx.hで宣言されたグローバルに保存するだけです。 –

+0

AfxGetInstanceHandleが動作するはずです。 – StackedCrooked

+0

また、ATLプロジェクトの場合は '_AtlBaseModule.GetModuleInstance()'を使って 'HINSTANCE'を取得してください。 –

6

メインのdllエントリは、dllのハンドルを提供します。

extern "C" int APIENTRY 
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved) 

GetModuleFileName(hInstance, buffer, MAX_PATH); 

は、DLLのファイル名を取得するために使用することができます。

GetFileVersionInfoSize 
GetFileVersionInfo 

がファイルバージョンを取得するために使用されます。

関連する問題