问题描述
我正在将修改为64位元友善,但我已执行进入代码中的一个问题,我不知道如何解决。在PTHotKeyCenter中,registerHotKey方法创建一个EventHotKeyID实例,然后将PTHotKey对象填充到id属性中。原来的代码使用了很长。我将它转换为NSInteger根据苹果的64位节目指南。
I'm working on modifying the PTHotKeyLib to be 64-bit friendly, but I've run into an issue in the code that I'm not sure how to get around. In PTHotKeyCenter, the registerHotKey method create an EventHotKeyID instance and then stuffs the of PTHotKey object into the id attribute. The original code used a long. I converted it to NSInteger per Apple's 64 bit programming guide.
- (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:方法,该方法将尝试从EventHotKeyID中拉出PTHotKey实例。它在32位的土地上工作,但是当对64位进行编译时,它给出一个从不同大小的整数转换为指针警告
When a user triggers the hot key, it calls the sendCarbonEvent: method that will try to pull the PTHotKey instance out of EventHotKeyID. It worked in 32-bit land, but when compiling against 64-bit, it gives a "cast to pointer from integer of different size" warning
- (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切换回i386会删除警告,并编译和运行正常。在x86_64下它会导致一个crasher,我不知道如何解决这个问题。任何建议如何解决它?
Switching from x86_64 back to i386 removes the warning and everything compiled and runs properly. Under x86_64 it causes a crasher, and I'm not sure how to get around that issue. Any suggestions on how to resolve it?
推荐答案
不推荐在指针和整数之间进行转换,因为它会导致非可移植代码。
Casting between pointers and integers is not recommended because it results in non-portable code.
你正在做什么导致C99定义为未定义的行为。这基本上意味着它可能工作,它可能不。 C语言是出名的让你做这样的事情,因为它隐含地假设你知道你在做什么,当你打字了,你有37337疯狂的技能和多年的经验,知道什么时候可以安全地做类似的事情
What you are doing results in what C99 defines as "undefined behavior". This basically means it might work, and it might not. The C language is famous for letting you do things like this because it implicitly assumes that you knew what you were doing when you typed it in and that you have the wizardly 37337 mad skillz and years of experience to know when it's safe to do something like this and when it's not.
可以安全地说,这是那些不安全的时候。
It's safe to say this this is one of those times when it was not safe to do.
上下文中的问题可能是由于将64位指针转换为 int
大小的变量。 Mac OS X 64位ABI是所谓的 LP64
,这意味着 long
s和指针
是64位宽,并且 int
s是32位宽。所以,简而言之,在你的指针
到 int
之一,再回来casting,你砍掉了顶部32位
The problem, from context, is probably due to casting a 64-bit pointer in to an int
sized variable. Mac OS X 64-bit ABI is what is known as LP64
, which means that long
s and pointer
s are 64-bits wide, and that int
s are 32-bits wide. So, in short, during one of your pointer
to int
and back again castings, you chopped off the top 32 bits, which just so happened to be really important.
查看文档, id
的类型是 UInt32
。所以,简短的答案是,你不能把64位指针到32位大小的整数。
Looking at the docs, the type for id
is UInt32
. So, the short answer is you can't put 64-bit pointers in to 32-bit sized integers.
这篇关于在64位转换中将转换从不同大小的整数错误转换为指针的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!