cmemfile 예제

Posted by adminfeira - 2 agosto, 2019 - Sin categoría - No Comments

GlobalAlloc는 malloc에서 반환하는 포인터와 같이 메모리에 대한 포인터가 아닌 HGLOBAL 핸들을 반환합니다. 특정 응용 프로그램에서는 HGLOBAL 핸들이 필요합니다. 예를 들어 클립보드에 데이터를 넣려면 HGLOBAL 핸들이 필요합니다. 소켓에서 직렬화하는 것은 조금 더 복잡합니다. 소켓에서 큰 이진 데이터 집합을 올바르게 읽는 방법을 보여 주는 클래스의 전체 목록을 제공합니다. 전체 소스 코드 목록은 예제 프로젝트 SerializeTcpServer를 참조하십시오. 공유 메모리 파일은 GlobalAlloc Windows 함수와 함께 할당되는 메모리의 다른 메모리 파일과 다릅니다. CSharedFile 클래스는 전역적으로 할당된 메모리 블록(GlobalAlloc을 사용하여 만든)에 데이터를 저장하며, 이 메모리 블록은 IDataObject를 사용하여 DDE, 클립보드 또는 기타 OLE/COM 균일한 데이터 전송 작업을 사용하여 공유할 수 있습니다. bAllowGrow가 0이 아닌 경우 메모리 블록의 크기보다 파일에 더 많은 바이트를 작성하려는 경우 와 같이 필요에 따라 메모리 블록의 크기가 증가합니다.

이제 이 솔루션은 MFC 직렬화 메커니즘의 단점을 해결합니다. 이 예제에서는 멤버 변수 정적 클래스CBase::m_wSchema를 통해 기본 클래스 스키마에 액세스할 수 있습니다. CSockThread* m_pThread; 구현은 예제 프로젝트 SerializeTcpServer에 제공됩니다. 클립보드에서 직렬화하는 것은 이전 예제를 약간 수정한 것입니다. 임의 바이트 스트림은 기본적으로 내부 구조에 대해 모르거나 신경 쓰지 않는 모든 바이너리 파일입니다. 예를 들어 기본 데이터 구조에 대한 지식 없이 클래스 데이터 내부에 JPEG 이미지 또는 mpeg 4 동영상 파일을 저장하려는 경우를 들 수 있습니다. 나중에 직렬화하고 적절한 응용 프로그램과 함께 사용할 수 있습니다. MFC 직렬화를 사용하면 이러한 데이터를 쉽게 저장할 수 있습니다. 오늘날의 응용 프로그램에서는 OnReceive 호출 하나로바이너리 또는 텍스트 데이터의 모든 전송을 거의 받지 못합니다. 따라서 모든 데이터를 바이트 배열에 축적해야 합니다. 그런 다음에야 누적된 CByteArray를 CMemFile에 연결하여 직렬화할 수 있습니다.

위의 예제에서는 IOCtl(FIONREAD, dwReceived)을 호출하여 더 많은 데이터가 인바운드되는지 확인합니다. 경험상 읽기 버퍼는 65536 바이트와 같기 때문에 읽기 버퍼보다 큰 데이터가 전송되므로 두 개 이상의 읽기가 발생합니다.