Top

cmemfile 예제

위의 예제의 개체 스키마는 코드의 로드 섹션을 완료할 때까지 4번 변경되었습니다. 내 생각엔 MFC 프레임 워크가 귀중한 데이터가 왜 멀리 호스에 대해 머리를 긁적 하는 대신 바로 소스에서 짧게 잘라하기로 결정 미묘한 잘못된 행동을 제거하는 것입니다. 왜 이것이 그렇게? 내 게 가장 좋은 레거시 문제를 추측. 멤버 변수 CArchive::m_nObjectSchema는 CArchive 개체 스키마가 많은 스키마가 있는 많은 개체를 포함할 수 있는 파일에서 CArchive 개체 스키마를 읽는 방식으로 CRuntimeClass::m_wSchema와 매우 다릅니다. 현재 파일에서 읽히는 개체의 스키마를 보유합니다. 그것에 대해서 생각해 봐. 다음 예제와 같은 개체를 직렬화하지 않을 때(가설적으로 m_nObjectSchema가 혼자 남습니다): 이것은 덜 우아한 솔루션이지만 작동하며 모든 놀라움을 제거합니다. 위의 예제에서 이 코드는 다음과 같습니다: CSockThread* m_pThread; 구현은 예제 프로젝트 SerializeTcpServer에 제공됩니다. 일반 오래된 데이터는 다소 간단하게 처리됩니다. 플로트 데이터 형식을 읽고 쓰는 예는 다음과 같습니다: 드래그/드롭의 생성에 대한 코드는 클립보드에 데이터를 배치하는 예제와 동일하며 한 번의 수정만으로 도모합니다.

SetClipboard() 명령을 실행하는 대신 DoDragDrop() 명령을 실행해야 합니다. 클립보드에서 직렬화하는 것은 이전 예제를 약간 수정한 것입니다. 임의 바이트 스트림은 기본적으로 내부 구조에 대해 모르거나 신경 쓰지 않는 모든 바이너리 파일입니다. 예를 들어 기본 데이터 구조에 대한 지식 없이 클래스 데이터 내부에 JPEG 이미지 또는 mpeg 4 동영상 파일을 저장하려는 경우를 들 수 있습니다. 나중에 직렬화하고 적절한 응용 프로그램과 함께 사용할 수 있습니다. MFC 직렬화를 사용하면 이러한 데이터를 쉽게 저장할 수 있습니다. 이제 이 솔루션은 MFC 직렬화 메커니즘의 단점을 해결합니다. 이 예제에서는 멤버 변수 정적 클래스CBase::m_wSchema를 통해 기본 클래스 스키마에 액세스할 수 있습니다. 지금까지의 모든 예제는 복사 작업이 호출된 것처럼 클립보드에 데이터를 배치하고 있습니다. 드래그/드롭을 사용하도록 설정하는 것은 위의 코드를 간단하게 변경할 수 있습니다. 오늘날의 응용 프로그램에서는 OnReceive 호출 하나로바이너리 또는 텍스트 데이터의 모든 전송을 거의 받지 못합니다.

따라서 모든 데이터를 바이트 배열에 축적해야 합니다. 그런 다음에야 누적된 CByteArray를 CMemFile에 연결하여 직렬화할 수 있습니다. 위의 예제에서는 IOCtl(FIONREAD, dwReceived)을 호출하여 더 많은 데이터가 인바운드되는지 확인합니다. 경험상 읽기 버퍼는 65536 바이트와 같기 때문에 읽기 버퍼보다 큰 데이터가 전송되므로 두 개 이상의 읽기가 발생합니다. bAllowGrow가 0이 아닌 경우 메모리 블록의 크기보다 파일에 더 많은 바이트를 작성하려는 경우 와 같이 필요에 따라 메모리 블록의 크기가 증가합니다. 오늘날의 MFC 라이브러리에서 위의 예조차도 바보 같은 증거입니다. CArchive:ReadObject에서 목록 소켓에서 다음 코드 직렬화를 가지고 있는 것은 조금 더 복잡합니다. 소켓에서 큰 이진 데이터 집합을 올바르게 읽는 방법을 보여 주는 클래스의 전체 목록을 제공합니다. 전체 소스 코드 목록은 예제 프로젝트 SerializeTcpServer를 참조하십시오. 파일을 늘릴 수 없으므로 CMemFile이 파일을 늘리려고 시도하지 않도록 주의하십시오. 예를 들어 CFile:Write의 CMemFile 재정의를 호출하지 말고 끝을 지나서 작성하거나 nBufferSize보다 긴 길이의 CFile:SetLength를 호출하지 마십시오.

GlobalAlloc는 malloc에서 반환하는 포인터와 같이 메모리에 대한 포인터가 아닌 HGLOBAL 핸들을 반환합니다. 특정 응용 프로그램에서는 HGLOBAL 핸들이 필요합니다. 예를 들어 클립보드에 데이터를 넣려면 HGLOBAL 핸들이 필요합니다.