Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to load text file from Resources in VC++?

I'm writing a DLL in VC++ and I need to use external text file. I have something like this right now:

 ifstream file;
 string line;

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

I understand that I can have this file in Resources right?

I added my text file by going to "ResourceView" -> "Add Resource" -> "Import". I chose my text file and created custom resource type.

How can I access to this file to use similarly to the code above ? I have Resource.h but what should I do with it? Can I edit my resource text file too?

like image 401
Mariusz Pawelski Avatar asked Dec 03 '10 10:12

Mariusz Pawelski


People also ask

How do I add embedded resources to Visual Studio?

Open Solution Explorer add files you want to embed. Right click on the files then click on Properties . In Properties window and change Build Action to Embedded Resource . After that you should write the embedded resources to file in order to be able to run it.


1 Answers

Assumptions:

  • The resource type is "TEXT"
  • The resource ID is MY_RESOURCE_ID (this would be a constant from your resource.h)
  • You have stored the hInstance for your EXE or DLL (whichever contains the resource) into m_hInstance.

Loading a resource into memory and getting a pointer to it is done like this:

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
            }
        }
    }
}

Note: You do not have to unload or unlock the resource on 32-bit or 64-bit vesions of Windows, and if you obtain the resource again you will not leak memory; you always get the same piece of memory.

For updating a resource, see Updating Resources in MSDN.

like image 125
Leo Davidson Avatar answered Oct 16 '22 01:10

Leo Davidson