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

标签 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 View 运行有关。任务管理器中的“图像路径名称”列是以下值之一,它与我观察到的不正确的“图像名称”症状直接相关:

\view\view-name\someapp-path\someapp.exe
\view-server\views\domain\username\view-name.vws.s\00035\8‌​0005b29594d4a91somea‌​pp.exe

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

  • Windows 7 企业版 x64 SP1
  • Rational ClearCase Explorer 7.1.2.8
  • Visual Studio 2015 更新 3
  • Java x64 JDK 8u112

最佳答案

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

正在运行的进程的图像名称引用 ClearCase View 存储中的文件(\\view\view-name\someapp-path\someapp.exe => \\view-server\views\domain\username\view-name.vws\.s\00035\8‌​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

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

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

如果您使用快照 View ,您就不会看到如此复杂的路径,因为快照 View 本质上会在本地复制所有文件。

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

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

关于c++ - 如何删除 Windows 进程名称前面的十六进制数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44792633/

相关文章:

C++ 模板实例化 - 与 STL 不同,为什么我的模板实例化必须始终是显式的?

c++ - 多线程时如何避免堆栈空间不足?

c++ - 为什么固定宽度无符号整数的输出为负,而无符号整数输出按预期回绕?

visual-studio-2015 - 无法在 Visual Studio 中选择 HoloLens 模拟器作为调试目标

visual-studio - Visual Studio 2015 无法启动 : side-by-side configuration is incorrect

python - py2exe 不会创建 Windows 可执行文件(.exe),当我按下 Exe 文件时,控制台窗口出现并很快消失

Python、PyInstaller 错误 : no module named "Encodings" and system codec missing

winforms - EXE 和 MSI 之间的最佳方法

c++ - 字符串无法识别? C4430 : missing type specifier - int assumed

c++ - GetMessage() 破坏了我的堆栈?