#! 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' => [ 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 < 1); my $guid = ' ' x 16; my $hr = $CoCreateGuid->Call( $guid ); my ($guidData1, $guidData2, $guidData3, @guidData4) = unpack("LS2C8", $guid); my @guids; for (my $i = 0; $i < $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 #### #! 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"; }