如何使用 Notepad++ 作为 7zip 的编辑器,而不显示控制台 window?

How to use Notepad++ as editor for 7zip, without showing a console window?

这个问题可以概括为:如何启动一个给定的进程,并且派生的任何中间进程与启动的进程具有相同的生命周期,并且不显示控制台window.特定的参数必须传递给最终过程,但在初始调用中不能传递参数.

要将 Notepad++ 用作 7zip 的编辑器,您需要使用 -multiInst 命令行参数启动 notepad++.exe,否则它会立即关闭并将参数转发到现有实例。由于 7zip 会在调用的程序关闭时获取您对其临时文件所做的更改,因此您永远没有机会编辑它。

问题是,7zip 不允许您为配置为编辑器的任何程序输入参数。

已经尝试过的明显无效的解决方案:

你会怎么做?我自己尝试或阅读的解决方案都没有完全令人满意。

注意:这与 Execute Batch File without Command line visible 的问题不完全相同,因为它有额外的要求,即无论使用什么启动器,都必须在启动进程的整个生命周期内保持打开状态,并且您不能传递命令启动器的行参数。

我最终编写了自己的实用程序,我暂时将其称为 NoConsoleProgramLauncher 作为 7z 和 Notepad++ 之间的中间件。这是粗略的初稿代码,但我认为分享它可能仍然有用,因为这个问题已经三年没有答案了。

#include <fstream>
#include <string>
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <filesystem>

HINSTANCE hInst;

void launchProcess(std::wstring commandLine);

int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPWSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);
    //Get current executable's location
    HMODULE hModule = GetModuleHandleW(NULL);
    WCHAR executableFolder[MAX_PATH];
    GetModuleFileNameW(hModule, executableFolder, MAX_PATH);
    std::experimental::filesystem::v1::path path(executableFolder);
    path.remove_filename();
    path.append(L"NoConsoleProgramLauncher_Arguments.txt");
    std::wifstream infile(path);
    std::wstring commandLine;
    std::getline(infile, commandLine);
    commandLine += L" ";
    commandLine += lpCmdLine;
    launchProcess(commandLine);
}

void launchProcess(std::wstring commandLine)
{
    STARTUPINFO si;
    PROCESS_INFORMATION pi;

    ZeroMemory(&si, sizeof(si));
    si.cb = sizeof(si);
    ZeroMemory(&pi, sizeof(pi));

    // Start the child process. 
    if (!CreateProcess(NULL,   // No module name (use command line)
        &commandLine[0],        // Command line - C++ 11 guarantees that string's internal buffer is contiguous and null-terminated.
        NULL,           // Process handle not inheritable
        NULL,           // Thread handle not inheritable
        FALSE,          // Set handle inheritance to FALSE
        CREATE_NO_WINDOW,              // No creation flags
        NULL,           // Use parent's environment block
        NULL,           // Use parent's starting directory 
        &si,            // Pointer to STARTUPINFO structure
        &pi)           // Pointer to PROCESS_INFORMATION structure
        )
    {
        printf("CreateProcess failed (%d).\n", GetLastError());
        return;
    }

    // Wait until child process exits.
    WaitForSingleObject(pi.hProcess, INFINITE);

    // Close process and thread handles. 
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);
}

基本上,如果您之前至少进行过 C++ 编码,只需将其粘贴到新的 Visual Studio 2017 Windows 桌面应用程序中即可 项目,根据需要修复包含的内容,然后构建。

正如您在源代码中看到的那样,可执行文件在启动时会在与自身名称相同的文件夹中查找名为“NoConsoleProgramLauncher_Arguments.txt”的文件,并调用它在其中找到的命令行。如问题中所述,不会显示控制台 window,程序将等待生成的进程终止后再退出,因此 7zip 一直在等待接收更改 .

这是我放入 NoConsoleProgramLauncher_Arguments.txt 文件的内容:

"C:\Program Files (x86)\Notepad++\notepad++.exe" -multiInst -nosession

并且在 7zip 配置中,我将编辑器设置为指向我的 NoConsoleProgramLauncher.exe 程序。

真正的解决方案当然是就此轻轻地纠缠 7z 作者,或者更好的是,向 7z 提交拉取请求以实现向您选择的编辑器传递参数。