2013-07-27 4 views
0

를 형식 정의를합니다 : 11, 내가 이해할 수없는 이유를MacRuby 포인터는이 코드가 Semgentation 오류와 함께 실패 구조체를

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

이 (그것을 잠금 장치를 작동하기 때문에 나는 그것이 keychainObject 유형과 관련이있다 확신 기본 키 체인). 이 디버거 내가 포인터의 잘못된 유형을 사용하는 경우가 예상 내게 말했다 무엇 때문에 포인터의 유형으로 '^ {OpaqueSecKeychainRef을}'사용하고

SecKeychainLock(nil) 

.

이 문제가 macruby/cocoa 마법을 파악하는 데 도움이되기를 바랍니다. SecKeychainOpen의 (a SecKeychainRef에 대한 포인터를 필요로하는 동안 당신이

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

을 쓴 것 C를 작성한다면

참고로, 전체 출력은

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 

답변

1

되도록 출력 매개 변수 채울 수 있음), 다른 API는 SecKeychainRef 만 필요하므로 포인터를 역 참조 할 필요가 있습니다.

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

shreding을 위해 Fred에게 감사드립니다! 세 번째 줄은 keychainObject 앞에 *와 붙지 않아야합니까? SecKeychainOpen ("/ 사용자/charbon/라이브러리/Keychains/Josja.keychain", * keychainObject) – MichaelC

+0

아니요. * 루비에서 완전히 다른 것입니다 –

+0

좋습니다. 고마워요. 여기에 "역"질문을 게시 : http://stackoverflow.com/questions/17902293/macruby-pointer-referencing-dereferencing-when-using-cocoa-frameworks – MichaelC