在MacRuby Pointer to typedef struct上,我学习了如何取消引用用
创建的指针x=Pointer.new_with_type
...
==> use x.value, or x[0]
努力享受!
现在我想了解我认为的“对立面”。我正在尝试使用此API。
OSStatus SecKeychainCopySettings (
SecKeychainRef keychain,
SecKeychainSettings *outSettings
);
第二个参数必须是指针。但我从来没有设法打开钥匙串的真实outSettings,我只获得默认设置。
framework 'Security'
keychainObject = Pointer.new_with_type('^{OpaqueSecKeychainRef}')
SecKeychainOpen("/Users/charbon/Library/Keychains/Josja.keychain",keychainObject)
#attempt #1
settings=Pointer.new_with_type('{SecKeychainSettings=IBBI}')
SecKeychainCopySettings(keychainObject.value, settings)
p settings.value
#<SecKeychainSettings version=0 lockOnSleep=false useLockInterval=false lockInterval=0>
#attempt #2
settings2=SecKeychainSettings.new
result = SecKeychainCopySettings(keychainObject.value, settings2)
p settings2
#<SecKeychainSettings version=0 lockOnSleep=false useLockInterval=false lockInterval=0>
打开钥匙串的设置应为
#<SecKeychainSettings version=0 lockOnSleep=true useLockInterval=true lockInterval=1800>
我错过了什么?
答案 0 :(得分:0)
知道了! SecKeychainCopySettings的文档提到
outSettings 返回时,指向钥匙串设置结构的指针。 由于此结构已版本化,因此必须为其分配内存 并在将结构传递给之前填写结构的版本 功能
所以我们不能只创建一个指向SecKeychainSettings的指针。我们必须将指针所指向的Struct的版本设置为某个东西。
settings=Pointer.new_with_type('{SecKeychainSettings=IBBI}')
#settings[0] dereferences the Pointer
#for some reason, settings[0][0]=1 does not work, nor settings[0].version=1
settings[0]=[1,false,false,0]
#we are redefining the complete SecKeychainSettings struct
# [0]=version [1]=lockOnSleep [2]=useLockInterval [3]=lockInterval
result = SecKeychainCopySettings(keychainObject.value, settings)
p settings
=> #<SecKeychainSettings version=1 lockOnSleep=true useLockInterval=false lockInterval=300> irb(main):019:0>