在这个问题的答案中:获取登录用户,接受的答案使用看起来像这样的 Delphi 代码来访问 Cocoa 函数 NSUserName。
function NSUserName: Pointer; cdecl; external '/System/Library/Frameworks/Foundation.framework/Foundation' name _PU +'NSUserName';
您将如何在 C++Builder 中执行此操作?
在这个问题的答案中:获取登录用户,接受的答案使用看起来像这样的 Delphi 代码来访问 Cocoa 函数 NSUserName。
function NSUserName: Pointer; cdecl; external '/System/Library/Frameworks/Foundation.framework/Foundation' name _PU +'NSUserName';
您将如何在 C++Builder 中执行此操作?
这回答了问题,值得赏金
解决方案是使用 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();