0

是否可以从 Carbon.. 中的函数地址或类名获取 Bundle 引用(CFBundleRef)?

我知道 Objective-C 中有函数

NSBundle myBundle = [NSBundle bundleForClass:(Class)<SOME_CLASS>];

并使用 Windows API

GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, (LPCTSTR)<SOME_FUNCTION>, &outModule);

在 mac 上是否有任何与 C++ 类似或任何其他方法?

谢谢,阿比奈。

4

1 回答 1

2

您可以使用操作的核心基础函数来获取对导出给定CFBundle函数名称的包的包引用:

CFStringRef functionName = CFSTR("someFunctionName");
CFArrayRef allBundles = CFBundleGetAllBundles();
CFIndex i;
CFIndex bundleCount = CFArrayGetCount(allBundles);

for (i = 0; i < bundleCount; i++) {
    CFBundleRef bundle = CFArrayGetValueAtIndex(allBundles, i);
    void *functionPointer = CFBundleGetFunctionPointerForName(bundle, functionName);
    if (functionPointer != NULL) {
        // bundle points to a bundle that exports functionName
    }
}

并且由于CFBundleGetDataPointerForName()返回一个指向包中给定符号名称的数据指针,我相信它也可以用于类名称,因为一个类是用符号名称导出的_OBJC_CLASS_$_<className>,例如_OBJC_CLASS_$_NSArray.

据我所知,没有任何函数可以让您通过指定函数地址来检查包是否导出函数。

于 2011-01-27T16:23:50.377 回答