C++;:从dll访问嵌入式资源 我有一个C++ DLL项目,其中我通过“Real.RC”文件嵌入了一些原始数据。

C++;:从dll访问嵌入式资源 我有一个C++ DLL项目,其中我通过“Real.RC”文件嵌入了一些原始数据。,c++,dll,embedded-resource,C++,Dll,Embedded Resource,现在我想从dll中访问“areaTemplate.bin”文件的数据。如何读取字节数组中“areaTemplate.bin”的内容?先使用or,然后使用and 用于获取数据的大小 代码: 请务必阅读以下有关LoadResource的备注: 备注LoadResource的返回类型为HGLOBAL for backward 兼容性,而不是因为函数将句柄返回给全局 内存块。不要将此句柄传递给GlobalLock或GlobalFree 功能 没有“解锁资源”或“免费资源”API 备注LockResour

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

先使用or,然后使用and

用于获取数据的大小

代码:

请务必阅读以下有关LoadResource的备注:

备注LoadResource的返回类型为HGLOBAL for backward 兼容性,而不是因为函数将句柄返回给全局 内存块。不要将此句柄传递给GlobalLock或GlobalFree 功能

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

备注LockResource返回的指针在模块启动之前有效 将卸载包含该资源的文件。不需要解锁 资源,因为当 创建它们的进程终止

正如曼纽尔所说,你使用,而且可能

我碰巧有一些代码可以提取资源并将其写入文件,这可能有助于您理解所讨论的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));
   }
}

起初它不起作用。在搜索了一点之后,我发现,我必须使用
GetModuleHandle(L“mydll.dll”)
初始化
ghmodll
。是否有方法枚举
L“mydll.dll”
,而不是在程序中对其进行硬编码?如果“mydll.dll”是一个常规的Win32 C/C++dll,则可以在DllMain中保存HMODULE(HINSTANCE)值。如果你需要更多的帮助,请告诉我
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 );
    }
}
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));
   }
}
// Determine the module handle of your DLL by locating a function
// you know resides in that DLL
HMODULE hModule;
GetModuleHandleExA(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,
        (LPCSTR)&myDLLfuncName, &hModule)

HRSRC hRscr = FindResource(hModule, MAKEINTRESOURCE(IDR_TEMPLATE1),
                           MAKEINTRESOURCE(RT_RCDATA));