我有一个c ++ dll项目,其中,我通过“resource.rc”文件嵌入了一些原始数据。
IDR_TEMPLATE1 RCDATA "areaTemplate.bin"
现在我想从dll访问“areaTemplate.bin”文件的数据。如何在字节数组中读取“areaTemplate.bin”的内容?
答案 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)
首先使用FindResource或FindResourceEx,然后使用LoadResource和LockResource。
使用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();