【发布时间】:2014-11-09 14:13:23
【问题描述】:
使用 Mac OSX SDK,我编写了这个简单的测试应用程序来从正在运行的应用程序中提取版本字符串。
int main()
{
NSWorkspace * ws = [NSWorkspace sharedWorkspace];
NSArray * apps = [ws runningApplications];
NSUInteger max= [apps count];
for (NSUInteger i = 0; i < max; i++)
{
NSRunningApplication *app = [apps objectAtIndex: i];
pid_t pid = [ app processIdentifier ];
ProcessSerialNumber psn = { kNoProcess, kNoProcess };
if ( GetProcessForPID(pid, &psn) != noErr )
continue;
CFDictionaryRef dictionary
= ProcessInformationCopyDictionary(&psn, kProcessDictionaryIncludeAllInformationMask);
const NSString * version
= reinterpret_cast<const NSString*>(CFDictionaryGetValue( dictionary, CFSTR("CFBundleShortVersionString") ));
printf( "version for pid %d: \"%s\"\n", pid, [ version UTF8String ] );
}
}
但这不起作用,它会打印如下行:
pid 34 的版本:“(null)”
第二次尝试
如果我尝试通过将最后两行更改为来检索CFBundleVersion,我会更接近:
const NSNumber * version
= reinterpret_cast<const NSNumber *>(CFDictionaryGetValue( dictionary, CFSTR("CFBundleVersion") ));
printf( "version for pid %d: \"%s\"\n", pid, [ [ version stringValue ] UTF8String ] );
但现在版本是一个整数,比如 257633863,我想要像 1.23.0 这样的数字
【问题讨论】:
-
从阅读您的最后一行开始,版本不应该保存为字符串吗?另外,你不能在常量头文件中定义一个版本字符串吗?并在每次更新时手动更改。
#define kVersion @"1.23.0"并在您想要的任何地方调用“kversion”,只要您导入了文件。 -
你检查过这篇文章吗?它适用于 iOS,但可能会提示您在 OS X 上做同样的事情。stackoverflow.com/questions/7608632/…
-
关于您的代码的几点说明:您忘记了
CFRelease(dictionary);(CoreFoundation 函数ProcessInformationCopyDictionary的名称中有Copy,因此您拥有返回的引用)。你为什么要做那些const XY *演员?我以前从未见过这个,所以我只是好奇原因。 -
@DarkDust 感谢您的评论!我来自 C/C++,所以
const-ness 只是一种反射。 -
@Zil:我首先开始将它作为字符串检索,但我有一个运行时警告说“找不到 NSNumber 的选择器 UTF8String”(或类似的东西),所以我认为 CFDictionaryGetValue 正在返回一个 NSNumber
标签: objective-c macos osx-snow-leopard