РЕДАКТИРОВАТЬ Кажется, я продвинулся на один шаг дальше.Я забыл упомянуть, что это был каталог, с которым я имел дело здесь.Мне нужно было передать FILE_FLAG_BACKUP_SEMANTICS в CreateFile.К сожалению, я столкнулся с другим дорожным блоком ... GetFinalPathNameByHandle, кажется, возвращает только "\" в качестве окончательного пути ...
Я вызываю следующую функцию, используя JNI, но дескриптор файла всегда INVALID_HANDLE_VALUEс GetLastError (), возвращающим 5 (ERROR_ACCESS_DENIED).Я уверен, что файл существует (я распечатываю путь прямо сейчас, чтобы проверить, возникает ли ошибка).
Я использую Windows 7, запускаю файл jar из cmd.exe, открытый с помощью запуска от имениАдминистратор, и я также выключил UAC +, перезагрузился, чтобы посмотреть, помогло ли это.
У кого-нибудь есть идеи?
JNIEXPORT jstring JNICALL Java_com_inductiveautomation_linkmgr_LinkTool_getLinkTarget
(JNIEnv *env, jclass clazz, jstring path)
{
TCHAR Path[BUFSIZE];
HANDLE hFile;
DWORD dwRet;
LPCWSTR nativePath = (*env)->GetStringChars(env, path, 0);
hFile = CreateFileW(nativePath, // file to open
GENERIC_READ, // open for reading
FILE_SHARE_READ, // share for reading
NULL, // default security
OPEN_EXISTING, // existing file only
FILE_ATTRIBUTE_NORMAL, // normal file
NULL); // no attr. template
if(hFile == INVALID_HANDLE_VALUE)
{
char msg[120];
int lastError = GetLastError();
sprintf(msg, "Last Error: %d (%s)", lastError, (*env)->GetStringUTFChars(env, path, 0));
return (*env)->NewStringUTF(env, msg);
}
dwRet = GetFinalPathNameByHandle(hFile, Path, BUFSIZE, VOLUME_NAME_NT);
if(dwRet < BUFSIZE)
{
return WindowsToJstring(env, Path);
}
else
{
return NULL;
}
CloseHandle(hFile);
(*env)->ReleaseStringChars(env, path, nativePath);
}