CreateSymbolicLink()
объявлен в winbase.h
, который #include
«d от windows.h
, который #include
» d от vcl.h
во всех VCL на основе проектов. Если вы не создаете проект VCL, убедитесь, что в вашем коде есть оператор #include <windows.h>
. В любом случае, также убедитесь, что значение _WIN32_WINNT
определено как минимум 0x0600
(Vista +).
Если компилятор все еще жалуется, что CreateSymbolicLink()
не определен, то вы должны использовать старую версию C++ Builder (CreateSymbolicLink()
был добавлен в копию C++ Builder из winbase.h
в C++ Builder 2007), в этом случае вам придется объявить 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...
}
Что также позволит ваш код для запуска на XP и выше (при необходимости), так как CreateSymbolicLink()
была добавлена в Vista, ,
Вы пробовали с CreateSymbolicLink (обратите внимание на отсутствие A или W)? A/W - это ansi/wide версии функций в API, но вы обычно называете это без чего-либо, поэтому компилятор выбирает, какой из них вызывать в зависимости от проекта. –
Что вы подразумеваете под _can't find them_? Это компилятор или компоновщик? Собственно, что такое сообщение об ошибке? – CristiFati
Благодарим вас за эту информацию. Да, я пробовал с CreateSymbolicLink, но это та же проблема, что это «неявное объявление [...]». Я попытался включить «windows.h», но он поднял ошибку в этом файле. – mvezinet