문제

Win32 API를 사용하여 파일에서 공유 메모리에 어떻게 쓸 수 있습니까?

이 코드가 있습니다.

hFile = CreateFile("input.map",
  GENERIC_READ | GENERIC_WRITE,
  FILE_SHARE_READ,
  NULL,
  OPEN_ALWAYS,
  FILE_ATTRIBUTE_NORMAL,
  NULL);

  hMapFile = CreateFileMapping(hFile,
  NULL,
  PAGE_READWRITE,
  0,
  0,
  TEXT("SharedObject"));

  lpMapAddress = (LPTSTR) MapViewOfFile(hMapFile,
  FILE_MAP_ALL_ACCESS,
  0,
  0,
  0);

  ReadFile(
  hFile,
  lpMapAddress,
  75,
  &bytesRead,
  NULL);

  sprintf((char*)lpMapAddress, "<output 1>");

  printf((char*) lpMapAddress);

그러나 printf 호출은 파일의 내용이 아닌 "<output 1>"만 반환합니다.

편집 : 문제를 발견했습니다. Sprintf를 호출 할 때 입력 파일에 글을 쓰고 있습니다. 하지만 난 왜 그런지 모르겠어 ...

도움이 되었습니까?

해결책

이것이 전체 코드 샘플입니까? 그것은 나에게 전화를 좋아해 보인다 sprintf 널 종료 된 문자열을 배치합니다 lpMapAddress, 파일에서 읽은 내용을 효과적으로 덮어 씁니다. 적어도 귀하의 목적 상 printf 성명.

읽은 내용의 첫 부분을 문자열로 교체하려면 "<output 1>", 파일을 읽은 후에이 작업을 수행 할 수 있습니다.

char *tmp = "<output 1>";
strncpy((char*)lpMapAddress, tmp, strlen(tmp));

문자열의 텍스트를 복사하지만 Null 터미네이터는 아닙니다.

다른 팁

그만큼 sprintf 후에 널을 저장합니다 <output 1>, 그리고 printf 첫 번째 널에서 멈 춥니 다.

(또한 임의의 파일을 형식으로 전달하는 것은 나쁜 생각입니다. printf. 그것이 포함되어 있다면 어떨까요? % 캐릭터? 그러나 그것은 또 다른 문제입니다.)

Sprintf를 호출 할 때 입력 파일에 글을 쓰고 있습니다. 하지만 난 왜 그런지 모르겠어 ...

그것이 무엇이기 때문입니다 MapViewOfFile 하다. 파일 내용을 메모리 블록과 연결합니다. 파일의 현재 내용은 메모리 블록에 나타나고 해당 메모리에 대한 변경 사항은 파일에 기록됩니다.

매핑 후 readfile을 호출 할 필요는 없다고 생각합니다. lpmapaddress에서 컨텐츠에 액세스하십시오.

그러나 MapViewoffile에 상수를 사용하면 메모리 파일 매핑을 사용하는 데 도움이되지 않습니다.

나는 당신이 여기에서 무엇을하고 있는지 정말로 이해하지 못합니다. 이전에 어떤 코드를 넣었는지는 중요하지 않습니다. 그 마지막 줄은 언제나 이전 "Sprintf"라인에서 버퍼에 배치 한 문자열을 반환합니다. 그 때문에 "<output 1>", 그렇습니다. 그것이 반환 될 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top