PTHotKeyLib을 64 비트 버전으로 수정하려고하는데, 확실하지 않은 코드에서 문제가 발생했습니다 주위를 둘러 보는 법. PTHotKeyCenter에서 registerHotKey 메서드는 EventHotKeyID 인스턴스를 만든 다음 PTHotKey 개체를 id 특성에 채 웁니다. 원래 코드는 오래 사용되었습니다. Apple의 64 비트 프로그래밍 가이드별로 NSInteger로 변환했습니다. EventHotKeyID 밖으로 PTHotKey 인스턴스를 끌어 위해 노력할 것입니다 방법 : 사용자가 바로 가기 키를 트리거 할 때64 비트 변환에서 다른 크기의 정수 오류로 캐스트 변환하기
- (BOOL)registerHotKey:(PTHotKey *)theHotKey {
OSStatus error;
EventHotKeyID hotKeyID;
EventHotKeyRef carbonHotKey;
NSValue *key = nil;
if ([[self allHotKeys] containsObject:theHotKey])
[self unregisterHotKey:theHotKey];
if (![[theHotKey keyCombo] isValidHotKeyCombo])
return YES;
hotKeyID.signature = kHotKeySignature;
hotKeyID.id = (NSInteger)theHotKey;
... //Rest is not relevant
}
, 그것은 sendCarbonEvent를 호출합니다. 그것은 32 비트 땅에서 일하지만, 64 비트에 대해 컴파일 할 때, 그것은 경고를 다시 I386에 x86_64의에서 전환
- (OSStatus)sendCarbonEvent:(EventRef)event {
OSStatus error;
EventHotKeyID hotKeyID;
SGHotKey *hotKey;
NSAssert(GetEventClass(event) == kEventClassKeyboard, @"Unknown event class");
error = GetEventParameter(event,
kEventParamDirectObject,
typeEventHotKeyID,
nil,
sizeof(EventHotKeyID),
nil,
&hotKeyID);
if (error)
return error;
NSAssert(hotKeyID.signature == kHotKeySignature, @"Invalid hot key id");
NSAssert(hotKeyID.id != 0, @"Invalid hot key id");
hotKey = (SGHotKey *)hotKeyID.id; // warning: cast to pointer from integer of different size
// Omitting the rest of the code
}
경고 "다른 크기의 정수에서 포인터 캐스트의"를 제공 제거하고 모든 컴파일 제대로 실행됩니다. x86_64에서는 크래셔가 발생하며이 문제를 해결하는 방법을 모르겠습니다. 그것을 해결하는 방법에 대한 제안?
포인터를 저장하기에 너무 작은 변수에 대한 포인터를 퍼팅 상관없이 포인터 포인트, 작동하지 않을 것입니다. –