Я написал два класса COM на C++, которые содержатся в одной DLL MFC. Они загружаются в виде плагинов сторонним приложением.Извлечение имени DLL, не вызывающее имя приложения
Как получить имя файла и номер версии DLL из этих классов?
Я написал два класса COM на C++, которые содержатся в одной DLL MFC. Они загружаются в виде плагинов сторонним приложением.Извлечение имени DLL, не вызывающее имя приложения
Как получить имя файла и номер версии DLL из этих классов?
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 "";
}
TCHAR fileName[MAX_PATH + 1];
GetModuleFileName(hInstance, fileName, MAX_PATH);
Где hInstance
это один вы получаете в функции DllMain
. Не используйте GetModuleHandle(0)
, потому что это возвращает HINSTANCE
хост-приложения.
Основная запись dll дает вам дескриптор вашей DLL.
extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
и
GetModuleFileName(hInstance, buffer, MAX_PATH);
может быть использован, чтобы получить имя файла DLL.
GetFileVersionInfoSize
GetFileVersionInfo
будет использоваться для получения версии файла.
Я не могу найти ссылку на проект в DllMain, я предполагаю, что это потому, что это MFC DLL, а не Win32? Кроме того, поскольку стороннее приложение запускает классы COM, а не вызывает LoadLibrary, запускается ли DllMain (или эквивалент) и как передать hInstance в класс COM, просто сохраните его в глобальном объявленном в stdafx.h? –
AfxGetInstanceHandle должен работать. – StackedCrooked
Или используйте '_AtlBaseModule.GetModuleInstance()', чтобы получить 'HINSTANCE', если это проект ATL. –