<?xml version="1.0" encoding="windows-1252"?>
<node id="133647" title="Win32-API-Guid" created="2001-12-20 21:51:17" updated="2005-08-11 09:25:41">
<type id="1748">
sourcecode</type>
<author id="31739">
Rudif</author>
<data>
<field name="doctext">
&lt;p&gt;File Guid.pm

&lt;code&gt;

#! perl -w

package Win32::API::Guid;

require 5.005_62;
use strict;
use warnings;

require Exporter;

our @ISA = qw(Exporter);

# Items to export into callers namespace by default. Note: do not export
# names by default without a very good reason. Use EXPORT_OK instead.
# Do not simply export all your public functions/methods/constants.

# This allows declaration	use Win32::API::Guid ':all';
# If you do not need this, moving things directly into @EXPORT or @EXPORT_OK
# will save memory.
our %EXPORT_TAGS = ( 'all' =&gt; [ qw(	generate ) ] );
our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
our @EXPORT = qw( );
our $VERSION = '0.02';

use Win32::API;
my $CoCreateGuid = new Win32::API( "ole32.dll", "CoCreateGuid", [ 'P' ], 'N' );
 

sub generate {
	my ($n) = @_;
	$n = 1 if (!defined($n) || $n &lt; 1);
	my $guid = ' ' x 16;
	my $hr = $CoCreateGuid-&gt;Call( $guid );
	my ($guidData1, $guidData2, $guidData3, @guidData4) = unpack("LS2C8", $guid);
	my @guids;
	for (my $i = 0; $i &lt; $n; ++$i)	{
			my $guidstr = sprintf(
				"%08lx-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
				$guidData1, $guidData2, $guidData3, 
				$guidData4[0], $guidData4[1], $guidData4[2], $guidData4[3], 
				$guidData4[4], $guidData4[5], $guidData4[6], $guidData4[7]);
			push @guids, $guidstr;
			++$guidData1;
	}
	return wantarray? @guids : $guids[0];
}

1;

__END__

Win32::Guid - 
Perl extension to generate a GUID (or UUID) for use in COM or RPC

=head1 SYNOPSIS

  use Win32::Guid 'generate';
  my @guids = generate(3);
  my $guid = generate;

=head1 DESCRIPTION

This module provides a simple Win32::API wrapper for the COM function,
CoCreateGuid().  The module contains one function, generate(),
which returns 36-character long strings containing GUIDs.  These
look something like:

b09e53f4-60e9-41a6-8b30-526b69c28b5d

The parameter indicates the number of GUIDs to generate (the default is 1). 

In scalar context, returns a single guid, while in array context it 
returns the specified number guids in an array.
}

These can be used in a MIDL file for class, interface, or library
declarations, or in various other places related to COM.

=head1 INSTALL

Prerequisite: module Win32-API.
Simply copy this file to C:\Perl\site\lib\Win32\API\Guid.pm

=head1 AUTHOR

Rudi Farkas, rudif@lecroy.com

=head1 SEE ALSO

CoCreateGuid() in Win32 API documentation.

Win32::Guid module by Ken Bandes, kbandes@home.com

"Imitation is the sincerest form of flattery"
This module is functionally equivalent to Ken's, 
only using the Win32::API rather than an xs-generated dll.

=head1 COPYRIGHT

(c) 2001 Rudi Farkas. This file is Free Software; 
you can redistribute it and/or modify it under the same terms as Perl itself.

=cut
&lt;/code&gt;

&lt;p&gt;File test.pl

&lt;code&gt;
#! perl -w

######################### We start with some black magic to print on failure.
BEGIN { $| = 1; print "1..3\n"; }
END {print "not ok 1\n" unless $loaded;}
use Win32::API::Guid 'generate';
$loaded = 1;
print "ok 1\n";
######################### End of black magic.

{
	local $" = "\n";
	@a = generate();
	print "@a\n";
	print scalar(@a) == 1 ? "ok" : "not ok", " 2\n";
	@a = generate(5);
	print "@a\n";
	print scalar(@a) == 5 ? "ok" : "not ok", " 3\n";
}

&lt;/code&gt;
</field>
<field name="codedescription">
If you are Windoze COM programmer, you may find use for this guid generator, perhaps when you clone an existing MSVC project and you need to change the guids therein.&lt;p&gt;
Requires Win32-API.&lt;p&gt;

&lt;b&gt;Update:&lt;/b&gt; generate() now returns one guid in scalar context, array of one or more guids in array context.
&lt;p&gt;&lt;b&gt;Update 2:&lt;/b&gt; Thank you [$code or die] for pointing out the GuidGen() function in libwin32-018. &lt;br&gt;I just installed ActivePerl build 630 and tried GuidGen() - after some searching. I could not find it mentioned in the new chm documentation. Attempt to call Win32::GuidGen() as you suggested produces an error "Undefined subroutine &amp;Win32::GuidGen called at ...". Text search for GuidGen in C:\Perl produced a few examples of calls via package Win32::Resource, which does not seem to be documented either, but following these examples worked for me:

&lt;code&gt;
#!perl -w
use strict;
#my $guid = Win32::GuidGen();
#Undefined subroutine &amp;Win32::GuidGen called at Noname1.pl line 3.
use Win32::Resource;
my $guid2 = Win32::Resource::GuidGen();

print "$guid2\n";

__END__
{A8D7B8DA-1AA8-4575-A51F-8EA05E93D032}
&lt;/code&gt;
However, Win32::Resource::GuidGen() does not seem to support an optional argument for generating a list of several guids at a time.&lt;p&gt;</field>
<field name="codecategory">
Win32 Stuff</field>
<field name="codeauthor">
Rudi Farkas rudif@lecroy.com</field>
</data>
</node>
