Ich arbeite an der Änderung der PTHotKeyLib, um 64-Bit-freundlich zu sein, aber ich habe ein Problem im Code, ich bin mir nicht sicher wie man herumkommt. In PTHotKeyCenter erstellt die Methode registerHotKey eine EventHotKeyID-Instanz und fügt dann das PTHotKey-Objekt in das ID-Attribut ein. Der ursprüngliche Code wurde lange verwendet. Ich habe es nach Apples 64-Bit-Programmieranleitung in NSInteger umgewandelt.Auflösen von Zeiger auf Zeiger aus Integer unterschiedlicher Größe Fehler in 64-Bit-Konvertierung
- (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
}
Wenn ein Benutzer den Hotkey auslöst, ruft er die sendCarbonEvent: Methode, die die PTHotKey Instanz aus EventHotKeyID ziehen werde es versuchen. Es funktionierte in 32-Bit-Land, aber wenn sie gegen 64-Bit-Kompilierung, gibt es ein „cast Zeiger von Ganzzahl von unterschiedlicher Größe“
- (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
}
Wechsel von x86_64 entfernt zurück zu i386 Warnung der Warnung und alles zusammengestellt und läuft einwandfrei. Unter x86_64 verursacht es einen Absturz, und ich bin mir nicht sicher, wie ich dieses Problem umgehen kann. Irgendwelche Vorschläge, wie man es löst?
einen Zeiger in eine Variable zu klein, um einen Zeiger zu halten Putting wird nicht funktionieren, egal, was der Zeiger auf. –