C ++:从dll访问嵌入式资源

时间:2013-11-13 11:12:19

标签: c++ dll embedded-resource

我有一个c ++ dll项目,其中,我通过“resource.rc”文件嵌入了一些原始数据。

IDR_TEMPLATE1           RCDATA                "areaTemplate.bin"

现在我想从dll访问“areaTemplate.bin”文件的数据。如何在字节数组中读取“areaTemplate.bin”的内容?

3 个答案:

答案 0 :(得分:3)

正如Manuell所说,您使用FindResource()LoadResource(),可能LockResource()SizeofResource()

我碰巧有一些代码可以提取资源并将其写入文件,这可能有助于您理解相关API。

void WriteResourceToFile(
   HANDLE hFile,
   const _tstring &resourceName,
   const _tstring &resourceType,
   HMODULE hModule)
{
   HRSRC hResource = ::FindResource(
      hModule,
      resourceName.c_str(),
      resourceType.c_str());

   if (!hResource)
   {
      const DWORD lastError = ::GetLastError();

      throw CWin32Exception(
         _T("WriteResourceToFile() - FindResource"),
         lastError);
   }

   HGLOBAL hGlobal = ::LoadResource(hModule, hResource);

   if (!hGlobal)
   {
      const DWORD lastError = ::GetLastError();

      throw CWin32Exception(
         _T("WriteResourceToFile() - LoadResource"),
         lastError);
   }

   void *pData = ::LockResource(hGlobal);

   if (!pData)
   {
      const DWORD lastError = ::GetLastError();

      throw CWin32Exception(
         _T("WriteResourceToFile() - LockResource"),
         lastError);
   }

   const DWORD bytes = ::SizeofResource(hModule, hResource);

   DWORD bytesWritten = 0;

   if (!::WriteFile(hFile, pData, bytes, &bytesWritten, 0))
   {
      const DWORD lastError = ::GetLastError();

      throw CWin32Exception(
         _T("WriteResourceToFile() - WriteFile"),
         lastError);
   }

   if (bytesWritten != bytes)
   {
      throw CWin32Exception(
         _T("WriteResourceToFile() - WriteFile"),
         _T("Wrote less bytes (") + ToString(bytesWritten) +
         _T("( than expected: ") + ToString(bytes));
   }
}

答案 1 :(得分:2)

首先使用FindResourceFindResourceEx,然后使用LoadResourceLockResource

使用SizeofResource获取数据的大小。

代码:

HMODULE g_hModDll;

[...]

HRSRC hRscr = FindResource( g_hModDll, MAKEINTRESOURCE( IDR_TEMPLATE1 ),
                            MAKEINTRESOURCE( RT_RCDATA ) );
if ( hRscr ) {
    HGLOBAL hgRscr = LoadResource( g_hModDll, hRscr );
    if ( hgRscr ) {
        PVOID pRscr = LockResource( hgRscr );
        DWORD cbRscr = SizeofResource( g_hModDll, hRscr );
    }
}

请务必阅读以下有关LoadResource的说明:

  

备注 LoadResource的返回类型是HGLOBAL,用于向后   兼容性,不是因为函数返回全局句柄   记忆块。不要将此句柄传递给GlobalLock或GlobalFree   功能

没有“解锁资源”或“免费资源”API。

  

备注 LockResource返回的指针在模块之前有效   包含资源已卸载。没有必要解锁   资源,因为系统自动删除它们   创建它们的进程终止。

答案 2 :(得分:0)

    var htmlFactory = new HtmlFactory(); 
    htmlFactory.Add("div")
        .Style("display", "block")
        .Class("base-item")
        .Inner(elements =>
        {
            elements.Add("span")
                .Class("header")
                .Text("Header");
            elements.Add("div")
                .Class("subheader")
                .Inner(inner =>
                {
                    inner.Add("span")
                        .Class("subheader-content")
                        .Text("SubHeader");
                });
        });

    var result = htmlFactory.ToString();