The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.

NAME

Win32::MMF - Win32 Memory Mapped File (MMF) Support for Perl

SYNOPSIS

  use Win32::MMF;

  $debugmode = GetDebugMode();          # 0 - off, 1 - on
  SetDebugMode($debugmode);

  $fh = CreateFile($filename);          # Create new swap file
  $fh = OpenFile($filename);            # Open existing swap file
  CloseHandle($fh);                                 # Close openned swap file handle

  $ns = CreateFileMapping($fh, $filesize, $namespace);
  $ns = OpenFileMapping($namespace);    # Use existing namespace
  CloseHandle($ns);                                     # Close openned namespace

  $var = MapViewOfFile($ns, $offset, $size)     # Create a view inside the namespace
  UnmapViewOfFile($var);                                # Delete the view

  Poke($var, $str, length($str));       # Store a string into view
  $str = Peek($var);                        # Retrieve a string from the view

  PokeIV($var, $i);                                 # Store a number(long) into view
  $i = PeekIV($var);                        # Retrieve a number from the view

  # High-level Namespace Functions

  # claim a swapfile to use as namespace
  ($swp, $ns) = ClaimNamespace($swapfile, $namespace [, $size]);

  ReleaseNamespace($swp, $namespace);

  $ns = UseNamespace($namespace);  # use existing namespace

ABSTRACT

This module provides Windows' native Memory Mapped File Service for inter-process or intra-process communication under Windows. The module is written in XS and is currently supported only under Windows NT/2000/XP.

The current version of Win32::MMF is available on CPAN at:

  http://search.cpan.org/search?query=Win32::MMF

CREDITS

All the credits go to my beloved wife Jenny and son Albert, and I love them forever.

DESCRIPTION

  use strict;
  use warnings;
  use Win32::MMF;

  # define a swap file
  my $swapfile = undef;
  my $namespace = 'MyMMF.MyString';

  # fork a process
  defined(my $pid = fork()) or die "Can not fork a child process!";

  if ($pid) {
      # in parent

      # claim a namespace of default 64K size
      my ($swap, $ns) = ClaimNamespace($swapfile, $namespace);

      # create a view of 100 bytes inside the namespace
      my $view = MapViewOfFile($ns, 0, 100);

      my $str = "This is a test";

      print "Write: $str\n";
      Poke($view, $str, length($str));

      sleep(3);

      UnmapViewOfFile($view);
      ReleaseNamespace($swap, $ns);
  } else {
      # in child

      sleep(1);   # wait for parent to finish writing

      # use an existing namespace
      my $ns = UseNamespace($namespace) or die "Namespace $namespace not found";

      # create a view of 100 bytes inside the namespace
      my $view = MapViewOfFile($ns, 0, 100);

      my $str = Peek($view);
      print "Read: $str\n";

      UnmapViewOfFile($view);
      ReleaseNamespace(undef, $ns);
  }

AUTHOR

Roger Lee <roger@cpan.org>