Je suis en train de modifier le PTHotKeyLib pour être 64 bits amical, mais j'ai rencontré un problème dans le code que je ne suis pas sûr comment se déplacer. Dans PTHotKeyCenter, la méthode registerHotKey crée une instance EventHotKeyID, puis place l'objet PTHotKey dans l'attribut id. Le code d'origine utilisé un long. Je l'ai converti en NSInteger selon le guide de programmation 64 bits d'Apple.Résolution d'un cast en pointeur à partir d'un entier de taille différente erreur dans la conversion 64 bits
- (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
}
Lorsqu'un utilisateur déclenche la touche de raccourci, il appelle la sendCarbonEvent: méthode qui va essayer de tirer l'instance PTHotKey sur EventHotKeyID. Il a travaillé dans la terre 32 bits, mais lors de la compilation contre 64 bits, il donne un « cast à un entier en pointeur de taille différente » avertissement
- (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
}
Commutation de x86_64 retour à i386 supprime l'avertissement et tout a été compilé et fonctionne correctement. Sous x86_64, cela cause un problème, et je ne suis pas sûr de savoir comment contourner ce problème. Des suggestions sur la façon de le résoudre?
Mettre un pointeur dans une variable trop petite pour contenir un pointeur ne va pas travailler, peu importe ce que les points de pointeur. –