6

我正在将 Carbon 应用程序转换为 Cocoa 应用程序,但找不到 Cocoa 等效项:

UpdateSystemActivity(UsrActivity);

那里有任何Mac人愿意为我指出正确的方向吗?谢谢。

更新:我正在构建 64 位。构建 32 位工作正常,但是当我为 64 位构建时,我得到了 UpdateSystemActivity(和其他)的符号未在此范围内声明的错误。

UPDATE2:我正在导入以下内容:

#import <Cocoa/Cocoa.h>
#import <Carbon/Carbon.h>
#import <OpenGL/CGLMacro.h>

构建 64 位时我还需要导入其他东西吗?

UPDATE3:添加#import <CoreServices/CoreServices.h>没有帮助。我仍然收到编译器错误,告诉我 UpdateSystemActivity 和 UsrActivity 未在此范围内声明。

UPDATE4:好的,在 OSServices/Power.h 上找不到文件。我正在针对 10.5 SDK 进行构建,快速搜索显示:

$ pwd
/Developer/SDKs
$ find . -name Power.h
./MacOSX10.3.9.sdk/Developer/Headers/CFMCarbon/OSServices/Power.h
./MacOSX10.3.9.sdk/Developer/Headers/CFMCarbon/Power.h
./MacOSX10.3.9.sdk/Developer/Headers/FlatCarbon/Power.h
./MacOSX10.3.9.sdk/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/OSServices.framework/Versions/A/Headers/Power.h

./MacOSX10.4u.sdk/Developer/Headers/CFMCarbon/OSServices/Power.h
./MacOSX10.4u.sdk/Developer/Headers/CFMCarbon/Power.h
./MacOSX10.4u.sdk/Developer/Headers/FlatCarbon/Power.h
./MacOSX10.4u.sdk/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/OSServices.framework/Versions/A/Headers/Power.h

./MacOSX10.5.sdk/Developer/Headers/FlatCarbon/Power.h
./MacOSX10.5.sdk/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/OSServices.framework/Versions/A/Headers/Power.h

然而我得到:

Mac.mm:6:29: error: OSServices/Power.h: No such file or directory
Mac.mm:6:29: error: OSServices/Power.h: No such file or directory
4

3 回答 3

5

在 OS X 10.6 及更高版本中,IOKit 可用于禁用睡眠。当你想禁用睡眠时创建一个 IOPMAssertion 并在你想再次允许睡眠时销毁它。

#import <IOKit/pwr_mgt/IOPMLib.h>

// kIOPMAssertionTypeNoDisplaySleep prevents display sleep,
// kIOPMAssertionTypeNoIdleSleep prevents idle sleep
// reasonForActivity is a descriptive string why sleep is disabled

CFStringRef* reasonForActivity= CFSTR("Describe Activity Type");

IOPMAssertionID assertionID;
IOReturn success = IOPMAssertionCreateWithName(kIOPMAssertionTypeNoDisplaySleep, kIOPMAssertionLevelOn, reasonForActivity, &assertionID);

if (success == kIOReturnSuccess)
{ 
    //Add the work you need to do without the system sleeping here.

    success = IOPMAssertionRelease(assertionID);
    //The system will be able to sleep again.
}

更多信息:https ://developer.apple.com/library/mac/qa/qa1340/_index.html

于 2014-12-11T15:25:00.123 回答
3

如果定义了 __LP64__,则此处的问题似乎是 OSServices.h 中排除 Power.h 的行。在 10.5 上构建 64 位时,UpdateSystemActivity 确实是未定义的。

好消息是该符号确实存在于 CoreServices.framework 中。有两种方法可以访问它。

  1. 转发声明:extern "C" OSErr UpdateSystemActivity(UInt8);
  2. 明确包括您尝试过的 Power.h。您尝试的问题是 OSServices/ 没有找到它进入搜索路径的方式。您可以像这样包含它:#import </Developer/SDKs/MacOSX10.5.sdk/System/Library/Frameworks/CoreServices.framework/Frameworks/OSServices.framework/Headers/Power.h>

我手边没有 SnowLeopard 的副本,但接下来要做的是检查它是否已固定在那里。如果不是,请提交 RADAR,因为这显然是一个 SDK 错误。

于 2009-08-25T07:18:30.487 回答
2

你应该仍然可以UpdateSystemActivity从你的 Cocoa 应用程序中调用——它没有被标记为弃用。

API 的文档指定了导入CoreServices/CoreServices.h以获取 API —— 但是通过头文件(特别是在 中OSServices/OSServices.h)显示该文件在 64 位环境中被省略。然而,有一些部分Power.h(其中UpdateSystemActivity定义)对于 64 位是关闭的,并且UpdateSystemActivity不是其中之一。

鉴于此,尝试#import <OSServices/Power.h>直接看看是否有效。(您必须在项目中包含 CoreServices 框架才能找到标头。)

于 2009-08-24T21:15:52.233 回答