2

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>

我错过了什么?

4

1 回答 1

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> 
于 2013-07-28T22:30:25.013 回答