c++ - एक डीएलएल फ़ाइल में पाठ फ़ाइलों को पढ़ना



dll unity3d (1)

बेशक यह डीएलएल से फाइल को पढ़ने के लिए काम करेगा, लेकिन आपके कोड का उपयोग नहीं कर रहा है। यहां समस्या ये है कि आप एक सूचक को उस डेटा पर वापस लौटाते हैं जो फ़ंक्शन रिटर्न के दौरान गायब हो जाएगा।

चर shaderCode ReadShader फ़ंक्शन के अंदर एक स्थानीय चर है, इसलिए फ़ंक्शन रिटर्न के बाद यह निश्चित रूप से नष्ट हो जाएगा। उस विनाश में निहित स्ट्रिंग के लिए उपयोग की जाने वाली स्मृति को शामिल करना शामिल है, इसलिए आपके द्वारा वापस आने वाला सूचक डेटा को अब आवंटित करने की ओर इशारा करता है और उस डेटा का उपयोग करने की कोशिश करने से अपरिभाषित व्यवहार हो जाएगा

इसके बजाय वास्तविक std::string ऑब्जेक्ट लौटें और पॉइंटर प्राप्त करें जब वास्तव में आवश्यक हो। वैकल्पिक रूप से (लेकिन वास्तव में ऐसा कुछ नहीं जो मैं सुझाता हूं) स्मृति को आवंटित करता है और स्ट्रिंग को स्मृति में कॉपी करता है, और उस पर एक सूचक वापस करता है

स्थापित करना

माइक्रोसॉफ्ट विज़ुअल स्टूडियो व्यावसायिक 2015 , विंडोज 10 प्रो पर चल रहा है
यूनिटी 5.3.1 एफ 1 (x 64)
परियोजना उनकी साइट पर एकता द्वारा प्रदान किए गए एक उदाहरण प्रोजेक्ट पर बनाई गई है परियोजना यहां पाई जा सकती है।

जो किया जाना चाहिए

मैं एकता के साथ उपयोग के लिए ओपनएल प्लगइन (डीएलएल के रूप में) बनाने में देख रहा हूं उनके उदाहरण कोड में शीर्ष और टुकड़े के टुकड़े को इस तरह कोड में कठिन कोडित किया जाता है:

#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 फ़ाइल है और मैं चाहता हूं कि मेरे दो शेडर उस फ़ाइल में शामिल हों, जहां वे लोड हो सकें। शायद यह संभव नहीं है, मुझे नहीं पता।
मैंने परियोजना के लिए शेडर जोड़ दिया है मैंने प्रत्येक फ़ाइल को सही भी क्लिक किया है और परियोजना में शामिल चुना है

मैं नहीं जानता कि जहां दो फाइलें खत्म हो रही हैं क्या उन्हें डीएलएल फ़ाइल में शामिल किया गया है और यदि मैं उन्हें पढ़ने के लिए ShaderLoader::ReadShader को पारित करने के लिए किस मार्ग की आवश्यकता है?

मैंने GetModuleFileName और FindFirstFile का उपयोग करके यह जानने की कोशिश की है, लेकिन सफलता के लिए नहीं।

तो अंततः सवाल यह है: क्या विजुअल स्टूडियो के साथ निर्मित डीएलएल पुस्तकालयों में टेक्स्ट फाइलों को शामिल करना संभव है और यदि ऐसा है तो मैं इसके बारे में कैसे जानूं?





shader