programing

네이티브 Windows 응용 프로그램의 리소스에 텍스트 파일 삽입

goodcopy 2023. 1. 30. 22:23
반응형

네이티브 Windows 응용 프로그램의 리소스에 텍스트 파일 삽입

C++ Windows 프로그램을 사용하고 있습니다.데이터가 있는 텍스트 파일이 있습니다.현재 텍스트 파일은 별도의 파일로 실행 시 로드되어 구문 분석됩니다.이를 리소스로 바이너리에 포함시키는 것이 어떻게 가능합니까?

네이티브 윈도 어플리케이션에서 작업하고 있기 때문에 텍스트파일의 내용을 컴파일된 리소스에 삽입하기 위한 사용자 정의 리소스를 만듭니다.

사용자 정의 리소스의 형식은 로드하는 함수와 마찬가지MSDN에 문서화되어 있습니다.

다음과 같이 텍스트 파일을 리소스 파일에 포함합니다.

nameID typeID filename

어디에nameID는 자원을 식별하는 고유한 16비트 부호 없는 정수입니다.typeID리소스 유형을 식별하는 255보다 큰 고유한 16비트 부호 없는 정수입니다(이러한 정수는 에서 정의할 수 있습니다).resource.h파일)을 클릭합니다.filename는 컴파일된 리소스에 바이너리 콘텐츠를 삽입할 파일의 경로입니다.

예를 들어 다음과 같습니다.

resource.h:

// Other defines...

#define TEXTFILE        256
#define IDR_MYTEXTFILE  101

리소스 파일:

#include "resource.h"

// Other resource statements...

IDR_MYTEXTFILE TEXTFILE "mytextfile.txt"

그런 다음 다음과 같이 로드합니다(오류 검사 코드는 명확하게 하기 위해 생략).

#include <windows.h>
#include <cstdio>
#include "resource.h"

void LoadFileInResource(int name, int type, DWORD& size, const char*& data)
{
    HMODULE handle = ::GetModuleHandle(NULL);
    HRSRC rc = ::FindResource(handle, MAKEINTRESOURCE(name),
        MAKEINTRESOURCE(type));
    HGLOBAL rcData = ::LoadResource(handle, rc);
    size = ::SizeofResource(handle, rc);
    data = static_cast<const char*>(::LockResource(rcData));
}

// Usage example
int main()
{
    DWORD size = 0;
    const char* data = NULL;
    LoadFileInResource(IDR_MYTEXTFILE, TEXTFILE, size, data);
    /* Access bytes in data - here's a simple example involving text output*/
    // The text stored in the resource might not be NULL terminated.
    char* buffer = new char[size+1];
    ::memcpy(buffer, data, size);
    buffer[size] = 0; // NULL terminator
    ::printf("Contents of text file: %s\n", buffer); // Print as ASCII text
    delete[] buffer;
    return 0;
}

리소스가 실행 파일의 바이너리에 있고 프로그램이 종료될 때 자동으로 삭제되므로 실제로 리소스를 해방할 필요가 없습니다.FreeResource()32비트 및 64비트 Windows 시스템에서는 아무것도 동작하지 않습니다).

데이터는 실행 가능한 바이너리에 존재하기 때문에 검색된 포인터를 통해 직접 수정할 수 없습니다(따라서LoadFileInResource()함수의 구현은 포인터를const char*)를 사용해야 합니다.BeginUpdateResource(),UpdateResource(),그리고.EndUpdateResource()기능을 합니다.

사용할 수 있습니다.xxd(Linux 머신 또는 아마도 sigwin에서) .h/.cc 파일의 데이터를 생성합니다.

이에 대해 자세히 설명하는 스택오버플로우 질문은 많이 있습니다.

언급URL : https://stackoverflow.com/questions/2933295/embed-text-file-in-a-resource-in-a-native-windows-application

반응형