读取dll文件中的文本文件

时间:2016-03-14 13:27:06

标签: c++ dll unity3d shader

设置

Microsoft Visual Studio Professional 2015 ,在 Windows 10 Pro 上运行 Unity 5.3.1f1(x64)
该项目建立在Unity提供的示例项目的基础上site.可以找到项目here.

需要完成的事情

我正在研究创建一个与Unity一起使用的opengl插件(以dll的形式)。在他们的示例代码中,顶点片段着色器在代码中是硬编码的,如下所示:

#define VPROG_SRC(ver, attr, varying)                               \
    ver                                                             \
    attr " highp vec3 pos;\n"                                       \
    attr " lowp vec4 color;\n"                                      \
    "\n"                                                            \
    varying " lowp vec4 ocolor;\n"                                  \
    "\n"                                                            \
    "uniform highp mat4 worldMatrix;\n"                             \
    "uniform highp mat4 projMatrix;\n"                              \
    "\n"                                                            \
    "void main()\n"                                                 \
    "{\n"                                                           \
    "   gl_Position = (projMatrix * worldMatrix) * vec4(pos,1);\n"  \
    "   ocolor = color;\n"                                          \
    "}\n"                                                           \

我不喜欢这种方法,我不需要它的灵活性。因此,我想将每个着色器放在自己的文件中,并使用以下代码加载文件。

const char* ShaderLoader::ReadShader(char *filename)
{
    std::string shaderCode;
    std::ifstream file(filename, std::ios::in);

    if (!file.good())
    {
        std::cout << "Can't read file " << filename << std::endl;
        return nullptr;
    }

    file.seekg(0, std::ios::end);
    shaderCode.resize((unsigned int)file.tellg());
    file.seekg(0, std::ios::beg);
    file.read(&shaderCode[0], shaderCode.size());
    file.close();

    return shaderCode.c_str();
}

问题

我项目的输出是 .dll 文件,我希望我的两个着色器包含在该文件中,可以加载它们。也许这是不可能的,我不知道 我已将着色器添加到项目中。我还右键单击了每个文件并选择了包含在项目中

我不知道两个文件的最终位置。它们是否包含在 dll 文件中,如果是,我需要将哪条路径传递给ShaderLoader::ReadShader才能阅读它们?

我尝试使用GetModuleFileNameFindFirstFile来解决这个问题,但没有成功。

所以最终的问题是:是否可以在使用Visual Studio构建的dll库中包含文本文件,如果是这样,我该怎么做呢?

1 个答案:

答案 0 :(得分:2)

当然它可以从DLL中读取文件,但不使用您的代码。这里的问题是你返回一个指向数据的指针,当函数返回时它将消失。

变量shaderCodeReadShader函数中的局部变量,因此当函数返回时它当然会被破坏。该破坏包括释放用于包含的字符串的内存,因此您返回的指针指向不再分配的数据,并且尝试使用该数据将导致未定义的行为

而是返回实际的std::string对象,并在实际需要时获取指针。或者(但不是我推荐的东西)自己分配内存并将字符串复制到内存中,并返回指向该内存的指针。