我目前正在尝试在C ++ Builder中集成为UNIX编写的C代码。但是代码的一部分使用了symlink函数:

if(!fname
|| (use_real_copy ? real_copy(path, fname) : symlink(path, fname))


我不知道如何替换它,因此它可以在Windows 64位的C ++ Builder中工作,我发现函数CreateSymbolicLinkW和CreateSymbolicLinkA似乎与Windows等效,但C ++ Builder找不到它们。

您是否知道如何解决这个问题?

谢谢。

最佳答案

CreateSymbolicLink()winbase.h中声明,在所有基于VCL的项目中,#includewindows.h声明,而#includevcl.h中声明。如果不创建VCL项目,请确保代码中包含#include <windows.h>语句。无论哪种方式,还请确保将_WIN32_WINNT定义为至少0x0600(Vista +)。

如果编译器仍然抱怨CreateSymbolicLink()未定义,则您必须使用旧版本的C ++ Builder(在C ++ Builder 2007中将CreateSymbolicLink()添加到C ++ Builder的winbase.h副本中)。如果您必须在自己的代码中手动声明CreateSymbolicLink(),例如:

#define SYMBOLIC_LINK_FLAG_DIRECTORY            (0x1)

#define VALID_SYMBOLIC_LINK_FLAGS  SYMBOLIC_LINK_FLAG_DIRECTORY // & whatever other flags we think of!

WINBASEAPI
BOOLEAN
APIENTRY
CreateSymbolicLinkA (
    __in LPCSTR lpSymlinkFileName,
    __in LPCSTR lpTargetFileName,
    __in DWORD dwFlags
    );
WINBASEAPI
BOOLEAN
APIENTRY
CreateSymbolicLinkW (
    __in LPCWSTR lpSymlinkFileName,
    __in LPCWSTR lpTargetFileName,
    __in DWORD dwFlags
    );
#ifdef UNICODE
#define CreateSymbolicLink  CreateSymbolicLinkW
#else
#define CreateSymbolicLink  CreateSymbolicLinkA
#endif // !UNICODE


但是,您还有另一个要解决的问题-C ++ Builder版本在其CreateSymbolicLinkA副本中也没有链接到CreateSymbolicLinkW中导出的函数的kernel32.libkernel32.dll符号。因此,您必须从包含这些符号的现代.lib创建一个新的kernel32.dll导入库,然后将其添加到您的项目中。此时,使用CreateSymbolicLink()代替在运行时动态加载GetProcAddress()可能会更容易:

typedef BOOLEAN (APIENTRY *LPFN_CSL)(LPCTSTR, LPCTSTR, DWORD);

LPFN_CSL lpCreateSymbolicLink = (LPFN_CSL) GetProcAddress(GetModuleHandle(TEXT("kernel32")),
    #ifdef UNICODE
    "CreateSymbolicLinkW"
    #else
    "CreateSymbolicLinkA"
    #endif
);
if (lpCreateSymbolicLink)
{
    // use lpCreateSymbolicLink(...) as needed...
}


由于在Vista中添加了CreateSymbolicLink(),因此这也将允许您的代码在XP和更低版本(如果需要)上运行。

关于c - 在C++ Builder中替代symlink,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30761148/

10-13 09:04