5

在这个问题的答案中:获取登录用户,接受的答案使用看起来像这样的 Delphi 代码来访问 Cocoa 函数 NSUserName。

function NSUserName: Pointer; cdecl; external '/System/Library/Frameworks/Foundation.framework/Foundation' name _PU +'NSUserName';

您将如何在 C++Builder 中执行此操作?

4

1 回答 1

4

这回答了问题,值得赏金

解决方案是使用 dlopen 和 dlsym 在 C++ 中导入 NSUserName:

void* (*NSUserName)();
String UserName;
void *hLib = dlopen("/System/Library/Frameworks/Foundation.framework/Foundation", RTLD_GLOBAL);
if(hLib)
{
    NSUserName = (void*(*)())dlsym(hLib, "NSUserName");
    CFStringRef srUserName = (CFStringRef)NSUserName();
    if(srUserName)
    {
        UserName = CFStringGetCStringPtr(srUserName, 0);
    }
    dlclose(hLib);
}

通过添加头文件,可以直接在 C++ Builder 中使用 NSString(Cocoa 类型):

#include <Macapi.Foundation.hpp> // note that this will cause 8080 warnings if you have this warning turned on (unused variables)

现在我可以使用 NSString 代替 CFStringRef (核心基础类型):

UserName = TNSString::Wrap(NSUserName())->UTF8String();
于 2013-07-25T21:44:36.243 回答