Как найти CFBundleRef из адреса функции или класса - PullRequest
0 голосов
/ 27 января 2011

Можно ли получить ссылку Bundle (CFBundleRef) из адреса функции или имени класса в Carbon .. ??

Я знаю, что есть функции в Objective-C

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

и с Windows API

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

Есть ли что-нибудь подобное или любой другой метод с C ++ на Mac ??

Спасибо, Абхинай.

1 Ответ

2 голосов
/ 27 января 2011

Вы можете использовать функции Core Foundation, которые работают на 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.

Насколько я могу судить, нет функции, которая позволяла бы вам проверять, экспортирует ли пакет функцию, указав адрес функции.

...