Java JNI-вызов CreateFile всегда возвращает INVALID_HANDLE_VALUE с ERROR_ACCESS_DENIED - PullRequest
0 голосов
/ 13 февраля 2011

РЕДАКТИРОВАТЬ Кажется, я продвинулся на один шаг дальше.Я забыл упомянуть, что это был каталог, с которым я имел дело здесь.Мне нужно было передать 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);
}

1 Ответ

1 голос
/ 15 февраля 2011

JNI GetStringChars не возвращает строку с нулем в конце. Вам нужно будет использовать GetStringLength и настроить свою собственную строку с нулем в конце.

...