检索DLL名称,而不是调用应用程序名称

时间:2009-06-24 12:31:43

标签: c++ com

我在C ++中编写了两个COM类,包含在一个MFC DLL中。它们被第三方应用程序作为插件加载。

如何从这些类中获取DLL的文件名和版本号?

3 个答案:

答案 0 :(得分:6)

TCHAR fileName[MAX_PATH + 1];
GetModuleFileName(hInstance, fileName, MAX_PATH);

hInstanceDllMain函数中的GetModuleHandle(0)。不要使用HINSTANCE,因为它会返回主机应用程序的{{1}}。

答案 1 :(得分:6)

主dll条目为您提供了dll的句柄。

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

GetModuleFileName(hInstance, buffer, MAX_PATH);

可用于获取DLL的文件名。

GetFileVersionInfoSize
GetFileVersionInfo

将用于获取文件版本。

答案 2 :(得分: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 "";
}