【问题标题】:How to load text file from Resources in VC++?如何在 VC++ 中从资源中加载文本文件?
【发布时间】:2010-12-03 10:13:05
【问题描述】:

我正在用 VC++ 编写一个 DLL,我需要使用外部文本文件。我现在有这样的事情:

 ifstream file;
 string line;

 file.open("C:\\Users\\Me\\Desktop\\textfile.txt");
 getline(file,line);
 file.close();

我知道我可以在资源中拥有这个文件,对吗?

我通过转到“ResourceView”->“Add Resource”->“Import”添加了我的文本文件。我选择了我的文本文件并创建了自定义资源类型。

如何访问此文件以使用类似于上面的代码?我有 Resource.h 但我应该怎么做? 我也可以编辑我的资源文本文件吗?

【问题讨论】:

    标签: visual-c++ dll resource-dll


    【解决方案1】:

    假设:

    • 资源类型为“TEXT”
    • 资源 ID 是 MY_RESOURCE_ID(这将是您的 resource.h 中的常量)
    • 您已将 EXE 或 DLL(以包含资源的任何一个)的 hInstance 存储到 m_hInstance 中。

    将资源加载到内存中并获取指向它的指针是这样完成的:

    HRSRC hResource = FindResource(m_hInstance, MAKEINTRESOURCE(MY_RESOURCE_ID), L"TEXT");
    
    if (hResource)
    {
        HGLOBAL hLoadedResource = LoadResource(m_hInstance, hResource);
    
        if (hLoadedResource)
        {
            LPVOID pLockedResource = LockResource(hLoadedResource);
    
            if (pLockedResource)
            {
                DWORD dwResourceSize = SizeofResource(m_hInstance, hResource);
    
                if (0 != dwResourceSize)
                {
                     // Use pLockedResource and dwResourceSize however you want
                }
            }
        }
    }
    

    注意:在 32 位或 64 位版本的 Windows 上,您不必卸载或解锁资源,并且如果您再次获得该资源,您将不会泄漏内存;你总是得到相同的记忆。

    要更新资源,请参阅Updating Resources in MSDN

    【讨论】:

    • 谢谢!这就是我一直在寻找的。我正在使用 ATL,所以我将 _AtlBaseModule.m_hInst 放在 hInstance 位置,它运行良好。我想知道如何像文件或流一样使用这块内存。如果你知道请在这里回答:stackoverflow.com/questions/4346240
    • @CichyK24 流在 IStream 中还是其他类型的流?
    • 哦,就像一个 ifstream;不知道,抱歉。
    • 您好!我有关于更新资源的小question。可以看看吗?
    • 亲爱的 Leo,在类似的情况下,我如何在 C++ 代码中获取文件名的名称?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-13
    • 1970-01-01
    • 2013-03-22
    • 1970-01-01
    • 2021-03-06
    • 1970-01-01
    相关资源
    最近更新 更多