C++で2つのCOMクラスを作成しました.1つのMFC DLLに含まれています。それらはサードパーティのアプリケーションによってプラグインとしてロードされています。アプリケーション名を呼び出さずにDLL名を取得する
これらのクラスの中からDLLのファイル名とバージョン番号を取得するにはどうすればよいですか? hInstance
C++で2つのCOMクラスを作成しました.1つのMFC DLLに含まれています。それらはサードパーティのアプリケーションによってプラグインとしてロードされています。アプリケーション名を呼び出さずにDLL名を取得する
これらのクラスの中からDLLのファイル名とバージョン番号を取得するにはどうすればよいですか? hInstance
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);
あなたは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内にプロジェクト内のすべての参照を見つけることができない、私はそれは、Win32の1とは対照的に、MFC DLLだからです想定していますか?また、サードパーティのアプリケーションは、COMクラスにinstlを呼び出すのではなく、LoadLibraryを呼び出すのではなく、DllMain(または同等のもの)を実行し、hInstanceをCOMクラスに渡す方法はstdafx.hで宣言されたグローバルに保存するだけです。 –
AfxGetInstanceHandleが動作するはずです。 – StackedCrooked
また、ATLプロジェクトの場合は '_AtlBaseModule.GetModuleInstance()'を使って 'HINSTANCE'を取得してください。 –