2009-06-24 4 views

ответ

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); 

Где hInstance это один вы получаете в функции DllMain. Не используйте GetModuleHandle(0), потому что это возвращает HINSTANCE хост-приложения.

+0

Я не могу найти ссылку на проект в DllMain, я предполагаю, что это потому, что это MFC DLL, а не Win32? Кроме того, поскольку стороннее приложение запускает классы COM, а не вызывает LoadLibrary, запускается ли DllMain (или эквивалент) и как передать hInstance в класс COM, просто сохраните его в глобальном объявленном в stdafx.h? –

+0

AfxGetInstanceHandle должен работать. – StackedCrooked

+0

Или используйте '_AtlBaseModule.GetModuleInstance()', чтобы получить 'HINSTANCE', если это проект ATL. –

6

Основная запись dll дает вам дескриптор вашей DLL.

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

и

GetModuleFileName(hInstance, buffer, MAX_PATH); 

может быть использован, чтобы получить имя файла DLL.

GetFileVersionInfoSize 
GetFileVersionInfo 

будет использоваться для получения версии файла.

Смежные вопросы