[英]Multiple resources returned in resource.rc file
好吧,我想我知道出了什么問題,但我不知道如何解決這個問題。
LoadResource從多個資源返回文本。
(這些是由MINGW的'winres'實用程序編譯到我的EXE中的資源。)(這不是一個OpenGL問題。)
我試圖從存儲在EXE中的資源將着色器的文本加載到內存中。
以下是重要的代碼片段:
我從哪里調用我的函數:
void SetupDisplay() {
UINT vShader = LoadShaderResource (VERTEX1, GL_VERTEX_SHADER);
UINT fShader = LoadShaderResource (FRAGMENT1, GL_FRAGMENT_SHADER);
....
它開始加載着色器的過程中的上半部分....(我在這里放了一堆東西試圖找到問題,我走回去,直到我發現這個:
UINT LoadShaderResource (int index, int type) {
std::vector<std::string> Lines;
std::string tShader = LoadTextFileResource(index);
std::cerr << "-------BEGIN " << index << "\n";
std::cerr << tShader;
std::cerr << "-------END\n";
std::istringstream iss(tShader);
...其余部分不是重復,着色器組合崩潰,底部是診斷產生的原因。 我使用istringstream是因為我將所有文本都放回到一個大的glob中,但這不是問題,(我有跟隨它的代碼將它分開。)問題是兩個文件在它們不應該同時包含在同一時間至少對於他們中的一個,我的猜測是它們是如何存儲的,但我不知道如何解決這個問題。
好吧,也許有些事需要在這里完成?
std::string LoadTextFileResource(int name) {
HMODULE handle = GetModuleHandleA(NULL);
HRSRC rc = FindResourceA(handle, MAKEINTRESOURCE(name), RT_RCDATA);
HGLOBAL rcData = LoadResource(handle, rc);
std::string result = (const char*) LockResource(rcData);
return result;
}
好的,這就是所有的C ++代碼,現在用於資源:
RESOURCE.RC
// Generated by ResEdit 1.5.11
// Copyright (C) 2006-2012
// http://www.resedit.net
#include <windows.h>
#include <commctrl.h>
#include <richedit.h>
#include "resource.h"
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
VERTEX1 RCDATA "..\\Data\\shader.vert"
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
FRAGMENT1 RCDATA "..\\Data\\shader.frag"
//
// Icon resources
//
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
IDI_ICON1 ICON "..\\Data\\Generic.ico"
....我只顯示圖標,以便您可以看到正在關注的內容,其余的是版本信息等。
我的resource.h文件將我的代碼鏈接到resource.rc文件:
#ifndef IDC_STATIC
#define IDC_STATIC (-1)
#endif
#define IDI_ICON1 100
#define VERTEX1 110
#define FRAGMENT1 120
現在,着色器的文本。 (記住,這不是一個OpenGL問題。)
shader.frag
#version 330
#pragma optimize(off)
#pragma debug(on)
smooth in vec3 theColor;
out vec4 outputColor;
void main()
{
outputColor = vec4(theColor, 1.0);
}
shader.vert
#version 330
#pragma optimize(off)
#pragma debug(on)
layout (location = 0) in vec3 inPosition;
layout (location = 1) in vec3 inColor;
smooth out vec3 theColor;
void main()
{
gl_Position = vec4(inPosition, 1.0);
theColor = inColor;
}
好吧,盡管如此,這就是它產生的東西。 (包括雙倍間距。)
-------BEGIN 110
#version 330
#pragma optimize(off)
#pragma debug(on)
layout (location = 0) in vec3 inPosition;
layout (location = 1) in vec3 inColor;
smooth out vec3 theColor;
void main()
{
gl_Position = vec4(inPosition, 1.0);
theColor = inColor;
}
#version 330
#pragma optimize(off)
#pragma debug(on)
smooth in vec3 theColor;
out vec4 outputColor;
void main()
{
outputColor = vec4(theColor, 1.0);
}
-------END
-------BEGIN 120
#version 330
#pragma optimize(off)
#pragma debug(on)
smooth in vec3 theColor;
out vec4 outputColor;
void main()
{
outputColor = vec4(theColor, 1.0);
}
-------END
好的,現在如果你注意到,BEGIN 110包含兩個着色器,BEGIN 120沒有。 當然,110中的兩個着色器都是吹噓的東西。 我無法理解的是它在110中獲得兩個着色器的位置是什么?
這里有些事情我不明白,但我迷失了,接下來要看什么。
在LoadTextFileResource()
,使用std::string::operator=(const char*)
將資源數據復制到std::string
。 此運算符假定您的字符串為null
-terminated。 但是你給它的指針不一定指向一個null
-terminated字符串。 要解決此問題,您需要調用SizeofResource()
來確定字符串的實際長度:
std::string LoadTextFileResource(int name) {
HMODULE handle = GetModuleHandleA(NULL);
HRSRC rc = FindResourceA(handle, MAKEINTRESOURCE(name), RT_RCDATA);
HGLOBAL rcData = LoadResource(handle, rc);
DWORD data_size = ::SizeofResource(handle, rc);
std::string result;
if (data_size != 0) {
const char* data = (const char*)::LockResource(rcData);
result.assign(data, data_size);
}
return result;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.