C++;:从dll访问嵌入式资源 我有一个C++ DLL项目,其中我通过“Real.RC”文件嵌入了一些原始数据。
现在我想从dll中访问“areaTemplate.bin”文件的数据。如何读取字节数组中“areaTemplate.bin”的内容?先使用or,然后使用and 用于获取数据的大小 代码: 请务必阅读以下有关LoadResource的备注: 备注LoadResource的返回类型为HGLOBAL for backward 兼容性,而不是因为函数将句柄返回给全局 内存块。不要将此句柄传递给GlobalLock或GlobalFree 功能 没有“解锁资源”或“免费资源”API 备注LockResource返回的指针在模块启动之前有效 将卸载包含该资源的文件。不需要解锁 资源,因为当 创建它们的进程终止 正如曼纽尔所说,你使用,而且可能 我碰巧有一些代码可以提取资源并将其写入文件,这可能有助于您理解所讨论的APIC++;:从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
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));