KnowledgeBase Archive

An Archive of Early Microsoft KnowledgeBase Articles

View on GitHub

Q301242: HOW TO: Share Memory-Mapped Objects Between Processes in Win CE

Article: Q301242
Product(s): Microsoft C Compiler
Version(s): 3.0
Operating System(s): 
Keyword(s): kbDSupport kbAudDeveloper kbHOWTOmaster
Last Modified: 15-FEB-2002

-------------------------------------------------------------------------------
The information in this article applies to:

- Microsoft Windows CE eMbedded Visual C++, version 3.0 
-------------------------------------------------------------------------------

IN THIS TASK
------------

- SUMMARY

   - Requirements
- Sharing Data Between Processes Using Memory-Mapping
- Troubleshooting

- REFERENCES

SUMMARY
=======

You can use a memory-mapped object to share data between processes. This article
shows you how to share data between processes by using memory-mapping in
Microsoft Windows CE.

Requirements
------------

The following list outlines the recommended hardware, software, network
infrastructure, and service packs that you will need:

- Microsoft Windows CE device

- Microsoft Windows 2000 or Windows NT 4.0 Workstation with SP5 or later.

- Microsoft eMbedded Visual C++ version 3.0 (formerly known as the Microsoft
  Windows CE Toolkit for Visual C++ version 6.0)

Sharing Data Between Processes Using Memory-Mapping
---------------------------------------------------

1. Call the CreateFileMapping function to create the memory object, using the
  lpFileName parameter to pass in a name for the memory-mapped object:

  HANDLE CreateFileForMapping(LPCTSTR lpFileName,
        DWORD dwDesiredAccess, 
        DWORD dwShareMode, 
        LPSECURITY_ATTRIBUTES lpSecurityAttributes, 
        DWORD dwCreationDisposition, 
        DWORD dwFlagsAndAttributes,
        HANDLE hTemplateFile);

  The file name is the name of the file to read. The dwDesiredAccess parameter,
  specifying the access rights to the file, must be either zero or
  GENERIC_READ. The security attributes must be NULL, while the hTemplateFile
  parameter is ignored by Windows CE. In addition, CreateFileForMapping can
  only be called once on a file that is opened in GENERIC_WRITE mode.

  NOTE: Windows CE-based applications must use this function when opening files
  for memory-mapped use instead of using CreateFile as is used with Microsoft
  Windows NT or Microsoft Windows 98. The parameters for this function are
  similar to those for CreateFile.

2. Pass the name of the memory-mapped object to the process with which you want
  to communicate.

3. Call the CreateFileMapping function in the second process, using the name of
  the object that you passed with the first object. The name of the
  memory-mapped object is global. When the second process calls the
  CreateFileMapping function, Windows CE passes back the handle to the original
  object.

4. Use the MapViewOfFile function in either process to gain access to the
  memory-mapped object. A view is created by a call to MapViewOfFile to return
  a pointer to the memory-mapped file.

When using memory-mapped files for interprocess communication, processes should
pass the name of the region to the second process, not to a pointer. The second
process should create a memory-mapped object with the same name as the initial
process. The name of the region is passed in CreateFileMapping. If another
process opens a memory-mapped file with the same named object, Windows CE knows
to pass a pointer to the same region that was opened by the first process. The
system also increments a use count to track the number of opens. This assures a
process that the object will remain at least until it closes the object itself.

Troubleshooting
---------------

Do not create an unnamed object and pass a memory pointer to the different
processes; one process can close the unnamed object without informing the other
process. To avoid this memory error, Windows CE supports naming the unnamed
object. Instead of passing a pointer to the object, you can pass the name of the
object. The other process then accesses the object through its name. Accessing
the object through the name informs Windows CE which processes have access to
the object. Windows CE then deletes the object only when both processes have
closed the object.

REFERENCES
==========

For more information, see the Microsoft Windows CE 3.0 Software developer
documentation at the following MSDN Web site:

  http://msdn.microsoft.com/library/default.asp?URL=/library/wcedoc/wceintro/cestart.htm
  (http://msdn.microsoft.com/library/default.asp?URL=/library/wcedoc/wceintro/cestart.htm)

Additional query words:

======================================================================
Keywords          : kbDSupport kbAudDeveloper kbHOWTOmaster 
Technology        : kbVCsearch kbAudDeveloper kbWinCEETKSearch kbWinCESearch kbWinCEETK300VC
Version           : :3.0
Issue type        : kbhowto

=============================================================================

THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY.

Copyright Microsoft Corporation 1986-2002.