如何删除前缀为 Windows 进程名称的十六进制数字

How to Remove Hex Digits Prepended to a Windows Process Name

我使用 Visual Studio 2015 创建了一个 64 位可执行文件,打算在 Windows 上 运行 7. 可执行文件是一个 C++ 包装器,它调用Java 通过 JNI 的应用程序。应用程序 运行 符合预期,但在 Windows 任务管理器中,在 "Process" 选项卡上,我的应用程序名称已添加 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 视图中的 运行ning 有关。任务管理器中的 "Image Path Name" 列是以下值之一,它与我观察到的不正确 "Image Name" 症状直接相关:

\view\view-name\someapp-path\someapp.exe
\view-server\views\domain\username\view-name.vws.s[=62=]035‌ 0005b29594d4a91somea‌ pp.exe

我仍然想知道为什么会这样,但是由于这只影响我们的开发环境,因此修复它已成为低优先级。对于遇到此问题的任何其他人,以下代表我的环境中安装的相关软件:

运行 您的应用程序来自非 ClearCase 动态视图的驱动器。

运行 进程的图像名称引用了 ClearCase 视图存储中的文件(\view\view-name\someapp-path\someapp.exe => \view-server\views\domain\username\view-name.vws\.s[=11=]035‌​0005b29594d4a91somea‌​pp.exe), .vws 表示视图存储。

参见“About dynamic view storage directories”:

Every view has a view storage directory. For dynamic views, this directory is used to keep track of which versions are checked out to your view and to store view-private objects

因此快照和动态视图都存在一个视图存储。
但是对于动态视图,该存储还用于保存您想要 read/execute 的文件的本地副本(所有其他可见文件都通过网络访问 MVFS: MultiVersion File System

这就是为什么您在执行该文件时会看到 \view-server\views\domain\username\view-name.vws\.s[=11=]035‌​0005b29594d4a91somea‌​pp.exe:您会看到 ClearCase 通过 MVFS 完成的本地副本。

如果您使用过快照视图,您将不会看到如此复杂的路径,因为快照视图本质上确实会在本地复制所有 个文件。

It appears as though the path is "correct" when I have not accessed the MVFS mount recently using Windows Explorer

这意味着 Windows 执行的可执行文件仍然是正确的,而 MVFS 将忙于从 Vob 下载相同的可执行文件到视图存储的内部文件夹。
但是一旦您重新执行它,该可执行文件已经存在(在视图存储中),因此 MVFS 会将其完整路径(同样,在视图存储中)传达给 Windows(如进程资源管理器中所示)