2012-01-05 4 views
2

에 난 창문 콘솔 응용 프로그램 (C++)로 바이너리 파일을 포함하기 위해 노력하고있어lockResource는() 포인터를 반환하지만 알 수없는 구조체

윈도우 7에서 Visual Studio 2003과 함께 일하고 있어요. 내가 리소스 스크립트 (.RC 파일) 다음 줄에 추가 :

SampleFile RCDATA "c:\\sample.zip" 

또한 파일에 액세스하려면 다음 코드를 추가 : 지금

HRSRC hResource = FindResource(NULL, (LPCSTR)"SampleFile", RT_RCDATA); 
LPVOID l = LockResource(hResource); 

을 hResource 유효한 핸들 및 LockResource입니다 또한 성공하지만 포인터 l은 어떤 구조체, 아마 머리말을 가리키며, 그 뒤에는 내가 삽입하려고했던 zip 파일의 실제 데이터가옵니다. 위의 두 번째 DWORD가 파일의 크기이고 리소스 이름 ("SampleFile")도 헤더에 나타나지만 헤더의 설명을 찾을 수 없었습니다. 적어도 헤더 크기.

+7

FindResource(), ** LoadResource() **, LockResource()가 필요합니다. – Luke

+1

이것을 확장하기 위해, 나는 'LockResource()'가 Win32에서 거의 작동하지 않는다고 믿는다. [역사적 이유] (http://blogs.msdn.com/b/oldnewthing/archive/2004/02/02/66159.aspx)로 인해 Deanna

답변

0

리소스의 크기를 가져 오는 API 함수는 SizeofResource입니다. 파일의 시작 부분에
포인터 포인트 ("C 귀하의 경우 : \ sample.zip) 리소스로 추가. 당신이 압축 해제 라이브러리에 그 포인터를 전달하거나 디스크에 기록 할 수 원하는 경우

+0

SizeOfResource 함수를 알고 있습니다. 그러나, 내 질문에 말했듯이, LockResource에 의해 반환 된 포인터는 파일의 데이터를 가리 키지 않습니다. 그것은 어떤 구조체를 가리 킵니다. 그것은 .zip 파일뿐만 아니라 모든 파일 유형과 같습니다. – user1132301

+0

질문을 읽어보십시오. 내부 헤더가 없습니다. ResHacker에서 파일을 열어보고 원하는 리소스가 있는지 확인하십시오. 그런 다음 MAKEINTRESOURCE를 사용했는지 확인하십시오. 이름 ((LPCSTR) "SampleFile")은 실행 파일에 저장되지 않습니다. 'FindResource'가 어떻게 성공했는지는 알 수 없습니다. – cprogrammer

3

. 누가 말했듯이, 당신은 중간에 LoadResource() 전화를 놓치고있어.

FindResource()하는 것은 본질적으로 당신에게 포인터를 제공/자원 헤더 처리, LoadResource()는 헤더를 읽고 당신에게 (는 Win32에서)이 데이터를 가리키는하는 값을 제공합니다 그 자체는 아니지만 메모리에서 이동할 수있는 HGlobal이었습니다. 그런 다음이 위치를 잠그고 LockResource()을 사용하여 포인터를 가져옵니다.

사용법은 Win32에서도 동일하게 유지됩니다. MSDN

에서

은 (때문에) findResource 또는 FindResourceEx 함수에 의해 반환 된 핸들을 사용하여 리소스를 잠글하지 마십시오. 이러한 핸들은 임의의 데이터를 가리 킵니다.

리소스 헤더는 가상의 RESOURCEHEADER 구조로 MSDN에 설명되어 있습니다.

이 응답

크게 도움을 16-bit resource management

0

덕분에 레이몬드 첸의 기사에서 가져옵니다. 사실 저는 사이트에 복사 붙여 넣기에서 손실 된 내 코드에 LoadResource가 있습니다. 그러나 이는 내 코드의 문제와 관련이 있습니다. 코드는 다음과 같습니다. (이번에 Psuedo code) HANDLE hFindHandle = FindResource (...); LoadResource (hFindHandle 및 Module Handle); 다음 LPVOID l = LockResource (hFindHandle);

LoadResource에서 반환 된 값을 사용하지 않았지만 FindResource에서 반환 된 값을 사용하고 있으므로 LoadResource를 호출했지만 LockResource에서 올바른 포인터를 얻지 못했습니다.

+0

정확하게 편집 된 하위 세트/코드 조각이 아닌 정확한 코드를 복사하여 붙여 넣어야하는 이유가 바로 여기에 있습니다. – Deanna

관련 문제