【问题标题】:Win32 api for opening and getting data from resource filesWin32 api 用于打开和获取资源文件中的数据
【发布时间】:2012-11-25 09:26:47
【问题描述】:

我有一个正在编译成 DLL 的项目,以及一个我手动添加的资源文件。 我正在寻找可以帮助我查找资源文件并从中获取信息和数据的 Win32 API(使用 C++)。

例如 - 获取公司名称或版本..

谁能帮帮我?

谢谢。

【问题讨论】:

  • 试图逆转?你能解释更多吗?!
  • FindResource、LoadResource、SizeofResource、LockResource、UnlockResource FreeResource。在"WIN32 DLL Resource Loading" 上大约有 100 万次网络点击
  • 是的,当我在 VS2010 中右键单击该项目时,我添加了:add->resource->Version。然后我得到了带有 CompanyName、Version、ProductName 等的窗口...我想编写一个函数,例如可以给我公司名称..但我不明白如何输入资源文件并获取它..我认为它有一个winapi..但我找不到它
  • 您想阅读版本资源而不是通用资源对吧?
  • 是的..我只是不明白该怎么做

标签: c++ winapi dll resources versioning


【解决方案1】:

调用下面的函数,将 TEXT("CompanyName") 作为 lpszVersionType `

#pragma comment(lib, "version.lib")
BOOL GetVersionString(LPCTSTR lpszModuleFileName, LPCTSTR lpszVersionType, LPTSTR lpszVersionString)
{   int i, j;
unsigned long u;
LPTSTR pBlock, pTmpVersion;
TCHAR buf[_MAX_PATH];
BOOL bRet = FALSE;

struct LANGANDCODEPAGE
{   WORD wLanguage;
    WORD wCodePage;
} *lpTranslate;

if ((i = GetFileVersionInfoSize(lpszModuleFileName, &u)) == 0) // !!
    return FALSE;
i++;
pBlock = (LPTSTR)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, i * sizeof(TCHAR));
if (pBlock == NULL) // !!
    return FALSE;

if (GetFileVersionInfo(lpszModuleFileName, u, i, pBlock))
{   VerQueryValue(pBlock, TEXT ("\\VarFileInfo\\Translation"), (LPVOID*)&lpTranslate, (UINT *)&u); // // Read the list of languages and code pages
    j = (int)(u/sizeof(struct LANGANDCODEPAGE));
    for (i = 0; i < j; i++)
    {   wsprintf(buf, TEXT ("\\StringFileInfo\\%04x%04x\\%s"), lpTranslate[i].wLanguage, lpTranslate[i].wCodePage, lpszVersionType);
        VerQueryValue(pBlock, buf, (void **)&pTmpVersion, (UINT *)&u);
        if (u > 0)
        {   lstrcpy(lpszVersionString, pTmpVersion);
            bRet = TRUE;
            break;
        }
    }
}

HeapFree(GetProcessHeap(), 0, pBlock);

return bRet;
}

`

【讨论】:

  • 谢谢,我应该在 :lpszVersionString 里面放什么?第一个参数是DLL的路径>
  • lpszVersionString 是输出参数,例如 char szCompanyName[_MAX_PATH]; GetVersionString(lpszModuleFileName, TEXT("CompanyName"), szCompanyName);
  • 我总是得到:错误 LNK2019Lunresolved external symbol _GetFileVersionInfo@16 referenced in function "struct_ver* _cdecl ..." 这是什么意思?我做错了吗?
  • 您的源代码中是否包含“#pragma comment(lib, "version.lib")”行?否则,您需要在项目属性的 Linker-Input-AdditionalDependencies 选项中包含 version.lib
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-14
  • 1970-01-01
  • 1970-01-01
  • 2011-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多