编辑 我似乎已经向前迈进了一步。我没有提到这是我在这里处理的目录。我需要将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);
}
答案 0 :(得分:1)
JNI GetStringChars不返回以0结尾的字符串。您需要使用GetStringLength并设置自己的以0结尾的字符串。