飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 334|回复: 6

[原创] C语言开发的一款可以修改软件标题的工具导入exe程序对标题进行修改源代码实现方案

[复制链接]
  • TA的每日心情
    开心
    2024-8-8 11:24
  • 签到天数: 75 天

    [LV.6]常住居民II

    发表于 前天 15:48 | 显示全部楼层 |阅读模式
    本帖最后由 china365love 于 2025-4-1 16:14 编辑

    EXE 修改工具 (C++/Win32 实现)
    今天我将为您创建一个功能更强大的 EXE 修改工具,使用 C++ 在 Visual Studio 中实现,包含以下功能:
    • 修改 EXE 文件标题
    • 移除界面上的按钮或控件
    • DLL 动态补丁功能
    • 拖放文件支持
    完整实现步骤1. 创建 Visual Studio 项目
    • 打开 Visual Studio
    • 新建项目 -> Windows Desktop Application (Win32)
    • 命名为 "ExeModifier" 并创建
    2. 主要源代码 (ExeModifier.cpp)
    [C++] 纯文本查看 复制代码
    #include <windows.h>
    #include <commctrl.h>
    #include <shlobj.h>
    #include <string>
    #include <vector>
    #include <fstream>
    #include <sstream>
    #include <iomanip>
    #include <algorithm>
    #include "resource.h"
     
    #pragma comment(lib, "comctl32.lib")
    #pragma comment(linker,"\"/manifestdependency:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
     
    // 全局变量
    HWND g_hWnd;
    HWND g_hEditLog;
    HWND g_hTabControl;
    HWND g_hCurrentTab = NULL;
     
    // 当前处理的文件
    std::wstring g_currentFile;
    std::wstring g_backupFile;
     
    // 选项卡页面
    HWND g_hTitlePage;
    HWND g_hPatchPage;
    HWND g_hRemovePage;
     
    // 标题修改控件
    HWND g_hOriginalTitle;
    HWND g_hNewTitle;
    HWND g_hBrowseExe;
     
    // 补丁页面控件
    HWND g_hDllPath;
    HWND g_hBrowseDll;
    HWND g_hPatchButton;
     
    // 移除控件页面
    HWND g_hClassName;
    HWND g_hWindowText;
    HWND g_hRemoveButton;
     
    // 函数声明
    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
    BOOL InitInstance(HINSTANCE, int);
    void CreateTabs();
    void CreateTitlePage(HWND hTab);
    void CreatePatchPage(HWND hTab);
    void CreateRemovePage(HWND hTab);
    void SwitchTab(int index);
    void LogMessage(const std::wstring& message);
    bool BackupFile(const std::wstring& filePath);
    bool ModifyExeTitle(const std::wstring& filePath, const std::wstring& oldTitle, const std::wstring& newTitle);
    bool PatchDllToExe(const std::wstring& exePath, const std::wstring& dllPath);
    bool RemoveWindowControl(const std::wstring& exePath, const std::wstring& className, const std::wstring& windowText);
    std::wstring BrowseForFile(HWND hWnd, const wchar_t* filter, bool open);
     
    // WinMain 入口点
    int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                         _In_opt_ HINSTANCE hPrevInstance,
                         _In_ LPWSTR    lpCmdLine,
                         _In_ int       nCmdShow)
    {
        UNREFERENCED_PARAMETER(hPrevInstance);
        UNREFERENCED_PARAMETER(lpCmdLine);
     
        // 初始化通用控件
        INITCOMMONCONTROLSEX icex;
        icex.dwSize = sizeof(INITCOMMONCONTROLSEX);
        icex.dwICC = ICC_WIN95_CLASSES;
        InitCommonControlsEx(&icex);
     
        // 注册窗口类
        WNDCLASSEXW wcex;
        wcex.cbSize = sizeof(WNDCLASSEX);
        wcex.style          = CS_HREDRAW | CS_VREDRAW;
        wcex.lpfnWndProc    = WndProc;
        wcex.cbClsExtra     = 0;
        wcex.cbWndExtra     = 0;
        wcex.hInstance      = hInstance;
        wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1));
        wcex.hCursor        = LoadCursor(nullptr, IDC_ARROW);
        wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
        wcex.lpszMenuName   = NULL;
        wcex.lpszClassName  = L"ExeModifierClass";
        wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_ICON1));
     
        if (!RegisterClassExW(&wcex))
        {
            return FALSE;
        }
     
        // 创建主窗口
        if (!InitInstance(hInstance, nCmdShow))
        {
            return FALSE;
        }
     
        // 主消息循环
        MSG msg;
        while (GetMessage(&msg, nullptr, 0, 0))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
     
        return (int) msg.wParam;
    }
     
    // 初始化实例
    BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
    {
       g_hWnd = CreateWindowW(L"ExeModifierClass", L"EXE修改工具 - 大飞哥软件自习室", WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
          CW_USEDEFAULT, 0, 800, 600, nullptr, nullptr, hInstance, nullptr);
     
       if (!g_hWnd)
       {
          return FALSE;
       }
     
       // 创建日志编辑框
       g_hEditLog = CreateWindowEx(WS_EX_CLIENTEDGE, L"EDIT", L"", 
           WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY,
           10, 350, 760, 200, g_hWnd, NULL, hInstance, NULL);
     
       // 设置字体
       HFONT hFont = CreateFont(14, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, DEFAULT_CHARSET,
           OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, L"Microsoft YaHei");
       SendMessage(g_hEditLog, WM_SETFONT, (WPARAM)hFont, TRUE);
     
       // 创建选项卡
       CreateTabs();
     
       // 启用拖放
       DragAcceptFiles(g_hWnd, TRUE);
     
       ShowWindow(g_hWnd, nCmdShow);
       UpdateWindow(g_hWnd);
     
       // 初始显示第一个选项卡
       SwitchTab(0);
     
       return TRUE;
    }
     
    // 创建选项卡控件
    void CreateTabs()
    {
        HINSTANCE hInstance = (HINSTANCE)GetWindowLongPtr(g_hWnd, GWLP_HINSTANCE);
     
        // 创建选项卡控件
        g_hTabControl = CreateWindow(WC_TABCONTROL, L"", WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS,
            10, 10, 760, 330, g_hWnd, NULL, hInstance, NULL);
     
        // 添加选项卡
        TCITEM tie;
        tie.mask = TCIF_TEXT;
     
        tie.pszText = L"修改标题";
        TabCtrl_InsertItem(g_hTabControl, 0, &tie);
     
        tie.pszText = L"DLL补丁";
        TabCtrl_InsertItem(g_hTabControl, 1, &tie);
     
        tie.pszText = L"移除控件";
        TabCtrl_InsertItem(g_hTabControl, 2, &tie);
     
        // 创建各个选项卡页面
        CreateTitlePage(g_hTabControl);
        CreatePatchPage(g_hTabControl);
        CreateRemovePage(g_hTabControl);
    }
     
    // 创建标题修改页面
    void CreateTitlePage(HWND hTab)
    {
        HINSTANCE hInstance = (HINSTANCE)GetWindowLongPtr(g_hWnd, GWLP_HINSTANCE);
     
        // 创建页面容器
        g_hTitlePage = CreateWindow(L"STATIC", L"", WS_CHILD | WS_VISIBLE | WS_GROUP,
            20, 40, 740, 290, hTab, NULL, hInstance, NULL);
     
        // 创建控件
        CreateWindow(L"STATIC", L"EXE文件:", WS_CHILD | WS_VISIBLE,
            20, 20, 100, 20, g_hTitlePage, NULL, hInstance, NULL);
     
        HWND hEditExe = CreateWindowEx(WS_EX_CLIENTEDGE, L"EDIT", L"", 
            WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL,
            120, 20, 500, 20, g_hTitlePage, NULL, hInstance, NULL);
        g_hBrowseExe = CreateWindow(L"BUTTON", L"浏览...", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
            630, 20, 80, 20, g_hTitlePage, (HMENU)IDC_BROWSE_EXE, hInstance, NULL);
     
        CreateWindow(L"STATIC", L"原标题:", WS_CHILD | WS_VISIBLE,
            20, 60, 100, 20, g_hTitlePage, NULL, hInstance, NULL);
        g_hOriginalTitle = CreateWindowEx(WS_EX_CLIENTEDGE, L"EDIT", L"", 
            WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL,
            120, 60, 500, 20, g_hTitlePage, NULL, hInstance, NULL);
     
        CreateWindow(L"STATIC", L"新标题:", WS_CHILD | WS_VISIBLE,
            20, 100, 100, 20, g_hTitlePage, NULL, hInstance, NULL);
        g_hNewTitle = CreateWindowEx(WS_EX_CLIENTEDGE, L"EDIT", L"", 
            WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL,
            120, 100, 500, 20, g_hTitlePage, NULL, hInstance, NULL);
     
        CreateWindow(L"BUTTON", L"修改标题", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
            300, 140, 120, 30, g_hTitlePage, (HMENU)IDC_MODIFY_TITLE, hInstance, NULL);
     
        // 设置字体
        HFONT hFont = CreateFont(14, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, DEFAULT_CHARSET,
            OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, L"Microsoft YaHei");
        
        SendMessage(hEditExe, WM_SETFONT, (WPARAM)hFont, TRUE);
        SendMessage(g_hOriginalTitle, WM_SETFONT, (WPARAM)hFont, TRUE);
        SendMessage(g_hNewTitle, WM_SETFONT, (WPARAM)hFont, TRUE);
        SendMessage(g_hBrowseExe, WM_SETFONT, (WPARAM)hFont, TRUE);
    }
     
    // 创建补丁页面
    void CreatePatchPage(HWND hTab)
    {
        HINSTANCE hInstance = (HINSTANCE)GetWindowLongPtr(g_hWnd, GWLP_HINSTANCE);
     
        // 创建页面容器
        g_hPatchPage = CreateWindow(L"STATIC", L"", WS_CHILD | WS_VISIBLE | WS_GROUP,
            20, 40, 740, 290, hTab, NULL, hInstance, NULL);
        ShowWindow(g_hPatchPage, SW_HIDE);
     
        // 创建控件
        CreateWindow(L"STATIC", L"EXE文件:", WS_CHILD | WS_VISIBLE,
            20, 20, 100, 20, g_hPatchPage, NULL, hInstance, NULL);
     
        HWND hEditExe = CreateWindowEx(WS_EX_CLIENTEDGE, L"EDIT", L"", 
            WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL,
            120, 20, 500, 20, g_hPatchPage, NULL, hInstance, NULL);
        CreateWindow(L"BUTTON", L"浏览...", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
            630, 20, 80, 20, g_hPatchPage, (HMENU)IDC_BROWSE_EXE_PATCH, hInstance, NULL);
     
        CreateWindow(L"STATIC", L"DLL文件:", WS_CHILD | WS_VISIBLE,
            20, 60, 100, 20, g_hPatchPage, NULL, hInstance, NULL);
        g_hDllPath = CreateWindowEx(WS_EX_CLIENTEDGE, L"EDIT", L"", 
            WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL,
            120, 60, 500, 20, g_hPatchPage, NULL, hInstance, NULL);
        g_hBrowseDll = CreateWindow(L"BUTTON", L"浏览...", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
            630, 60, 80, 20, g_hPatchPage, (HMENU)IDC_BROWSE_DLL, hInstance, NULL);
     
        g_hPatchButton = CreateWindow(L"BUTTON", L"打补丁", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
            300, 100, 120, 30, g_hPatchPage, (HMENU)IDC_PATCH_EXE, hInstance, NULL);
     
        // 设置字体
        HFONT hFont = CreateFont(14, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, DEFAULT_CHARSET,
            OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, L"Microsoft YaHei");
        
        SendMessage(hEditExe, WM_SETFONT, (WPARAM)hFont, TRUE);
        SendMessage(g_hDllPath, WM_SETFONT, (WPARAM)hFont, TRUE);
        SendMessage(g_hBrowseDll, WM_SETFONT, (WPARAM)hFont, TRUE);
        SendMessage(g_hPatchButton, WM_SETFONT, (WPARAM)hFont, TRUE);
    }
     
    // 创建移除控件页面
    void CreateRemovePage(HWND hTab)
    {
        HINSTANCE hInstance = (HINSTANCE)GetWindowLongPtr(g_hWnd, GWLP_HINSTANCE);
     
        // 创建页面容器
        g_hRemovePage = CreateWindow(L"STATIC", L"", WS_CHILD | WS_VISIBLE | WS_GROUP,
            20, 40, 740, 290, hTab, NULL, hInstance, NULL);
        ShowWindow(g_hRemovePage, SW_HIDE);
     
        // 创建控件
        CreateWindow(L"STATIC", L"EXE文件:", WS_CHILD | WS_VISIBLE,
            20, 20, 100, 20, g_hRemovePage, NULL, hInstance, NULL);
     
        HWND hEditExe = CreateWindowEx(WS_EX_CLIENTEDGE, L"EDIT", L"", 
            WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL,
            120, 20, 500, 20, g_hRemovePage, NULL, hInstance, NULL);
        CreateWindow(L"BUTTON", L"浏览...", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
            630, 20, 80, 20, g_hRemovePage, (HMENU)IDC_BROWSE_EXE_REMOVE, hInstance, NULL);
     
        CreateWindow(L"STATIC", L"类名:", WS_CHILD | WS_VISIBLE,
            20, 60, 100, 20, g_hRemovePage, NULL, hInstance, NULL);
        g_hClassName = CreateWindowEx(WS_EX_CLIENTEDGE, L"EDIT", L"", 
            WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL,
            120, 60, 500, 20, g_hRemovePage, NULL, hInstance, NULL);
     
        CreateWindow(L"STATIC", L"窗口文本:", WS_CHILD | WS_VISIBLE,
            20, 100, 100, 20, g_hRemovePage, NULL, hInstance, NULL);
        g_hWindowText = CreateWindowEx(WS_EX_CLIENTEDGE, L"EDIT", L"", 
            WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL,
            120, 100, 500, 20, g_hRemovePage, NULL, hInstance, NULL);
     
        g_hRemoveButton = CreateWindow(L"BUTTON", L"移除控件", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
            300, 140, 120, 30, g_hRemovePage, (HMENU)IDC_REMOVE_CONTROL, hInstance, NULL);
     
        // 设置字体
        HFONT hFont = CreateFont(14, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, DEFAULT_CHARSET,
            OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, L"Microsoft YaHei");
        
        SendMessage(hEditExe, WM_SETFONT, (WPARAM)hFont, TRUE);
        SendMessage(g_hClassName, WM_SETFONT, (WPARAM)hFont, TRUE);
        SendMessage(g_hWindowText, WM_SETFONT, (WPARAM)hFont, TRUE);
        SendMessage(g_hRemoveButton, WM_SETFONT, (WPARAM)hFont, TRUE);
    }
     
    // 切换选项卡
    void SwitchTab(int index)
    {
        // 隐藏当前选项卡
        if (g_hCurrentTab)
        {
            ShowWindow(g_hCurrentTab, SW_HIDE);
        }
     
        // 显示选中的选项卡
        switch (index)
        {
        case 0:
            g_hCurrentTab = g_hTitlePage;
            break;
        case 1:
            g_hCurrentTab = g_hPatchPage;
            break;
        case 2:
            g_hCurrentTab = g_hRemovePage;
            break;
        }
     
        ShowWindow(g_hCurrentTab, SW_SHOW);
    }
     
    // 窗口过程
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        switch (message)
        {
        case WM_COMMAND:
            {
                int wmId = LOWORD(wParam);
                // 处理菜单选择
                switch (wmId)
                {
                case IDC_BROWSE_EXE:
                case IDC_BROWSE_EXE_PATCH:
                case IDC_BROWSE_EXE_REMOVE:
                    {
                        std::wstring filePath = BrowseForFile(hWnd, L"可执行文件 (*.exe)\0*.exe\0所有文件 (*.*)\0*.*\0", true);
                        if (!filePath.empty())
                        {
                            g_currentFile = filePath;
                            HWND hEdit = NULL;
                            
                            if (wmId == IDC_BROWSE_EXE)
                                hEdit = GetWindow(g_hOriginalTitle, GW_HWNDPREV);
                            else if (wmId == IDC_BROWSE_EXE_PATCH)
                                hEdit = GetWindow(g_hDllPath, GW_HWNDPREV);
                            else if (wmId == IDC_BROWSE_EXE_REMOVE)
                                hEdit = GetWindow(g_hClassName, GW_HWNDPREV);
                            
                            if (hEdit)
                                SetWindowText(hEdit, filePath.c_str());
                            
                            LogMessage(L"已选择文件: " + filePath);
                        }
                    }
                    break;
                    
                case IDC_BROWSE_DLL:
                    {
                        std::wstring filePath = BrowseForFile(hWnd, L"动态链接库 (*.dll)\0*.dll\0所有文件 (*.*)\0*.*\0", true);
                        if (!filePath.empty())
                        {
                            SetWindowText(g_hDllPath, filePath.c_str());
                            LogMessage(L"已选择DLL文件: " + filePath);
                        }
                    }
                    break;
                    
                case IDC_MODIFY_TITLE:
                    {
                        wchar_t originalTitle[256] = {0};
                        wchar_t newTitle[256] = {0};
                        
                        GetWindowText(g_hOriginalTitle, originalTitle, 256);
                        GetWindowText(g_hNewTitle, newTitle, 256);
                        
                        if (g_currentFile.empty())
                        {
                            MessageBox(hWnd, L"请先选择EXE文件", L"错误", MB_ICONERROR);
                            break;
                        }
                        
                        if (wcslen(originalTitle) == 0)
                        {
                            MessageBox(hWnd, L"请输入原标题", L"错误", MB_ICONERROR);
                            break;
                        }
                        
                        if (wcslen(newTitle) == 0)
                        {
                            MessageBox(hWnd, L"请输入新标题", L"错误", MB_ICONERROR);
                            break;
                        }
                        
                        if (BackupFile(g_currentFile))
                        {
                            if (ModifyExeTitle(g_currentFile, originalTitle, newTitle))
                            {
                                LogMessage(L"标题修改成功!");
                                MessageBox(hWnd, L"标题修改成功!", L"成功", MB_ICONINFORMATION);
                            }
                            else
                            {
                                LogMessage(L"标题修改失败!");
                            }
                        }
                    }
                    break;
                    
                case IDC_PATCH_EXE:
                    {
                        if (g_currentFile.empty())
                        {
                            MessageBox(hWnd, L"请先选择EXE文件", L"错误", MB_ICONERROR);
                            break;
                        }
                        
                        wchar_t dllPath[MAX_PATH] = {0};
                        GetWindowText(g_hDllPath, dllPath, MAX_PATH);
                        
                        if (wcslen(dllPath) == 0)
                        {
                            MessageBox(hWnd, L"请选择要注入的DLL文件", L"错误", MB_ICONERROR);
                            break;
                        }
                        
                        if (BackupFile(g_currentFile))
                        {
                            if (PatchDllToExe(g_currentFile, dllPath))
                            {
                                LogMessage(L"DLL注入成功!");
                                MessageBox(hWnd, L"DLL注入成功!", L"成功", MB_ICONINFORMATION);
                            }
                            else
                            {
                                LogMessage(L"DLL注入失败!");
                            }
                        }
                    }
                    break;
                    
                case IDC_REMOVE_CONTROL:
                    {
                        if (g_currentFile.empty())
                        {
                            MessageBox(hWnd, L"请先选择EXE文件", L"错误", MB_ICONERROR);
                            break;
                        }
                        
                        wchar_t className[256] = {0};
                        wchar_t windowText[256] = {0};
                        
                        GetWindowText(g_hClassName, className, 256);
                        GetWindowText(g_hWindowText, windowText, 256);
                        
                        if (wcslen(className) == 0 && wcslen(windowText) == 0)
                        {
                            MessageBox(hWnd, L"请输入类名或窗口文本", L"错误", MB_ICONERROR);
                            break;
                        }
                        
                        if (BackupFile(g_currentFile))
                        {
                            if (RemoveWindowControl(g_currentFile, className, windowText))
                            {
                                LogMessage(L"控件移除成功!");
                                MessageBox(hWnd, L"控件移除成功!", L"成功", MB_ICONINFORMATION);
                            }
                            else
                            {
                                LogMessage(L"控件移除失败!");
                            }
                        }
                    }
                    break;
                    
                default:
                    return DefWindowProc(hWnd, message, wParam, lParam);
                }
            }
            break;
            
        case WM_NOTIFY:
            {
                LPNMHDR lpnmhdr = (LPNMHDR)lParam;
                if (lpnmhdr->hwndFrom == g_hTabControl && lpnmhdr->code == TCN_SELCHANGE)
                {
                    int selectedTab = TabCtrl_GetCurSel(g_hTabControl);
                    SwitchTab(selectedTab);
                }
            }
            break;
            
        case WM_DROPFILES:
            {
                HDROP hDrop = (HDROP)wParam;
                wchar_t filePath[MAX_PATH] = {0};
                
                // 获取拖放的文件路径
                DragQueryFile(hDrop, 0, filePath, MAX_PATH);
                DragFinish(hDrop);
                
                // 检查文件扩展名
                std::wstring ext = filePath;
                size_t dotPos = ext.find_last_of(L".");
                if (dotPos != std::wstring::npos)
                {
                    ext = ext.substr(dotPos);
                    std::transform(ext.begin(), ext.end(), ext.begin(), ::tolower);
                    
                    if (ext == L".exe")
                    {
                        g_currentFile = filePath;
                        
                        // 根据当前选项卡设置对应的编辑框
                        HWND hEdit = NULL;
                        if (g_hCurrentTab == g_hTitlePage)
                            hEdit = GetWindow(g_hOriginalTitle, GW_HWNDPREV);
                        else if (g_hCurrentTab == g_hPatchPage)
                            hEdit = GetWindow(g_hDllPath, GW_HWNDPREV);
                        else if (g_hCurrentTab == g_hRemovePage)
                            hEdit = GetWindow(g_hClassName, GW_HWNDPREV);
                        
                        if (hEdit)
                            SetWindowText(hEdit, filePath.c_str());
                        
                        LogMessage(L"已拖放文件: " + g_currentFile);
                    }
                    else if (ext == L".dll" && g_hCurrentTab == g_hPatchPage)
                    {
                        SetWindowText(g_hDllPath, filePath.c_str());
                        LogMessage(L"已拖放DLL文件: " + std::wstring(filePath));
                    }
                }
            }
            break;
            
        case WM_CLOSE:
            DestroyWindow(hWnd);
            break;
            
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
            
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
        }
        return 0;
    }
     
    // 记录日志
    void LogMessage(const std::wstring& message)
    {
        SYSTEMTIME st;
        GetLocalTime(&st);
        
        std::wstringstream ss;
        ss << std::setw(2) << std::setfill(L'0') << st.wHour << L":"
           << std::setw(2) << std::setfill(L'0') << st.wMinute << L":"
           << std::setw(2) << std::setfill(L'0') << st.wSecond << L" - "
           << message << L"\r\n";
        
        SendMessage(g_hEditLog, EM_SETSEL, (WPARAM)-1, (LPARAM)-1);
        SendMessage(g_hEditLog, EM_REPLACESEL, 0, (LPARAM)ss.str().c_str());
    }
     
    // 浏览文件
    std::wstring BrowseForFile(HWND hWnd, const wchar_t* filter, bool open)
    {
        OPENFILENAME ofn;
        wchar_t filePath[MAX_PATH] = {0};
        
        ZeroMemory(&ofn, sizeof(ofn));
        ofn.lStructSize = sizeof(ofn);
        ofn.hwndOwner = hWnd;
        ofn.lpstrFile = filePath;
        ofn.nMaxFile = MAX_PATH;
        ofn.lpstrFilter = filter;
        ofn.nFilterIndex = 1;
        ofn.lpstrInitialDir = NULL;
        ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
        
        if (open)
        {
            if (GetOpenFileName(&ofn))
                return filePath;
        }
        else
        {
            if (GetSaveFileName(&ofn))
                return filePath;
        }
        
        return L"";
    }
     
    // 创建备份文件
    bool BackupFile(const std::wstring& filePath)
    {
        std::wstring backupDir = filePath.substr(0, filePath.find_last_of(L'\\')) + L"\\backup";
        CreateDirectory(backupDir.c_str(), NULL);
        
        std::wstring fileName = filePath.substr(filePath.find_last_of(L'\\') + 1);
        g_backupFile = backupDir + L"\\original_" + fileName;
        
        if (CopyFile(filePath.c_str(), g_backupFile.c_str(), FALSE))
        {
            LogMessage(L"已创建备份: " + g_backupFile);
            return true;
        }
        else
        {
            LogMessage(L"创建备份失败!");
            return false;
        }
    }
     
    // 修改EXE标题
    bool ModifyExeTitle(const std::wstring& filePath, const std::wstring& oldTitle, const std::wstring& newTitle)
    {
        LogMessage(L"开始修改标题...");
        
        std::ifstream file(filePath, std::ios::binary | std::ios::ate);
        if (!file.is_open())
        {
            LogMessage(L"无法打开文件: " + filePath);
            return false;
        }
        
        std::streamsize size = file.tellg();
        file.seekg(0, std::ios::beg);
        
        std::vector<char> buffer(size);
        if (!file.read(buffer.data(), size))
        {
            LogMessage(L"读取文件失败!");
            return false;
        }
        
        file.close();
        
        // 转换字符串为多字节格式
        int oldTitleSize = WideCharToMultiByte(CP_ACP, 0, oldTitle.c_str(), -1, NULL, 0, NULL, NULL);
        std::vector<char> oldTitleMb(oldTitleSize);
        WideCharToMultiByte(CP_ACP, 0, oldTitle.c_str(), -1, oldTitleMb.data(), oldTitleSize, NULL, NULL);
        
        int newTitleSize = WideCharToMultiByte(CP_ACP, 0, newTitle.c_str(), -1, NULL, 0, NULL, NULL);
        std::vector<char> newTitleMb(newTitleSize);
        WideCharToMultiByte(CP_ACP, 0, newTitle.c_str(), -1, newTitleMb.data(), newTitleSize, NULL, NULL);
        
        // 查找并替换标题
        char* p = buffer.data();
        char* end = p + size - oldTitleMb.size() + 1;
        bool found = false;
        
        for (; p < end; ++p)
        {
            if (memcmp(p, oldTitleMb.data(), oldTitleMb.size() - 1) == 0)
            {
                found = true;
                memcpy(p, newTitleMb.data(), newTitleMb.size() - 1);
                LogMessage(L"找到并替换标题!");
                break;
            }
        }
        
        if (!found)
        {
            LogMessage(L"未找到匹配的标题!");
            return false;
        }
        
        // 写回文件
        std::ofstream outFile(filePath, std::ios::binary | std::ios::trunc);
        if (!outFile.write(buffer.data(), size))
        {
            LogMessage(L"写入文件失败!");
            return false;
        }
        
        outFile.close();
        return true;
    }
     
    // DLL注入
    bool PatchDllToExe(const std::wstring& exePath, const std::wstring& dllPath)
    {
        LogMessage(L"开始DLL注入...");
        
        // 1. 检查DLL文件是否存在
        if (GetFileAttributes(dllPath.c_str()) == INVALID_FILE_ATTRIBUTES)
        {
            LogMessage(L"DLL文件不存在: " + dllPath);
            return false;
        }
        
        // 2. 获取DLL文件名(仅文件名,不含路径)
        std::wstring dllName = dllPath.substr(dllPath.find_last_of(L'\\') + 1);
        
        // 3. 读取EXE文件
        std::ifstream exeFile(exePath, std::ios::binary | std::ios::ate);
        if (!exeFile.is_open())
        {
            LogMessage(L"无法打开EXE文件: " + exePath);
            return false;
        }
        
        std::streamsize size = exeFile.tellg();
        exeFile.seekg(0, std::ios::beg);
        
        std::vector<char> buffer(size);
        if (!exeFile.read(buffer.data(), size))
        {
            LogMessage(L"读取EXE文件失败!");
            return false;
        }
        
        exeFile.close();
        
        // 4. 查找PE文件中的导入表
        PIMAGE_DOS_HEADER dosHeader = (PIMAGE_DOS_HEADER)buffer.data();
        if (dosHeader->e_magic != IMAGE_DOS_SIGNATURE)
        {
            LogMessage(L"无效的DOS头!");
            return false;
        }
        
        PIMAGE_NT_HEADERS ntHeaders = (PIMAGE_NT_HEADERS)(buffer.data() + dosHeader->e_lfanew);
        if (ntHeaders->Signature != IMAGE_NT_SIGNATURE)
        {
            LogMessage(L"无效的NT头!");
            return false;
        }
        
        // 5. 查找或创建导入表
        // 这里简化处理,实际实现需要更复杂的PE文件操作
        // 在实际应用中,建议使用专业的PE解析库
        
        LogMessage(L"DLL注入功能需要更复杂的PE文件操作实现");
        LogMessage(L"当前版本仅演示功能,实际注入需要完整实现");
        
        return false;
    }
     
    // 移除窗口控件
    bool RemoveWindowControl(const std::wstring& exePath, const std::wstring& className, const std::wstring& windowText)
    {
        LogMessage(L"开始移除控件...");
        LogMessage(L"类名: " + className);
        LogMessage(L"窗口文本: " + windowText);
        
        // 在实际应用中,这需要修改EXE的资源段或代码段
        // 这里简化处理,实际实现需要更复杂的PE文件操作
        
        LogMessage(L"控件移除功能需要更复杂的PE文件操作实现");
        LogMessage(L"当前版本仅演示功能,实际移除需要完整实现");
        
        return false;
    }

    // 窗口过程LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){    switch (message)    {    case WM_COMMAND:        {            int wmId = LOWORD(wParam);            // 处理菜单选择            switch (wmId)            {            case IDC_BROWSE_EXE:            case IDC_BROWSE_EXE_PATCH:            case IDC_BROWSE_EXE_REMOVE:                {                    std::wstring filePath = BrowseForFile(hWnd, L"可执行文件 (*.exe)\0*.exe\0所有文件 (*.*)\0*.*\0", true);                    if (!filePath.empty())                    {                        g_currentFile = filePath;                        HWND hEdit = NULL;                                                if (wmId == IDC_BROWSE_EXE)                            hEdit = GetWindow(g_hOriginalTitle, GW_HWNDPREV);                        else if (wmId == IDC_BROWSE_EXE_PATCH)                            hEdit = GetWindow(g_hDllPath, GW_HWNDPREV);                        else if (wmId == IDC_BROWSE_EXE_REMOVE)                            hEdit = GetWindow(g_hClassName, GW_HWNDPREV);                                                if (hEdit)                            SetWindowText(hEdit, filePath.c_str());                                                LogMessage(L"已选择文件: " + filePath);                    }                }                break;                            case IDC_BROWSE_DLL:                {                    std::wstring filePath = BrowseForFile(hWnd, L"动态链接库 (*.dll)\0*.dll\0所有文件 (*.*)\0*.*\0", true);                    if (!filePath.empty())                    {                        SetWindowText(g_hDllPath, filePath.c_str());                        LogMessage(L"已选择DLL文件: " + filePath);                    }                }                break;                            case IDC_MODIFY_TITLE:                {                    wchar_t originalTitle[256] = {0};                    wchar_t newTitle[256] = {0};                                        GetWindowText(g_hOriginalTitle, originalTitle, 256);                    GetWindowText(g_hNewTitle, newTitle, 256);                                        if (g_currentFile.empty())                    {                        MessageBox(hWnd, L"请先选择EXE文件", L"错误", MB_ICONERROR);                        break;                    }                                        if (wcslen(originalTitle) == 0)                    {                        MessageBox(hWnd, L"请输入原标题", L"错误", MB_ICONERROR);                        break;                    }                                        if (wcslen(newTitle) == 0)                    {                        MessageBox(hWnd, L"请输入新标题", L"错误", MB_ICONERROR);                        break;                    }                                        if (BackupFile(g_currentFile))                    {                        if (ModifyExeTitle(g_currentFile, originalTitle, newTitle))                        {                            LogMessage(L"标题修改成功!");                            MessageBox(hWnd, L"标题修改成功!", L"成功", MB_ICONINFORMATION);                        }                        else                        {                            LogMessage(L"标题修改失败!");                        }                    }                }                break;                            case IDC_PATCH_EXE:                {                    if (g_currentFile.empty())                    {                        MessageBox(hWnd, L"请先选择EXE文件", L"错误", MB_ICONERROR);                        break;                    }                                        wchar_t dllPath[MAX_PATH] = {0};                    GetWindowText(g_hDllPath, dllPath, MAX_PATH);                                        if (wcslen(dllPath) == 0)                    {                        MessageBox(hWnd, L"请选择要注入的DLL文件", L"错误", MB_ICONERROR);                        break;                    }                                        if (BackupFile(g_currentFile))                    {                        if (PatchDllToExe(g_currentFile, dllPath))                        {                            LogMessage(L"DLL注入成功!");                            MessageBox(hWnd, L"DLL注入成功!", L"成功", MB_ICONINFORMATION);                        }                        else                        {                            LogMessage(L"DLL注入失败!");                        }                    }                }                break;                            case IDC_REMOVE_CONTROL:                {                    if (g_currentFile.empty())                    {                        MessageBox(hWnd, L"请先选择EXE文件", L"错误", MB_ICONERROR);                        break;                    }                                        wchar_t className[256] = {0};                    wchar_t windowText[256] = {0};                                        GetWindowText(g_hClassName, className, 256);                    GetWindowText(g_hWindowText, windowText, 256);                                        if (wcslen(className) == 0 && wcslen(windowText) == 0)                    {                        MessageBox(hWnd, L"请输入类名或窗口文本", L"错误", MB_ICONERROR);                        break;                    }                                        if (BackupFile(g_currentFile))                    {                        if (RemoveWindowControl(g_currentFile, className, windowText))                        {                            LogMessage(L"控件移除成功!");                            MessageBox(hWnd, L"控件移除成功!", L"成功", MB_ICONINFORMATION);                        }                        else                        {                            LogMessage(L"控件移除失败!");                        }                    }                }                break;                            default:                return DefWindowProc(hWnd, message, wParam, lParam);            }        }        break;            case WM_NOTIFY:        {            LPNMHDR lpnmhdr = (LPNMHDR)lParam;            if (lpnmhdr->hwndFrom == g_hTabControl && lpnmhdr->code == TCN_SELCHANGE)            {                int selectedTab = TabCtrl_GetCurSel(g_hTabControl);                SwitchTab(selectedTab);            }        }        break;            case WM_DROPFILES:        {            HDROP hDrop = (HDROP)wParam;            wchar_t filePath[MAX_PATH] = {0};                        // 获取拖放的文件路径            DragQueryFile(hDrop, 0, filePath, MAX_PATH);            DragFinish(hDrop);                        // 检查文件扩展名            std::wstring ext = filePath;            size_t dotPos = ext.find_last_of(L".");            if (dotPos != std::wstring::npos)            {                ext = ext.substr(dotPos);                std::transform(ext.begin(), ext.end(), ext.begin(), ::tolower);                                if (ext == L".exe")                {                    g_currentFile = filePath;                                        // 根据当前选项卡设置对应的编辑框                    HWND hEdit = NULL;                    if (g_hCurrentTab == g_hTitlePage)                        hEdit = GetWindow(g_hOriginalTitle, GW_HWNDPREV);                    else if (g_hCurrentTab == g_hPatchPage)                        hEdit = GetWindow(g_hDllPath, GW_HWNDPREV);                    else if (g_hCurrentTab == g_hRemovePage)                        hEdit = GetWindow(g_hClassName, GW_HWNDPREV);                                        if (hEdit)                        SetWindowText(hEdit, filePath.c_str());                                        LogMessage(L"已拖放文件: " + g_currentFile);                }                else if (ext == L".dll" && g_hCurrentTab == g_hPatchPage)                {                    SetWindowText(g_hDllPath, filePath.c_str());                    LogMessage(L"已拖放DLL文件: " + std::wstring(filePath));                }            }        }        break;            case WM_CLOSE:        DestroyWindow(hWnd);        break;            case WM_DESTROY:        PostQuitMessage(0);        break;            default:        return DefWindowProc(hWnd, message, wParam, lParam);    }    return 0;}// 记录日志void LogMessage(const std::wstring& message){    SYSTEMTIME st;    GetLocalTime(&st);        std::wstringstream ss;    ss << std::setw(2) << std::setfill(L'0') << st.wHour << L":"       << std::setw(2) << std::setfill(L'0') << st.wMinute << L":"       << std::setw(2) << std::setfill(L'0') << st.wSecond << L" - "       << message << L"\r\n";        SendMessage(g_hEditLog, EM_SETSEL, (WPARAM)-1, (LPARAM)-1);    SendMessage(g_hEditLog, EM_REPLACESEL, 0, (LPARAM)ss.str().c_str());}// 浏览文件std::wstring BrowseForFile(HWND hWnd, const wchar_t* filter, bool open){    OPENFILENAME ofn;    wchar_t filePath[MAX_PATH] = {0};        ZeroMemory(&ofn, sizeof(ofn));    ofn.lStructSize = sizeof(ofn);    ofn.hwndOwner = hWnd;    ofn.lpstrFile = filePath;    ofn.nMaxFile = MAX_PATH;    ofn.lpstrFilter = filter;    ofn.nFilterIndex = 1;    ofn.lpstrInitialDir = NULL;    ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;        if (open)    {        if (GetOpenFileName(&ofn))            return filePath;    }    else    {        if (GetSaveFileName(&ofn))            return filePath;    }        return L"";}// 创建备份文件bool BackupFile(const std::wstring& filePath){    std::wstring backupDir = filePath.substr(0, filePath.find_last_of(L'\\')) + L"\\backup";    CreateDirectory(backupDir.c_str(), NULL);        std::wstring fileName = filePath.substr(filePath.find_last_of(L'\\') + 1);    g_backupFile = backupDir + L"\\original_" + fileName;        if (CopyFile(filePath.c_str(), g_backupFile.c_str(), FALSE))    {        LogMessage(L"已创建备份: " + g_backupFile);        return true;    }    else    {        LogMessage(L"创建备份失败!");        return false;    }}// 修改EXE标题bool ModifyExeTitle(const std::wstring& filePath, const std::wstring& oldTitle, const std::wstring& newTitle){    LogMessage(L"开始修改标题...");        std::ifstream file(filePath, std::ios::binary | std::ios::ate);    if (!file.is_open())    {        LogMessage(L"无法打开文件: " + filePath);        return false;    }        std::streamsize size = file.tellg();    file.seekg(0, std::ios::beg);        std::vector<char> buffer(size);    if (!file.read(buffer.data(), size))    {        LogMessage(L"读取文件失败!");        return false;    }        file.close();        // 转换字符串为多字节格式    int oldTitleSize = WideCharToMultiByte(CP_ACP, 0, oldTitle.c_str(), -1, NULL, 0, NULL, NULL);    std::vector<char> oldTitleMb(oldTitleSize);    WideCharToMultiByte(CP_ACP, 0, oldTitle.c_str(), -1, oldTitleMb.data(), oldTitleSize, NULL, NULL);        int newTitleSize = WideCharToMultiByte(CP_ACP, 0, newTitle.c_str(), -1, NULL, 0, NULL, NULL);    std::vector<char> newTitleMb(newTitleSize);    WideCharToMultiByte(CP_ACP, 0, newTitle.c_str(), -1, newTitleMb.data(), newTitleSize, NULL, NULL);        // 查找并替换标题    char* p = buffer.data();    char* end = p + size - oldTitleMb.size() + 1;    bool found = false;        for (; p < end; ++p)    {        if (memcmp(p, oldTitleMb.data(), oldTitleMb.size() - 1) == 0)        {            found = true;            memcpy(p, newTitleMb.data(), newTitleMb.size() - 1);            LogMessage(L"找到并替换标题!");            break;        }    }        if (!found)    {        LogMessage(L"未找到匹配的标题!");        return false;    }        // 写回文件    std::ofstream outFile(filePath, std::ios::binary | std::ios::trunc);    if (!outFile.write(buffer.data(), size))    {        LogMessage(L"写入文件失败!");        return false;    }        outFile.close();    return true;}// DLL注入bool PatchDllToExe(const std::wstring& exePath, const std::wstring& dllPath){    LogMessage(L"开始DLL注入...");        // 1. 检查DLL文件是否存在    if (GetFileAttributes(dllPath.c_str()) == INVALID_FILE_ATTRIBUTES)    {        LogMessage(L"DLL文件不存在: " + dllPath);        return false;    }        // 2. 获取DLL文件名(仅文件名,不含路径)    std::wstring dllName = dllPath.substr(dllPath.find_last_of(L'\\') + 1);        // 3. 读取EXE文件    std::ifstream exeFile(exePath, std::ios::binary | std::ios::ate);    if (!exeFile.is_open())    {        LogMessage(L"无法打开EXE文件: " + exePath);        return false;    }        std::streamsize size = exeFile.tellg();    exeFile.seekg(0, std::ios::beg);        std::vector<char> buffer(size);    if (!exeFile.read(buffer.data(), size))    {        LogMessage(L"读取EXE文件失败!");        return false;    }        exeFile.close();        // 4. 查找PE文件中的导入表    PIMAGE_DOS_HEADER dosHeader = (PIMAGE_DOS_HEADER)buffer.data();    if (dosHeader->e_magic != IMAGE_DOS_SIGNATURE)    {        LogMessage(L"无效的DOS头!");        return false;    }        PIMAGE_NT_HEADERS ntHeaders = (PIMAGE_NT_HEADERS)(buffer.data() + dosHeader->e_lfanew);    if (ntHeaders->Signature != IMAGE_NT_SIGNATURE)    {        LogMessage(L"无效的NT头!");        return false;    }        // 5. 查找或创建导入表    // 这里简化处理,实际实现需要更复杂的PE文件操作    // 在实际应用中,建议使用专业的PE解析库        LogMessage(L"DLL注入功能需要更复杂的PE文件操作实现");    LogMessage(L"当前版本仅演示功能,实际注入需要完整实现");        return false;}// 移除窗口控件bool RemoveWindowControl(const std::wstring& exePath, const std::wstring& className, const std::wstring& windowText){    LogMessage(L"开始移除控件...");    LogMessage(L"类名: " + className);    LogMessage(L"窗口文本: " + windowText);        // 在实际应用中,这需要修改EXE的资源段或代码段    // 这里简化处理,实际实现需要更复杂的PE文件操作        LogMessage(L"控件移除功能需要更复杂的PE文件操作实现");    LogMessage(L"当前版本仅演示功能,实际移除需要完整实现");        return false;}
    资源文件 (Resource.h)[size=0.875]cpp复制
    #define IDI_ICON1                       101#define IDC_BROWSE_EXE                  1001#define IDC_BROWSE_EXE_PATCH            1002#define IDC_BROWSE_EXE_REMOVE           1003#define IDC_BROWSE_DLL                  1004#define IDC_MODIFY_TITLE                1005#define IDC_PATCH_EXE                   1006#define IDC_REMOVE_CONTROL              1007

    项目完整说明
    • 功能概述:

      • 修改EXE文件标题
      • DLL注入功能
      • 移除窗口控件功能
      • 文件拖放支持
      • 自动备份功能
      • 详细日志记录
    • 使用方法:

      • 编译后运行程序
      • 通过选项卡切换不同功能
      • 浏览或拖放文件到界面
      • 输入必要参数后执行操作
    • 注意事项:

      • DLL注入和控件移除功能需要更复杂的PE文件操作,当前版本仅为框架演示
      • 修改EXE文件可能会破坏数字签名
      • 某些杀毒软件可能会误报

    这个完整版本已经将所有部分正确衔接,您可以直接在Visual Studio中创建Win32项目并添加这些代码文件进行编译。
    我将为您提供 Visual Studio 2019 详细到每一步的图文级指南,确保完全匹配您的版本。请严格按以下步骤操作:

    第一步:创建新项目(精确到每个点击位置)
    • 打开Visual Studio 2019 → 点击起始页的 "创建新项目"
      (或顶部菜单栏:文件 → 新建 → 项目)
    • 在搜索框输入 "Windows桌面向导" → 选择 "Windows桌面向导(C++)" → 下一步
      (如果找不到,先确认安装时勾选了"C++桌面开发"工作负载)
    • 在配置新项目窗口中:
      • 名称输入 ExeModifier
      • 位置选择您的文件夹(例如 D:\Projects\)
      • 勾选 "将解决方案和项目放在同一目录中" (避免嵌套文件夹)
      • 点击 "创建"


    第二步:项目设置(关键步骤!)
    • 此时会弹出 "Windows桌面项目" 配置窗口(这是您找不到的弹窗)
      • 在 "应用程序类型" 选择 "桌面应用程序(.exe)"
      • 在 "附加选项" 中:
        &#9989; 勾选 "空项目"
        &#10060; 取消勾选 "预编译头"
        &#10060; 取消勾选 "安全开发生命周期(SDL)检查"
      • 点击 "确定"

      (如果弹窗未出现,说明您可能选错了项目模板)


    第三步:添加源代码文件(精确到右键菜单层级)
    • 在右侧 "解决方案资源管理器" 中:
      • 展开项目 → 右键 "源文件" 文件夹
      • 选择:添加 → 新建项
      • 在弹窗中选择 "C++文件(.cpp)" → 名称输入 ExeModifier.cpp → 添加
    • 双击打开 ExeModifier.cpp → 粘贴之前提供的 完整代码(确保无遗漏)
    • 同样方法添加头文件:
      • 右键 "头文件" 文件夹 → 添加 → 新建项
      • 选择 "头文件(.h)" → 名称输入 resource.h → 粘贴对应代码


    第四步:修改项目属性(解决编译错误)
    • 右键项目名称 ExeModifier → 选择 "属性"
      (注意:是右键项目,不是解决方案!)
    • 左侧选择:配置属性 → 常规 → 找到 "字符集"
      • 修改为 "使用多字节字符集"
      • 点击 "应用"
    • 继续在属性页中:
      • 选择:配置属性 → C/C++ → 预编译头
      • 将 "预编译头" 改为 "不使用预编译头"
      • 点击 "确定" 保存


    第五步:编译与生成(逐步验证)
    • 顶部菜单栏选择:
      • 解决方案配置 → "Debug"
      • 解决方案平台 → "x86" (兼容性更好)
    • 点击菜单栏:生成 → "生成解决方案"
      • 首次编译需等待3-5分钟
      • 观察底部 "输出" 窗口,应显示"生成成功"
    • 如果报错:
      • 错误LNK2019:检查是否漏掉了代码的某部分
      • C2065未声明的标识符:确认 resource.h 已正确添加
      • 其他错误:右键错误 → 选择"显示错误帮助"


    第六步:找到生成的EXE文件
    • 在文件资源管理器中打开项目文件夹(默认在您之前选择的路径,如 D:\Projects\ExeModifier)
    • 进入子文件夹:
      x86 → Debug → 找到 ExeModifier.exe
      (这就是您需要的软件)


    特殊问题处理
    • 如果看不到"Windows桌面向导"模板:
      • 打开Visual Studio Installer → 修改 → 确保勾选 "使用C++的桌面开发"
      • 安装后重启VS2019
    • 如果代码粘贴后格式混乱:
      • 全选代码 → 按快捷键 Ctrl+K → Ctrl+F 自动格式化
    • 运行时闪退:
      • 右键EXE文件 → 属性 → 兼容性 → 勾选 "以管理员身份运行"


    最终确认
    请告诉我:
    • 您在哪一步操作后结果与预期不符?
    • 是否有具体的错误截图?
      我会针对性提供修复方案。





    PYG19周年生日快乐!
  • TA的每日心情
    奋斗
    2025-1-14 09:50
  • 签到天数: 523 天

    [LV.9]以坛为家II

    发表于 前天 16:54 | 显示全部楼层
    你这是AI写的吧
    PYG19周年生日快乐!
    回复 支持 1 反对 0

    使用道具 举报

  • TA的每日心情
    开心
    2025-1-14 13:49
  • 签到天数: 393 天

    [LV.9]以坛为家II

    发表于 前天 17:48 | 显示全部楼层
    PYG20周年生日快乐!
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-1-6 11:50
  • 签到天数: 7 天

    [LV.3]偶尔看看II

    发表于 前天 20:39 | 显示全部楼层
    收藏了学习下,感谢分享
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2025-1-14 07:49
  • 签到天数: 1587 天

    [LV.Master]伴坛终老

    发表于 昨天 08:09 | 显示全部楼层
    这个不错啊
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-8-24 17:02
  • 签到天数: 13 天

    [LV.3]偶尔看看II

    发表于 昨天 08:47 | 显示全部楼层
    PYG有你更精彩!
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表