On Fri, Jun 20, 2008 at 16:05, Nicholas Calvert <nick.calvert@gmail.com> wrote:
> Thanks Jano. If you have a minute, do you think you could run through
> that code and explain what its doing? I am new to Ruby and a large
> portion of that went over my head
1. You'll find documentation for CoCreateGuid here:
http://msdn.microsoft.com/en-us/libr...68(VS.85).aspx
and for StringFromGUID2 here:
http://msdn.microsoft.com/en-us/libr...93(VS.85).aspx
(these are C functions from ole32.dll)
2. I call them using WIN32API, conveniently wrapped by windows-
pr gem
from win32utils project.
### these are from windows-
pr gem
require 'windows/com'
require 'windows/unicode'
### er function to strip everything past the first NULL character.
Copied from some file in win32utils
class String
# Return the portion of the string up to the first NULL character. This
# was added for both speed and convenience.
def nstrip
self[ /^[^\0]*/ ]
end
end
class Guid
BUFFER_SIZE = 100
attr_reader :data
### two ways of using this class - 1. either provide GUID in binary
form Guid.new(data) or create a new one (Guid.new)
def initialize(data = nil) ### nil is default value for data parameter
@data = data
create if data.nil? ### if there's no data, call create
end
### create new guid
def create
@data = 0.chr * 16 ### make empty buffer for the binary GUID "\0\0\0\0...\0"
raise 'GUID Error' unless CoCreateGuid(@data) ### call the API. the
call will place the created GUID in @data.
end
### convert binary guid to string representation
def to_s
ret = 0.chr * BUFFER_SIZE ### temporary buffer to place the string form
i = StringFromGUID2(@data, ret, BUFFER_SIZE) ### call the API
### API returns zero-terminated wide string. this is the conversion to
ordinary ruby string.
### wide_to_multi is from windows/unicode
wide_to_multi(ret[0..i*2]).nstrip
end
private
### this code includes COM and Unicode modules into this class, so
that we can use them.
include Windows::COM
include Windows::Unicode
end
### this line is kind of idiom/guard
### it allows to specify code to be run when the file is run directly.
This code will not run
### if this file is required or included in another file. (script vs. library)
if File.expand_path(__FILE__) == File.expand_path($0)
puts Guid.new.to_s
end
----
Ok, and now ask questions! ;-)
J.