1
0

fileshrd.cpp 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. // This is a part of the Microsoft Foundation Classes C++ library.
  2. // Copyright (C) 1992-1998 Microsoft Corporation
  3. // All rights reserved.
  4. //
  5. // This source code is only intended as a supplement to the
  6. // Microsoft Foundation Classes Reference and related
  7. // electronic documentation provided with the library.
  8. // See these sources for detailed information regarding the
  9. // Microsoft Foundation Classes product.
  10. #include "stdafx.h"
  11. #ifdef AFX_CORE4_SEG
  12. #pragma code_seg(AFX_CORE4_SEG)
  13. #endif
  14. #ifdef _DEBUG
  15. #undef THIS_FILE
  16. static char THIS_FILE[] = __FILE__;
  17. #endif
  18. #define new DEBUG_NEW
  19. ////////////////////////////////////////////////////////////////////////////
  20. // CSharedFile implementation
  21. CSharedFile::CSharedFile(UINT nAllocFlags, UINT nGrowBytes)
  22. : CMemFile(nGrowBytes)
  23. {
  24. m_nAllocFlags = nAllocFlags;
  25. m_hGlobalMemory = NULL;
  26. m_bAllowGrow = TRUE;
  27. }
  28. CSharedFile::~CSharedFile()
  29. {
  30. if (m_lpBuffer)
  31. Close(); // call appropriate Close/Free
  32. ASSERT(m_lpBuffer == NULL);
  33. }
  34. void CSharedFile::SetHandle(HGLOBAL hGlobalMemory, BOOL bAllowGrow)
  35. {
  36. ASSERT(m_hGlobalMemory == NULL); // do once only
  37. ASSERT(m_lpBuffer == NULL); // do once only
  38. ASSERT(m_nPosition == 0);
  39. m_hGlobalMemory = hGlobalMemory;
  40. m_lpBuffer = (BYTE*)::GlobalLock(m_hGlobalMemory);
  41. m_nBufferSize = m_nFileSize = ::GlobalSize(m_hGlobalMemory);
  42. m_bAllowGrow = bAllowGrow;
  43. }
  44. BYTE* CSharedFile::Alloc(DWORD nBytes)
  45. {
  46. ASSERT(m_hGlobalMemory == NULL); // do once only
  47. m_hGlobalMemory = ::GlobalAlloc(m_nAllocFlags, nBytes);
  48. if (m_hGlobalMemory == NULL)
  49. return NULL;
  50. return (BYTE*)::GlobalLock(m_hGlobalMemory);
  51. }
  52. BYTE* CSharedFile::Realloc(BYTE*, DWORD nBytes)
  53. {
  54. if (!m_bAllowGrow)
  55. return NULL;
  56. ASSERT(m_hGlobalMemory != NULL);
  57. ::GlobalUnlock(m_hGlobalMemory);
  58. HGLOBAL hNew;
  59. hNew = ::GlobalReAlloc(m_hGlobalMemory, nBytes, m_nAllocFlags);
  60. if (hNew == NULL)
  61. return NULL;
  62. m_hGlobalMemory = hNew;
  63. return (BYTE*)::GlobalLock(m_hGlobalMemory);
  64. }
  65. void CSharedFile::Free(BYTE*)
  66. {
  67. ASSERT(m_hGlobalMemory != NULL);
  68. ::GlobalUnlock(m_hGlobalMemory);
  69. ::GlobalFree(m_hGlobalMemory);
  70. }
  71. HGLOBAL CSharedFile::Detach()
  72. {
  73. HGLOBAL hMem;
  74. ASSERT(m_hGlobalMemory != NULL);
  75. hMem = m_hGlobalMemory;
  76. m_hGlobalMemory = NULL; // detach from global handle
  77. // re-initialize the CMemFile parts too
  78. m_lpBuffer = NULL;
  79. m_nBufferSize = 0;
  80. return hMem;
  81. }
  82. #ifdef AFX_INIT_SEG
  83. #pragma code_seg(AFX_INIT_SEG)
  84. #endif
  85. IMPLEMENT_DYNAMIC(CSharedFile, CMemFile)
  86. ////////////////////////////////////////////////////////////////////////////