Winapi Win32,资源文件,加载到内存中

Winapi Win32,资源文件,加载到内存中,winapi,Winapi,这是我的test.rc文件: shader.hlsl shaders "HLSL\\shader.hlsl" 我知道它看起来不像普通的rc文件,但当我使用这样的函数时 D3DX11CompileFromResource(handle, L"shader.hlsl", NULL, NULL, NULL, "VS", "vs_4_0", 0, 0, NULL, &s, &err, &hr);

这是我的
test.rc
文件:

shader.hlsl shaders "HLSL\\shader.hlsl"
我知道它看起来不像普通的rc文件,但当我使用这样的函数时

D3DX11CompileFromResource(handle, L"shader.hlsl", NULL, NULL, NULL, "VS", "vs_4_0", 0, 0, NULL, &s, &err, &hr);
它工作得很好,但我想把这个文件加载到内存中。请告诉我怎么做,因为我现在没有主意。我试过那样的东西

HRSRC hSrc = FindResource(GetModuleHandle(0), L"shader.hlsl", L"shaders");
但是没有成功

编辑:
FindResource()
返回NULL

您的思路是正确的:您需要使用一系列
FindResource
/
LoadResource
/
LockResource

HMODULE hModule = GetModuleHandle(NULL);
HRSRC hRes = FindResource(hModule, L"shader.hlsl", L"shaders"); 
HGLOBAL hMem = LoadResource(hModule, hRes);
LPVOID lpResource = LockResource(hMem);

DWORD size = SizeofResource(hModule, hRes);

lpResource
是指向您的资源的指针
size
是内存块的大小(以字节为单位)。当然,完成后别忘了调用
FreeResource(hMem)

你走对了方向:你需要使用一系列
FindResource
/
/
/
锁资源

HMODULE hModule = GetModuleHandle(NULL);
HRSRC hRes = FindResource(hModule, L"shader.hlsl", L"shaders"); 
HGLOBAL hMem = LoadResource(hModule, hRes);
LPVOID lpResource = LockResource(hMem);

DWORD size = SizeofResource(hModule, hRes);

lpResource
是指向您的资源的指针
size
是内存块的大小(以字节为单位)。当然,完成后不要忘记调用
免费资源(hMem)

问题部分解决。事实上,我对“rcdata”类型的资源有问题,而不是“着色器”。我把第二个作为例子,但没有检查它(我真的很抱歉,我浪费了你的时间)。似乎除了“rcdata”之外的所有类型名称都有效。但是为什么

编辑:
问题完全解决了。我只需要使用RT_RCDATA作为类型名。似乎“rcdata”类型是一个标准名称。

问题部分解决。事实上,我对“rcdata”类型的资源有问题,而不是“着色器”。我把第二个作为例子,但没有检查它(我真的很抱歉,我浪费了你的时间)。似乎除了“rcdata”之外的所有类型名称都有效。但是为什么

编辑:
问题完全解决了。我只需要使用RT_RCDATA作为类型名。“rcdata”类型似乎是一个标准名称。

谢谢您的回复,但我忘记了最重要的一点:FindResource()返回NULLFreeResource函数已过时:不必使用LoadResource释放加载的资源。Ref谢谢您的回复,但我忘记了最重要的一点:FindResource()返回NULLFreeResource函数已过时:不必使用LoadResource释放加载的资源。Ref非常可疑的是,对于D3DX11CompileFromResource()调用,您有一个不错的句柄,但是对于FindResource()调用,您没有。为什么您坚持使用非标准格式的资源文件?仅仅因为它工作一次并不意味着它是正确的。而且,呃,你做这件事的方式运气不太好。因为这不取决于我如何安排。@CodyGray自定义资源类型没有问题。这就是类型标识符的作用。令人费解的是,您对D3DX11CompileFromResource()调用有一个合适的句柄,但对FindResource()调用没有。为什么您坚持使用非标准格式的资源文件?仅仅因为它工作一次并不意味着它是正确的。而且,呃,你做这件事的方式运气不太好。因为这不取决于我如何安排。@CodyGray自定义资源类型没有问题。这就是类型标识符的用途。