gpt4 book ai didi

ruby - MacRuby 指向 typedef 结构的指针

转载 作者:行者123 更新时间:2023-12-03 17:53:31 33 4
gpt4 key购买 nike

此代码失败,并出现 Semgentation 错误:11,我不明白为什么

framework 'Cocoa'
framework 'CoreFoundation'
framework 'Security'
* keychainObject = Pointer.new_with_type('^{OpaqueSecKeychainRef}')
SecKeychainOpen("/Users/charbon/Library/Keychains/Josja.keychain",keychainObject)
SecKeychainLock(keychainObject)

我确信它与 keychainObject 类型有关,因为这有效(它锁定了默认的钥匙串(keychain))。

SecKeychainLock(nil) 

我使用“^{OpaqueSecKeychainRef}”作为指针类型,因为这是调试器在我使用错误类型的指针时告诉我的预期结果。

我希望解决这个问题将有助于掌握 macruby/cocoa 的魔力。

作为引用,完整的输出是

cobalt:~ charbon$ macirb Desktop/test.rb 
irb(main):001:0> framework 'Cocoa'
=> true
irb(main):002:0> framework 'CoreFoundation'
=> true
irb(main):003:0> framework 'Security'
=> true
irb(main):004:0> * keychainObject = Pointer.new_with_type('^{OpaqueSecKeychainRef}')
=> [#<Pointer:0x4007ac200>]
irb(main):005:0> SecKeychainOpen("/Users/charbon/Library/Keychains/Josja.keychain",keychainObject)
=> 0
irb(main):006:0> SecKeychainLock(keychainObject)
Segmentation fault: 11

最佳答案

如果你写的是 C,你就会这样写

SecKeychainRef keyChainRef;
SecKeychainOpen("/path/to/...", &keychainRef);
SecKeychainLock(keyChainRef);

即而SecKeychainOpen需要一个指向SecKeychainRef的指针(以便可以填写输出参数),而其他api只需要一个SecKeychainRef,因此您需要取消引用该指针:

framework 'Security'
keychainObject = Pointer.new_with_type('^{OpaqueSecKeychainRef}')
SecKeychainOpen("/Users/charbon/Library/Keychains/Josja.keychain",keychainObject)
SecKeychainLock(keychainObject.value)

关于ruby - MacRuby 指向 typedef 结构的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17899102/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com