【问题标题】:Java JNI call to CreateFile always returns INVALID_HANDLE_VALUE with ERROR_ACCESS_DENIEDJava JNI 调用 CreateFile 总是返回 INVALID_HANDLE_VALUE 和 ERROR_ACCESS_DENIED
【发布时间】:2011-02-13 18:05:12
【问题描述】:

编辑 我似乎更进一步了。我没有提到这是我在这里处理的目录。我需要将 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);
}

【问题讨论】:

  • 您确定您使用的路径是正确的(例如,带有前缀 \\?\")吗?请提供一个示例。
  • 这听起来很合理。文件的路径是什么?
  • 我确实尝试将 \\?\ 附加到路径中,但并没有改变结果。

标签: java winapi java-native-interface createfile


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-01
    • 2018-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-13
    相关资源
    最近更新 更多