读取 dll 文件中的文本文件

Reading text files in a dll file

本文关键字:文件 文本 读取 dll      更新时间:2023-10-16

设置

Microsoft Visual Studio Professional 2015,运行在Windows 10 Pro
Unity 5.3.1f1 (x64)
该项目基于 Unity 在其网站上提供的示例项目构建。该项目可以在这里找到。

<小时 />

需要做的事情

我正在考虑创建一个用于 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库中包含文本文件,如果是的话,我该怎么做?

当然,

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

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

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