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

时间:2017-06-28 02:19:05

标签: c++ visual-studio-2015 exe clearcase windows-7-x64

我使用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

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

  • Windows 7 Enterprise x64 SP1
  • Rational ClearCase Explorer 7.1.2.8
  • Visual Studio 2015 Update 3
  • Java x64 JDK 8u112

1 个答案:

答案 0 :(得分:2)

从不是ClearCase动态视图的驱动器运行您的应用程序。

正在运行的进程的映像名称引用ClearCase视图中的文件存储(\\view\view-name\someapp-path\someapp.exe =&gt; \\view-server\views\domain\username\view-name.vws\.s\00035\8‌​0005b29594d4a91somea‌​pp.exe),.vws含义视图存储。

请参阅“About dynamic view storage directories”:

  

每个视图都有一个视图存储目录。对于动态视图,此目录用于跟踪检出视图的哪些版本以及存储视图私有对象

因此,快照和动态视图都存在视图存储 但对于动态视图,该存储还用于保存您要读取/执行的文件的本地副本(所有其他可见文件都通过网络使用MVFS: MultiVersion File System访问)

这就是你执行该文件时看到\\view-server\views\domain\username\view-name.vws\.s\00035\8‌​0005b29594d4a91somea‌​pp.exe的原因:你看到ClearCase通过MVFS完成了本地拷贝。

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

  

当我最近没有使用Windows资源管理器访问MVFS安装时,似乎路径是“正确的”

这意味着Windows执行的可执行文件仍然是正确的,而MVFS将忙于将相同的可执行文件从Vob下载到视图存储的内部文件夹。 但是一旦你重新执行它,那个可执行文件就已存在(在视图存储中),因此MVFS会将其完整路径(再次在视图存储中)传递给Windows(如Process Explorer中所示)