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

Reply via email to