我使用Visual Studio 2015创建了一个64位可执行文件,旨在在Windows 7上运行。可执行文件是一个C ++包装器,它通过JNI调用Java应用程序中的main方法。应用程序按预期运行,但在Windows任务管理器的“进程”选项卡上,我的应用程序名称前面有16个十六进制数字。因此,即使我的应用程序编译为“someapp.exe”,当我运行它时,它在进程列表中列为“80005b29594d4a91someapp.exe”。有谁知道为什么会这样,以及如何让它在任务管理器中显示为“someapp.exe”?
编辑1:
我应该注意,当它出现在名称中时,十六进制字符串始终是相同的。但是,当我的应用程序实际具有预期名称“someapp.exe”时,运行我的应用程序的时间很小。我无法弄清楚十六进制字符串何时被添加的模式以及何时不存在,但我估计十六进制字符串在98%的执行时间内出现。
编辑2:
这似乎与JNI的使用有某种关系。当我删除JNI调用时,这将完全停止。以下代表构成“someapp”应用程序的整个C ++代码:
#include <jni.h>
#include <Windows.h>
#define STRING_CLASS "java/lang/String"
int main(size_t const argc, char const *const argv[]) {
// Modify the DLL search path
SetDefaultDllDirectories(LOAD_LIBRARY_SEARCH_SYSTEM32 |
LOAD_LIBRARY_SEARCH_DEFAULT_DIRS | LOAD_LIBRARY_SEARCH_USER_DIRS);
SetDllDirectoryA(R"(C:\Program Files\Java\jdk1.8.0_112\jre\bin\server)");
// Create and populate the JVM input arguments
JavaVMInitArgs vm_args;
vm_args.version = JNI_VERSION_1_8;
vm_args.ignoreUnrecognized = JNI_FALSE;
vm_args.nOptions = 2;
vm_args.options = new JavaVMOption[vm_args.nOptions];
// Set command-line options
vm_args.options[0].optionString = "-Dfile.encoding=UTF-8";
vm_args.options[1].optionString = "-Djava.class.path=someapp.jar";
// Create the JVM instance
JavaVM *jvm;
JNIEnv *env;
JNI_CreateJavaVM(&jvm, reinterpret_cast<void**>(&env), &vm_args);
// Get the main entry point of the Java application
jclass mainClass = env->FindClass("myNamespace/MainClass");
jmethodID mainMethod = env->GetStaticMethodID(
mainClass, "main", "([L" STRING_CLASS ";)V");
// Create the arguments passed to the JVM
jclass stringClass = env->FindClass(STRING_CLASS);
jobjectArray mainArgs = env->NewObjectArray(
static_cast<jsize>(argc - 1), stringClass, NULL);
for (size_t i(1); i < argc; ++i) {
env->SetObjectArrayElement(mainArgs,
static_cast<jsize>(i - 1), env->NewStringUTF(argv[i]));
}
env->CallStaticVoidMethod(mainClass, mainMethod, mainArgs);
// Free the JVM, and return
jvm->DestroyJavaVM();
delete[] vm_args.options;
return 0;
}
我试图删除传递给Java main方法的参数,但这对结果没有影响。
编辑3:
感谢1201ProgramAlarm的建议,我意识到这实际上与从动态ClearCase视图运行有关。任务管理器中的“图像路径名称”列是以下值之一,它与我观察到的错误“图像名称”症状直接相关:
\视图\视图名\ someapp路径\ someapp.exe
\视图-服务器\视图\域\用户名\视图-name.vws.s \ 00035 \ 8 0005b29594d4a91somea pp.exe
我仍然想知道为什么会这样,但由于这只影响我们的开发环境,修复它已成为低优先级。对于遇到此问题的任何其他人,以下代表我环境中安装的相关软件:
答案 0 :(得分:2)
从不是ClearCase动态视图的驱动器运行您的应用程序。
正在运行的进程的映像名称引用ClearCase视图中的文件存储(\\view\view-name\someapp-path\someapp.exe
=&gt;
\\view-server\views\domain\username\view-name.vws\.s\00035\80005b29594d4a91someapp.exe
),.vws
含义视图存储。
请参阅“About dynamic view storage directories”:
每个视图都有一个视图存储目录。对于动态视图,此目录用于跟踪检出视图的哪些版本以及存储视图私有对象
因此,快照和动态视图都存在视图存储 但对于动态视图,该存储还用于保存您要读取/执行的文件的本地副本(所有其他可见文件都通过网络使用MVFS: MultiVersion File System访问)
这就是你执行该文件时看到\\view-server\views\domain\username\view-name.vws\.s\00035\80005b29594d4a91someapp.exe
的原因:你看到ClearCase通过MVFS完成了本地拷贝。
您是否使用过快照视图,您不会看到如此复杂的路径,因为快照视图本质上会在本地复制所有文件。
当我最近没有使用Windows资源管理器访问MVFS安装时,似乎路径是“正确的”
这意味着Windows执行的可执行文件仍然是正确的,而MVFS将忙于将相同的可执行文件从Vob下载到视图存储的内部文件夹。 但是一旦你重新执行它,那个可执行文件就已存在(在视图存储中),因此MVFS会将其完整路径(再次在视图存储中)传递给Windows(如Process Explorer中所示)