반응형
HGLOBAL hRe;
char* pText;

hRe=LoadResource(hInst,FindResource(hInst,MAKEINTRESOURCE(IDR_GG2),TEXT("GG")));

pText=(char*)LockResource(hRe);
MessageBox(NULL,pText,"dfd",MB_OK);

FreeResource(hRe);

사용자 리소스를 사용하기 위해서는 리소스 타입를 Custom...에서 이름을 지정해주어야 한다

본인은 위체서 처럼 "GG"라는 이름으로 타입을 지정했다.

리소스를 사용하기 위해서는 일단 해당 리소스를 찾고 로딩하고.. 사용하게 된다.

HRSRC hResc=FindResource(hInst,MAKEINTRESOURCE(IDR_GG2),TEXT("GG"));

는 리소스를 찾는 과정으로 반환값은 HRSRC라는 이름의 핸들러다. 이때 필요한 정보는 인스턴스, 리소스 ID와 소속 타입...(실제론 모든 리소스를 접근하는 표준 방법임)

찾는후에 로딩하는 과정은

HGLOBAL hRe=LoadResource(hInst,hResc);

위와 같이 로딩을 한후에 실제로 사용하기 위해서는 LockResource와 FreeResource를 사용해서 메모리에 실제적으로 적재하거나 해제하는 작업을 시행한다.

char* pText=(char*)LockResource(hRe);
MessageBox(NULL,pText,"dfd",MB_OK);

FreeResource(hRe);

결국 LockResource를 호출하게 되면 해당 데이타에 대한 포인터를 반환하면 적당히 원하는 타입으로 변경하면 된다. 위의 경우엔 char* 로 했다.

사용후에는 hRe를  FreeResource해주면 된다.


OS에서는 메모리가 부족하면 자동으로 리소스 부분을 메모리에서 제거한다. 즉 필요할때 로딩을 언제든지 할수 있으며, 리소스는 메모리 문제로 인해서 제거될수 있는 유동적인 존재다.


따라서 실제 로딩을 하는 것은 LockResource이며 없다면 다시 로딩을 시행할 것이다. 있다면 존재하는 녀석을 반환하게 될 것이다.


FreeResource는 메모리에서 완벽한 제거가 아니라, 메모리가 부족하면 언제든지 메모리에서 제거될수 있다는 것을 부여한다고 보면 되겠다.
-----------------------------------------------------------------------------------------------------

HRSRC FindResource( HMODULE hModule,LPCTSTR lpName,LPCTSTR lpType)


hModule:리소스를 가진 모듈 핸들

lpName:리소스 이름

lpType:리소스 타입


리턴:리소스 핸들 리턴 

ex)FindResource( g_hInstance,MAKEINTRESOURCE(IDR_SPR_TML),"TML" );



숫자로 정의된 리소스 이름을 문자열 형태로 바꿔주는 매크로 ex)MAKEINTRESOURCE(IDR_SPR_TML)  

-------------------------------------------------------------------------------------
SizeofResource 함수는 지정된 리소스의 바이트 단위 크기를 반환한다.

DWORD SizeofResource(
  HMODULE hModule, // resource-module handle
HRSRC hResInfo // resource handle );

Parameters

hModule
그 리소스를 포함하고 있는 실행가능한 파일의 모듈에 대한 핸들
hResInfo
리소스의 핸들. 이 핸들은 FindResource 나 FindResourceEx 함수를 사용해서 생성되어야만 한다.

Return Values

만약 함수가 성공하면 반환값은 리소스의 바이트 숫자 크기이다.

만약 실패하면 반환값은 0이다. 확장된 에러 정보를 원하면 GetLastError을 호출하라.

QuickInfo

  Windows NT: Requires version 3.1 or later.
  Windows: Requires Windows 95 or later.
  Windows CE: Requires version 1.0 or later.
  Header: Declared in winbase.h.
  Import Library: Use kernel32.lib.
-------------------------------------------------------------------------------------

HGLOBAL LoadResource(HMODULE hModule, HRSRC hResInfo);
hModule: 해당 모듈 핸들
hResInfo : 잀을 리소스 핸들
리턴: 16비트 호환성을 위해 HCLOBAL핸들을 리턴하자민 이 핸들은 
실제로 전역 메모리
핸들이 아닌 단순한 핸들이다,
이렇게 읽은 리소스의 포인터를 얻으려면 LockResource()함수를
써야함...

-------------------------------------------------------------------------------------

LockResource 함수는 지정된 리소스를 메모리에서 잠근다

LPVOID LockResource(
  HGLOBAL hResData   // handle to resource to lock
);
 

Parameters

hResData
잠겨질 리소스의 핸들. LoadResource 함수는 이 핸들을 리턴한다

Return Values

만약 로드된 리소스가 잠기면, 반환값은 리소스의 첫번째 바이트의 포인터이다.
그렇지 않으면 NULL

Remarks

FindeResource 나 FindResourceEX 함수에 의해 반환된 핸들을 사용함으로써
리소스를 잠그려고 시도하면 동작하지 않을 것이다.
당신은 정확하지 않거나 불규칙한 데이터를 가리키는 값을 얻게 될 것이다.

accelerator table, bitmap, cursor, icon, menu 등의 사용을 끝내고
다음 표에 있는 함수 중 하나를 호출해 관련 메모리를 해제할 수 있다.

ResourceRelease function
Accelerator tableDestroyAcceleratorTable
BitmapDeleteObject
CursorDestroyCursor
IconDestroyIcon
MenuDestroyMenu

그것들을 생성한 프로세스가 종료 될 때 시스템은 이들
리소스를 자동으로 제거하지만, 적절한 함수를 호출하는 것은
메모리를 보호하고, 프로세스의 작업량을 줄여준다.

QuickInfo

  Windows NT: Requires version 3.1 or later.
  Windows: Requires Windows 95 or later.
  Windows CE: Requires version 1.0 or later.
  Header: Declared in winbase.h.
  Import Library: Use kernel32.lib.

+ Recent posts