gpt4 book ai didi

对 CreateFile 的 Java JNI 调用始终返回 INVALID_HANDLE_VALUE 和 ERROR_ACCESS_DENIED

转载 作者:行者123 更新时间:2023-12-01 15:56:15 24 4
gpt4 key购买 nike

编辑 我似乎又向前迈进了一步。我忘记提及这是我正在处理的目录。我需要将 FILE_FLAG_BACKUP_SEMANTICS 传递给 CreateFile。不幸的是,我遇到了另一个障碍... GetFinalPathNameByHandle 似乎只返回“\”作为最终路径...

我使用 JNI 调用以下函数,但文件句柄始终为 INVALID_HANDLE_VALUE,且 GetLastError() 返回 5 (ERROR_ACCESS_DENIED)。我确定该文件存在(我现在正在打印路径以验证何时发生错误)。

我使用的是 Windows 7,从使用管理员身份运行打开的 cmd.exe 运行 jar 文件,并且我还关闭了 UAC+rebooted 以查看是否有帮助。

有人有什么想法吗?

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);
}

最佳答案

JNI GetStringChars 不返回以 0 结尾的字符串。您需要使用 GetStringLength 并设置您自己的以 0 结尾的字符串。

关于对 CreateFile 的 Java JNI 调用始终返回 INVALID_HANDLE_VALUE 和 ERROR_ACCESS_DENIED,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4985875/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com