在Windows上使用C++创建符号链接

3

我想以跨平台的方式从我的程序中创建到数据的符号链接。对于*nix系统,有symlink。对于Windows,我在SO中找到了CreateSymbolicLink函数,并按照此答案中的方法运行它:

int test = CreateSymbolicLink(input_fileName.c_str(), ouput_fileName.c_str(), 0);

但是test总是返回0,这意味着函数失败了(而且确实不存在在output_fileName中指定的文件)。我做错了什么?
提前致谢!
更新:
上述调用后,我确实运行了GetLastError
DWORD err = GetLastError();

带有err = 1314。感谢@David。

更新2:

根据@David的回复,Windows不允许非管理员创建软链接。如果将来的Win API更改了这一点,则我将更新答案。截至2015年3月26日,@David的答案是正确的。

3个回答

5

根据文档

如果函数调用失败,返回值为零。要获取扩展错误信息,请调用 GetLastError。

您似乎没有调用 GetLastError。建议您这样做。可能的错误代码是ERROR_PRIVILEGE_NOT_HELD,其值为1314。如果调用进程没有足够的权限,则会出现此问题。您需要作为提升的管理员运行以使用此功能。


我猜测错误代码1314就是这个错误?有没有办法在Windows中创建符号链接,就像symlink一样,而不需要管理员权限? - scap3y
1
@scap3y:启动提升进程并不需要管理员权限,只需要一个UAC提示来询问用户是否允许运行新进程。 - Remy Lebeau
1
@Noitidart 用户必须是提供同意的管理员,或提供管理员用户的凭据。所有这些都有完整的文档记录。 - David Heffernan
1
@Noitidart:非提升进程可以使用COM提升单体来实例化具有提升权限的COM对象。 - Remy Lebeau
1
如果已登录的用户是管理员用户,则UAC只需提示权限提升以获取完全权限,而不需要请求凭据。如果已登录的用户不是管理员用户,则UAC会提示输入管理员凭据。无论哪种方式,UAC都会处理细节,对正在运行的进程透明。 - Remy Lebeau
显示剩余9条评论

3

std::filesystem::create_symlink 函数。 - Guillermo Pablo
为什么对一个已经解决的问题回答如此晚呢?C++17是否改变了这个问题?如果是,你能详细说明一下吗? - Emmanuel-Lin
1
@Emmanuel-Lin,在稍晚的评论中...:我相信你已经意识到,SO不是一个临时快速修复的讨论论坛,而是一个全面的“活”知识库,一直在不断地完善(而不仅仅是扩展)——更多地服务于随机搜索的群众而不是提问者本人。 (沿着这条推理线,现在也应该清楚为什么我正在添加此回复,即使它对你个人来说可能已经不再相关。) - Sz.
没错。我正在2022年使用谷歌搜索,@GuillermoPablo帮我省去了询问C++17是否更好支持此功能的麻烦,尤其是现在Windows团队似乎终于意识到命令行中的符号链接不需要提升权限。 - Erik

0
我拿了一个格式为FAT的USB存储器来进行测试。如果你正在使用正确的卷格式并且在管理员组中,那么上面的代码应该可以工作。如果你在Windows 10中,你不需要调整令牌特权,也不需要在参数中使用UNC。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接