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
> [email protected]
> http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel
_______________________________________________
MacRuby-devel mailing list
[email protected]
http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel