我目前正在尝试在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的项目中,#include
由windows.h
声明,而#include
在vcl.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.lib
和kernel32.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/