如何将数据从资源指针存储到 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 chars 的缓冲区 - 如果内存不足,则返回零。 char 的数组就是你想要的;只是不要使用printf() 或阵列上的任何东西! 我的 a.dat 文件大约 97 MB。可以创建那个大小的缓冲区吗? 您绝对可以复制它——但也许您不必这样做。所以你已经把整个a.dat 文件作为资源放入你的可执行文件中了吗?那么您的.exe 的大小是否超过 97 MB?然后指针pMyBinaryData 就是你所需要的:只要资源保持锁定,你就可以用pMyBinaryData 做任何你想做的事——不要调用::UnlockResouce(),你可以永远使用pMyBinaryData。不过你可能想改变它的类型:char* pMyBinaryData = (char *)::LockResource(myResourceData); 意味着现在你有一个指向字符的指针,这可能更有用。 感谢您的回答。您能告诉我如何使用此指针创建输入流对象吗。

以上是关于如何将数据从资源指针存储到 C++ 中的静态内存缓冲区?的主要内容,如果未能解决你的问题,请参考以下文章

将内存和存储分配到指针中

从 C++ 中的共享库调用指向列表的静态指针

C++面试常考点:字符串常量

SWIG:如何将 C++ 对象数组从 C# 传递到 C++?

关于c++中的this指针

从内存中读取图像,知道指向内存的指针。 VC++ [关闭]