0

編集 一歩進んだようです。これが私がここで扱っていたディレクトリであることを忘れていました。FILE_FLAG_BACKUP_SEMANTICS を CreateFile に渡す必要がありました。残念ながら、私は別の障害にぶつかりました... GetFinalPathNameByHandle は、最終パスとして「\」のみを返すようです...

JNI を使用して次の関数を呼び出していますが、ファイル ハンドルは常に INVALID_HANDLE_VALUE で、GetLastError() は 5 (ERROR_ACCESS_DENIED) を返します。ファイルが存在することは確かです (エラーがいつ発生したかを確認するために、現在パスを印刷しています)。

私はWindows 7を使用しており、管理者として実行を使用して開いたcmd.exeからjarファイルを実行しています。また、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);
}
4

1 に答える 1

1

JNI GetStringChars は、0 で終わる文字列を返しません。GetStringLength を使用して、独自の 0 で終わる文字列を設定する必要があります。

于 2011-02-14T22:25:40.573 に答える