C++ resource.rc文件中返回了多个资源

C++ resource.rc文件中返回了多个资源,c++,windows,resources,C++,Windows,Resources,好吧,我想我知道怎么了,但我不知道如何解决这个问题 LoadResource正在从多个资源返回文本 (这些是由MINGW的“winres”实用程序编译到my EXE中的资源。) (这不是OpenGL的问题。) 我试图将着色器的文本从EXE中存储的资源加载到内存中 以下是相关的代码片段: 我从何处调用函数: void SetupDisplay() { UINT vShader = LoadShaderResource (VERTEX1, GL_VERTEX_SHADER); UIN

好吧,我想我知道怎么了,但我不知道如何解决这个问题

LoadResource正在从多个资源返回文本

(这些是由MINGW的“winres”实用程序编译到my 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);
<> >,这就是C++代码,现在是资源的:

资源中心

// 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"
现在是着色器的文本。(记住,这不是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包含两个着色器,而BEGIN 120不包含这两个着色器。 当然,110中的两个着色器都是爆炸性的。我不明白的是,它们在哪里 它从110中获得两个着色器


这里发生了一些我不明白的事情,但我不知道接下来要看什么。

LoadTextFileResource()
中,您使用
std::string::operator=(const char*)将资源数据复制到
std::string
。此运算符假定字符串以
null
结尾。但您给它的指针不一定指向以
null
结尾的字符串。若要解决此问题,您需要调用
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;
}

Brr,在背面打勾时要小心。@Hans Erm,我听到了,但是
null
null
非空的。我注意到背面打勾也让我很不舒服,比我在其他在线文档中写的要多。可能是样式表更不合适吗?我想用单间距字体而不是不同的背景色会是一个好主意眼睛容易多了。答对了!我不知道SizeofResource或.assign for string。我知道这与null有关,但我不知道需要做什么来修复它。谢谢!!!我只知道…你用back tick指的是什么?谢谢。@Quade2002 back tick与grave accent ``相同。其中一对用于封装代码框架所以它看起来像这个而不是这个。
#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
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;
}