我目前正在尝试在C ++ Builder中集成为UNIX编写的C代码。但是代码的一部分是使用函数符号链接:
if(!fname
|| (use_real_copy ? real_copy(path, fname) : symlink(path, fname))
我不知道如何替换它以便它适用于C ++ Builder for Windows 64位,我发现函数CreateSymbolicLinkW和CreateSymbolicLinkA似乎与Windows等效,但C ++ Builder可以&#39找不到它们。
你知道如何解决这个问题吗?
谢谢。
答案 0 :(得分:1)
CreateSymbolicLink()
在winbase.h
中声明,#include
表示windows.h
,#include
表示vcl.h
表示#include <windows.h>
基于VCL的项目。如果您没有创建VCL项目,请确保代码中包含_WIN32_WINNT
语句。无论哪种方式,还要确保0x0600
定义为至少CreateSymbolicLink()
(Vista +)。
如果编译器仍抱怨CreateSymbolicLink()
未定义,那么您必须使用旧版本的C ++ Builder(winbase.h
已添加到C ++ Builder的CreateSymbolicLink()
副本中C ++ Builder 2007),在这种情况下,您必须在自己的代码中手动声明#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
,例如:
CreateSymbolicLinkA
但是你还有另一个需要解决的问题 - 那个版本的C ++ Builder在其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...
}
可能更容易:
CreateSymbolicLink()
这也将允许您的代码在XP及更早版本(如果需要)上运行,因为在Vista中添加了dtap dtap dtap dtap dtap tdap MMR MMR
。