On 2010-10-25, at 11:39 PM, Laurent Sansonetti wrote: > Hi Mark, > >> Ah, that does work, and seems to have worked for a number of other things I >> am trying to do. >> >> The only problem now is when I have something like >> >> value = Pointer.new '^v' # pointer to pointer to void >> AXUIElementCopyAttributeValue mail_object, 'AXHidden', value >> >> In this case I am using it right now, it will be returning a boolean, but >> when I try to dereference it like >> >> puts value[0][0] # => 120 >> >> it gives me a Fixnum, and then I can keep trying things like >> >> puts value[0][1] # => 104 >> puts value[0][10000] # => 0 >> >> And I seem to get nowhere. >> >> Is there a way to cast the data back into the type I want it to be? Or am I >> doing something dumb? > > Looks like this function has the following declaration: > > extern AXError AXUIElementCopyAttributeValue (AXUIElementRef element, > CFStringRef attribute, CFTypeRef *value); > > So, the 3rd argument is is a CF object returned by reference. > > You should be able to do the following then: > > ptr = Pointer.new(:id) > AXUIElementCopyAttributeValue(mail_object, 'AXHidden', ptr) > value = ptr[0] > > To reply to your other question, it is possible to cast the type of a Pointer > object, using the #cast! method. Sometimes this is useful when you get a void > pointer from a native API and want to cast it into something more useful. But > you should be careful, MacRuby will not prevent you from doing bad casts. >
Hmm, I tried that but it did not work. The error I got was: TypeError: expected instance of Pointer of type `^v', got `@' So I tried to see if I could cast a '^v' Pointer, but I do not know how #cast! wants the argument to be phrased, when I checked macri, I got this error: # macri Pointer /Library/Frameworks/MacRuby.framework/Versions/0.7.1/usr/lib/ruby/1.9.2/rdoc/ri/driver.rb:383:in `create_class_cache': Permission denied - open() failed (Errno::EACCES) from /Library/Frameworks/MacRuby.framework/Versions/0.7.1/usr/lib/ruby/1.9.2/rdoc/ri/driver.rb:342:in `class_cache' from /Library/Frameworks/MacRuby.framework/Versions/0.7.1/usr/lib/ruby/1.9.2/rdoc/ri/driver.rb:596:in `block' from /Library/Frameworks/MacRuby.framework/Versions/0.7.1/usr/lib/ruby/1.9.2/rdoc/ri/driver.rb:591:in `run' from /usr/local/bin/macri:3:in `<main>' zsh: exit 1 macri Pointer My feeble attempts to try and coerce a String from the pointer Pointer ended like this: irb(main):029:0> value = test[0].cast! 'String' => #<Pointer:0x200c2ab80> irb(main):030:0> value = test[0][0].cast! 'String' NoMethodError: undefined method `cast!' for 120:Fixnum But I don't know if it is because I am using #cast! incorrectly or not. Also, in cases where I want to cast a boolean pointer into MacRuby would I have to do some additional logic to decide to cast to TrueClass and FalseClass or is there some more convenient way that will figure it out for me? Thanks, Mark > Laurent > _______________________________________________ > MacRuby-devel mailing list > MacRuby-devel@lists.macosforge.org > http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel _______________________________________________ MacRuby-devel mailing list MacRuby-devel@lists.macosforge.org http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel