如何将数据从资源指针存储到 C++ 中的静态内存缓冲区?
Posted
技术标签:
【中文标题】如何将数据从资源指针存储到 C++ 中的静态内存缓冲区?【英文标题】:How to store data from resource pointer to a static memory buffer in C++? 【发布时间】:2016-06-11 11:41:59 【问题描述】:我在 Visual Studio 的 VC++ 项目的资源中加载了一个 a.dat 文件 如documentation 所述。
现在在我的主代码中,我想将这些数据从资源指针加载到静态内存缓冲区中:
HRSRC myResource = ::FindResource(NULL, MAKEINTRESOURCE(IDR_RCDATA1), RT_RCDATA);
unsigned int myResourceSize = ::SizeofResource(NULL, myResource);
HGLOBAL myResourceData = ::LoadResource(NULL, myResource);
void* pMyBinaryData = ::LockResource(myResourceData);
现在我被困在如何创建静态内存缓冲区并存储来自pMyBinaryData
指针的数据。
任何人都可以帮助解决这个问题吗? 提前致谢。
【问题讨论】:
【参考方案1】:您拥有所需的所有信息:数据大小 (myResourceSize
) 和资源内容 (pMyBinaryData
),因此您可以创建缓冲区并将内容复制到其中:
void *buffer = malloc(myResourceSize);
memcpy(buffer, pMyBinaryData, myResourceSize);
buffer
现在保存了构成资源的字节的副本,您可以根据需要保留它——您甚至可以调用::UnlockResource(myResourceData);
而不会影响buffer
。不过,不要忘记在某个阶段发送free(buffer);
- 除非您在程序的整个生命周期中都需要它。
但如果static
指的是静态的、预分配的数组,那么您需要预先分配最大可能的大小:
#define MAX_RESOURCE_SIZE 65536 // There is no maximum size - you'll need to pick one
static char buffer[MAX_RESOURCE_SIZE];
...
if (myResourceSize>MAX_RESOURCE_SIZE)
Error("Resource too big!");
// if
memcpy(buffer, pMyBinaryData, myResourceSize);
【讨论】:
我的 a.dat 文件是一个二进制文件。将其内容保存到 char buffer 不会产生任何问题吗? @Victor 好问题——但char
是C 中最基本的类型。你认为它应该是byte
——但这甚至不是普通类型之一! malloc(size)
被定义为返回 size
char
s 的缓冲区 - 如果内存不足,则返回零。 char
的数组就是你想要的;只是不要使用printf()
或阵列上的任何东西!
我的 a.dat 文件大约 97 MB。可以创建那个大小的缓冲区吗?
您绝对可以复制它——但也许您不必这样做。所以你已经把整个a.dat
文件作为资源放入你的可执行文件中了吗?那么您的.exe
的大小是否超过 97 MB?然后指针pMyBinaryData
就是你所需要的:只要资源保持锁定,你就可以用pMyBinaryData
做任何你想做的事——不要调用::UnlockResouce()
,你可以永远使用pMyBinaryData
。不过你可能想改变它的类型:char* pMyBinaryData = (char *)::LockResource(myResourceData);
意味着现在你有一个指向字符的指针,这可能更有用。
感谢您的回答。您能告诉我如何使用此指针创建输入流对象吗。以上是关于如何将数据从资源指针存储到 C++ 中的静态内存缓冲区?的主要内容,如果未能解决你的问题,请参考以下文章