39.右键弹出菜单管理游戏列表

上一个内容:38.控制功能实现

以 ​​​​​​​ 38.控制功能实现 它的代码为基础进行修改

效果图:

点击设置之后的样子

点击删除

点击删除之后的样子

实现步骤:

首先添加一个菜单资源,右击项目资源选择下图红框

然后选择Menu

然后双击请在此输入,搞成下图中的样子

然后给列表添加右击事件

CWndAddGame.h文件,新加 SetData函数。修改了Init、OnBnClickedButton3函数

#pragma once

// CWndAddGame 对话框

class CWndAddGame : public CDialogEx
{
    DECLARE_DYNAMIC(CWndAddGame)

public:
    CWndAddGame(CWnd* pParent = nullptr);   // 标准构造函数
    virtual ~CWndAddGame();

// 对话框数据
#ifdef AFX_DESIGN_TIME
    enum { IDD = IDD_ADDGAME };
#endif

protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

    DECLARE_MESSAGE_MAP()
public:
    afx_msg void OnBnClickedButton1();
    CString GameName;
    CString GamePath;
    CString GameFullPath;
    CString GameCmds;
    CString DllPath;

    void* father;
    bool IsCreate;
    int index;

    afx_msg void OnBnClickedButton2();
    afx_msg void OnBnClickedButton4();
    afx_msg void OnBnClickedButton3();
public:

    void Init(void* _father, bool Create = true, int _index = 0);
    void SetData(CString& _GameName,
        CString& _GamePath, 
        CString& _GameExe, 
        CString& _GameCmds, 
        CString& _DllPath);
};

CWndAddGame.cpp文件:

#include "pch.h"
#include "GAMEHACKER2.h"
#include "CWndAddGame.h"
#include "afxdialogex.h"
#include "CWndINJ.h"

// CWndAddGame 对话框

IMPLEMENT_DYNAMIC(CWndAddGame, CDialogEx)

CWndAddGame::CWndAddGame(CWnd* pParent /*=nullptr*/)
    : CDialogEx(IDD_ADDGAME, pParent)
    , GameName(_T(""))
    , GamePath(_T(""))
    , GameFullPath(_T(""))
    , DllPath(_T(""))
{

}

CWndAddGame::~CWndAddGame()
{
}

void CWndAddGame::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
    DDX_Text(pDX, IDC_EDIT1, GameName);
    DDX_Text(pDX, IDC_EDIT2, GamePath);
    DDX_Text(pDX, IDC_EDIT3, GameFullPath);
    DDX_Text(pDX, IDC_EDIT4, GameCmds);
    DDX_Text(pDX, IDC_EDIT5, DllPath);
}


BEGIN_MESSAGE_MAP(CWndAddGame, CDialogEx)
    ON_BN_CLICKED(IDC_BUTTON1, &CWndAddGame::OnBnClickedButton1)
    ON_BN_CLICKED(IDC_BUTTON2, &CWndAddGame::OnBnClickedButton2)
    ON_BN_CLICKED(IDC_BUTTON4, &CWndAddGame::OnBnClickedButton4)
    ON_BN_CLICKED(IDC_BUTTON3, &CWndAddGame::OnBnClickedButton3)
END_MESSAGE_MAP()


// CWndAddGame 消息处理程序


void CWndAddGame::OnBnClickedButton1()
{
    
    static TCHAR BASED_CODE szFilter[] = _T("exe (*.exe)|*.exe|dat (*.dat)|*.dat|All (*.*)|*.*||");
    // CFileDialog是mfc封装好的打开文件或另存为窗口
    CFileDialog dialog(TRUE, NULL, NULL, 6,szFilter);
    UpdateData(TRUE);
    if (dialog.DoModal() == IDOK)
    {

        // 游戏可执行文件
        GameFullPath = dialog.GetPathName();
        // 游戏名称
        GameName = dialog.GetFileTitle();
        // 游戏路径
        GamePath = dialog.GetFolderPath() + L"\\";
        UpdateData(FALSE);
    }
}


void CWndAddGame::OnBnClickedButton2()
{
    UpdateData(TRUE);
    static TCHAR BASED_CODE szFilter[] = _T("动态链接库 (*.dll)|*.dll|All (*.*)|*.*||");
    // CFileDialog是mfc封装好的打开文件或另存为窗口
    CFileDialog dialog(TRUE, NULL, NULL, 6, szFilter);
    if (dialog.DoModal() == IDOK)
    {
        // 注入模块路径
        DllPath = dialog.GetPathName();
        UpdateData(FALSE);
    }
}


void CWndAddGame::OnBnClickedButton4()
{
    CDialog::OnCancel();
}


void CWndAddGame::OnBnClickedButton3()
{
    CWndINJ* p = (CWndINJ*)father;
    UpdateData(TRUE);
    if (IsCreate) {
        p->AddGame(GameName, GameFullPath, GamePath, GameCmds, DllPath);
    }
    else {
        p->SaveGame(GameName, GameFullPath, GamePath, GameCmds, DllPath, index);
    }
    
    CDialog::OnCancel();
}

void CWndAddGame::Init(void* _father, bool Create, int _index)
{
    father = _father;
    IsCreate = Create;
    index = _index;
}

void CWndAddGame::SetData(CString& _GameName, CString& _GamePath, CString& _GameExe, CString& _GameCmds, CString& _DllPath)
{
    GameName = _GameName;
    GamePath = _GamePath;
    GameCmds = _GameCmds;
    GameFullPath = _GameExe;
    DllPath = _DllPath;
    
}

CWndINJ.h文件中的代码,新加 OnMenuSet、OnMenuDel、OnNMRClickList1、SaveLstToIni、SaveGame。新加变量 lstSel

#pragma once

#include "CWndAddGame.h"
#include "INJCET.h"

// CWndINJ 对话框

class CWndINJ : public CDialogEx
{
    DECLARE_DYNAMIC(CWndINJ)

public:
    CWndINJ(CWnd* pParent = nullptr);   // 标准构造函数
    virtual ~CWndINJ();

// 对话框数据
#ifdef AFX_DESIGN_TIME
    enum { IDD = IDD_PAGE_0 };
#endif

protected:
    INJCET m_INJCET;
    virtual BOOL OnInitDialog();
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

    DECLARE_MESSAGE_MAP()
public:
    CListCtrl ExeLst;
    afx_msg void OnBnClickedButton1();

    // 注入
    BOOL B_INJCET;
    // 调试
    BOOL B_DEBUG;
    // 暂停
    BOOL B_PAUSE;

    CWndAddGame wndAddGame;

    CString AppPath;
    // 配置文件路径
    CString GameIni;
public:
    void Init(CString& _AppPath);
    void AddGame(CString& GameName, 
        CString& GamePath,
        CString& GameFullPath,
        CString& GameCmds,
        CString& DllPath);

    void SaveGame(CString& GameName,
        CString& GamePath,
        CString& GameFullPath,
        CString& GameCmds,
        CString& DllPath,
        int index);

    void LoadGame();
    afx_msg void OnNMDblclkList1(NMHDR* pNMHDR, LRESULT* pResult);
    afx_msg void OnNMRClickList1(NMHDR* pNMHDR, LRESULT* pResult);
    afx_msg void OnMenuSet();
    afx_msg void OnMenuDel();

    int lstSel;
    void SaveLstToIni();
};

CWndINJ.cpp文件中的代码

 // CWndINJ.cpp: 实现文件
//

#include "pch.h"
#include "GAMEHACKER2.h"
#include "CWndINJ.h"
#include "afxdialogex.h"

#include <ImageHlp.h>
#include <fstream>
#pragma comment(lib, "ImageHlp.lib")



//void _stdcall INJECTCode() {
//    AfxMessageBox(L"aa");
//    unsigned address = 0xCCCCCCCC;
//    PREMOTE_DATA p = (PREMOTE_DATA)address;
//    p->f_LoadLibrary(p->dllName);
//}

// CWndINJ 对话框

IMPLEMENT_DYNAMIC(CWndINJ, CDialogEx)

CWndINJ::CWndINJ(CWnd* pParent /*=nullptr*/)
    : CDialogEx(IDD_PAGE_0, pParent)
    , B_INJCET(FALSE)
    , B_DEBUG(FALSE)
    , B_PAUSE(FALSE)
{

}

CWndINJ::~CWndINJ()
{
}

BOOL CWndINJ::OnInitDialog()
{
    CDialogEx::OnInitDialog();
    
    LONG_PTR lStyle;
    // 得到窗口的样式,GWL_STYLE在GetWindowLongPtr说明中有
    lStyle = GetWindowLongPtr(ExeLst.m_hWnd, GWL_STYLE);
    lStyle |= LVS_REPORT;
    SetWindowLongPtr(ExeLst.m_hWnd, GWL_STYLE, lStyle);

    DWORD dStyle = ExeLst.GetExtendedStyle();
    dStyle |= LVS_EX_FULLROWSELECT;
    dStyle |= LVS_EX_GRIDLINES;
    ExeLst.SetExtendedStyle(dStyle);

    ExeLst.InsertColumn(0, L"名称", 0, 200);
    ExeLst.InsertColumn(1, L"可执行文件", 0, 400);
    ExeLst.InsertColumn(2, L"文件夹", 0, 400);
    ExeLst.InsertColumn(3, L"命令行", 0, 400);
    ExeLst.InsertColumn(4, L"注入模块", 0, 400);

    return 0;
}

void CWndINJ::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
    DDX_Control(pDX, IDC_LIST1, ExeLst);
    DDX_Check(pDX, IDC_CHECK1, B_INJCET);
    DDX_Check(pDX, IDC_CHECK2, B_DEBUG);
    DDX_Check(pDX, IDC_CHECK3, B_PAUSE);
}


BEGIN_MESSAGE_MAP(CWndINJ, CDialogEx)
    ON_BN_CLICKED(IDC_BUTTON1, &CWndINJ::OnBnClickedButton1)
    ON_NOTIFY(NM_DBLCLK, IDC_LIST1, &CWndINJ::OnNMDblclkList1)
    ON_NOTIFY(NM_RCLICK, IDC_LIST1, &CWndINJ::OnNMRClickList1)
    ON_COMMAND(ID_32771, &CWndINJ::OnMenuSet)
    ON_COMMAND(ID_32772, &CWndINJ::OnMenuDel)
END_MESSAGE_MAP()


// CWndINJ 消息处理程序


void CWndINJ::OnBnClickedButton1()
{
    // TODO: 在此添加控件通知处理程序代码
    /*ExeLst.InsertItem(0, L"DNF");
    ExeLst.SetItemText(0, 1, L"dlls.dll");*/
    
     用来指定创建时进程的主窗口的窗口工作站、桌面、标准句柄和外观。
    //STARTUPINFO si{};
    //si.cb = sizeof(si);
    //PROCESS_INFORMATION prinfo{};
    //CreateProcess(L"C:\\Users\\am\\Desktop\\易道云\\游戏保护\\练手游戏\\初级\\JX2\\Sword2.exe",
    //    NULL,NULL,NULL,
    //    FALSE,
    //    // 新进程的主线程处于挂起状态创建,在调用 ResumeThread 函数之前不会运行。
    //    CREATE_SUSPENDED,
    //    NULL,
    //    L"C:\\Users\\am\\Desktop\\易道云\\游戏保护\\练手游戏\\初级\\JX2\\",
    //    &si,
    //    &prinfo
    //    );

    ///**
    //    注入功能写在这里(CreateProcess与ResumeThread函数之间)
    //*/


     让游戏继续运行
    //ResumeThread(prinfo.hThread);
    wndAddGame.Init(this);
    wndAddGame.DoModal();
    
}

void CWndINJ::Init(CString& _AppPath)
{
    AppPath = _AppPath;
    GameIni.Format(L"%s\\config\\Games.ini", AppPath);
    LoadGame();
}

void CWndINJ::AddGame(CString& GameName, CString& GamePath, CString& GameFullPath, CString& GameCmds, CString& DllPath)
{
    int count = GetPrivateProfileInt(L"main", L"count", 0, GameIni);
    count++;
    CString key;
    key.Format(L"count_%d", count);
    WritePrivateProfileString(key, L"GameName", GameName, GameIni);
    WritePrivateProfileString(key, L"GamePath", GamePath, GameIni);
    WritePrivateProfileString(key, L"GameFullPath", GameFullPath, GameIni);
    WritePrivateProfileString(key, L"GameCmds", GameCmds, GameIni);
    WritePrivateProfileString(key, L"DllPath", DllPath, GameIni);

    CString wCount;
    wCount.Format(L"%d", count);
    WritePrivateProfileString(L"main", L"count", wCount, GameIni);

    int iCount = ExeLst.GetItemCount();
    ExeLst.InsertItem(iCount, GameName);
    ExeLst.SetItemText(iCount, 1, GamePath);
    ExeLst.SetItemText(iCount, 2, GameFullPath);
    ExeLst.SetItemText(iCount, 3, GameCmds);
    ExeLst.SetItemText(iCount, 4, DllPath);

}

void CWndINJ::SaveGame(CString& GameName, CString& GamePath, CString& GameFullPath, CString& GameCmds, CString& DllPath, int index)
{
    CString key;
    key.Format(L"count_%d", index);
    WritePrivateProfileString(key, L"GameName", GameName, GameIni);
    WritePrivateProfileString(key, L"GamePath", GamePath, GameIni);
    WritePrivateProfileString(key, L"GameFullPath", GameFullPath, GameIni);
    WritePrivateProfileString(key, L"GameCmds", GameCmds, GameIni);
    WritePrivateProfileString(key, L"DllPath", DllPath, GameIni);

    int iCount = index-1;
    ExeLst.SetItemText(iCount, 0, GameName);
    ExeLst.SetItemText(iCount, 1, GamePath);
    ExeLst.SetItemText(iCount, 2, GameFullPath);
    ExeLst.SetItemText(iCount, 3, GameCmds);
    ExeLst.SetItemText(iCount, 4, DllPath);
}

void CWndINJ::LoadGame()
{
    int count = GetPrivateProfileInt(L"main", L"count", 0, GameIni);
    for (int i = 0; i < count; i++) {
        CString GameName, GameExe, GamePath, GameCmds, GameDlls, _AppName;
        _AppName.Format(L"count_%d", i+1);
        wchar_t wRead[0xFF];
        GetPrivateProfileString(_AppName, L"GameName", L"", wRead, 0xFF, GameIni);
        GameName.Format(L"%s", wRead);
        GetPrivateProfileString(_AppName, L"GamePath", L"", wRead, 0xFF, GameIni);
        GameExe.Format(L"%s", wRead);
        GetPrivateProfileString(_AppName, L"GameFullPath", L"", wRead, 0xFF, GameIni);
        GamePath.Format(L"%s", wRead);
        GetPrivateProfileString(_AppName, L"GameCmds", L"", wRead, 0xFF, GameIni);
        GameCmds.Format(L"%s", wRead);
        GetPrivateProfileString(_AppName, L"DllPath", L"", wRead, 0xFF, GameIni);
        GameDlls.Format(L"%s", wRead);
        
        ExeLst.InsertItem(i, GameName);
        ExeLst.SetItemText(i, 1,  GameExe);
        ExeLst.SetItemText(i, 2, GamePath);
        ExeLst.SetItemText(i, 3, GameCmds);
        ExeLst.SetItemText(i, 4, GameDlls);
    }
}

void* _imageload(wchar_t* filename) {
    std::ifstream streamReader(filename, std::ios::binary);
    streamReader.seekg(0, std::ios::end);
    unsigned filesize = streamReader.tellg();
    char* _data = new char[filesize];
    streamReader.seekg(0, std::ios::beg);
    streamReader.read(_data, filesize);
    streamReader.close();
    return _data;
}

void _unloadimage(void* _data) {
    delete[] _data;
}

void CWndINJ::OnNMDblclkList1(NMHDR* pNMHDR, LRESULT* pResult)
{
    LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
    // TODO: 在此添加控件通知处理程序代码
    *pResult = 0;
    int index = pNMItemActivate->iItem;
    if (index < 0)return;

    CString GamePath = ExeLst.GetItemText(index, 2);
    CString GameExe = ExeLst.GetItemText(index, 1);
    CString GameCmds = ExeLst.GetItemText(index, 3);
    CString GameDlls = ExeLst.GetItemText(index, 4);

    UpdateData(TRUE);
    PROCESS_INFORMATION prinfo{};
    bool Pause = B_PAUSE;

    if (B_INJCET && (GameDlls.GetLength() > 1)) {
        Pause = true;
    }

    m_INJCET.StartProcess(GameExe, GamePath, GameCmds.GetBuffer(), &prinfo, Pause);
    if (B_INJCET && (GameDlls.GetLength() > 1)) {
        m_INJCET.CreateRemoteData(prinfo.hProcess, GameExe, GameDlls);
    }

    if (B_DEBUG)
    {
        PROCESS_INFORMATION odinfo{};
        //F:\其它\OllyDbg\Ollydbg.exe - p 4760
        CString dbgExe, dbgPath, dbgCmds;
        dbgExe = L"F:\\其它\\OllyDbg\\Ollydbg.exe";
        dbgPath = L"F:\\其它\\OllyDbg\\";
        dbgCmds.Format(L"%s -p %d", dbgExe, prinfo.dwProcessId);
        m_INJCET.StartProcess(dbgExe, dbgPath, dbgCmds.GetBuffer(), &odinfo, false);
    }

    if (B_PAUSE) {
        AfxMessageBox(L"按下确认,进程开始执行!");
    }

    ResumeThread(prinfo.hThread);

    // 用来指定创建时进程的主窗口的窗口工作站、桌面、标准句柄和外观。
    // STARTUPINFO si{};
    // si.cb = sizeof(si);



    //STARTUPINFO si{};
    //si.cb = sizeof(si);
    //CreateProcess(dbgExe,
    //    dbgExe.GetBuffer(),
    //    NULL, NULL,
    //    false,
    //    // 新进程的主线程处于挂起状态创建,在调用 ResumeThread 函数之前不会运行。
    //    0,
    //    NULL,
    //    dbgPath,
    //    &si,
    //    &odinfo
    //);


    //ResumeThread(odinfo.hThread);
 //m_INJCET.CodeRemoteData(&_data);
    
    /**
        CreateProcess(GameExe,
        GameCmds.GetBuffer(),
        NULL,NULL,
        FALSE,
        // 新进程的主线程处于挂起状态创建,在调用 ResumeThread 函数之前不会运行。
        CREATE_SUSPENDED,
        NULL,
        GamePath,
        &si,
        &prinfo
        );
    */

    /** 方式一调用api
        CStringA GameExeA;
        GameExeA = GameExe;
        PLOADED_IMAGE image =  ImageLoad(GameExeA, NULL);
        DWORD dEntryPoint = image->FileHeader->OptionalHeader.AddressOfEntryPoint;
        CString wTxt;
        wTxt.Format(L"%X", dEntryPoint);
        AfxMessageBox(wTxt);
        ImageUnload(image)
    */

    /** 方式二(要在32位环境下运行)
    void* image = _imageload(GameExe.GetBuffer());
    IMAGE_DOS_HEADER* dosHeader = (IMAGE_DOS_HEADER*)image;
    unsigned PEAddress =  dosHeader->e_lfanew + (unsigned)image;
    IMAGE_NT_HEADERS* ntHeader = (IMAGE_NT_HEADERS*)PEAddress;
    DWORD dEntryPoint = ntHeader->OptionalHeader.AddressOfEntryPoint;
    CString wTxt;
    wTxt.Format(L"%X", dEntryPoint);
    AfxMessageBox(wTxt);
    _unloadimage(image);
    */
    //LPVOID adrRemote = VirtualAllocEx(prinfo.hProcess, 0, 0x3000, MEM_COMMIT, PAGE_EXECUTE_READWRITE);

    //SIZE_T lwt;

    //WriteProcessMemory(prinfo.hProcess, adrRemote, INJECTCode, 0x200, &lwt);

    //CString wTxt;
    //wTxt.Format(L"%X", adrRemote);
    //AfxMessageBox(wTxt);
    // 让游戏继续运行
    //m_INJCET.CreateRemoteData(prinfo.hProcess, GameDlls.GetBuffer());
    
}


void CWndINJ::OnNMRClickList1(NMHDR* pNMHDR, LRESULT* pResult)
{
    LPNMITEMACTIVATE pActive = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
    // TODO: 在此添加控件通知处理程序代码
    *pResult = 0;
    if (pActive->iItem != -1) {
        lstSel = pActive->iItem;
        // 获取最后一个消息发生时的鼠标位置
        DWORD dwPos = GetMessagePos();
        CPoint point(LOWORD(dwPos), HIWORD(dwPos));
        CMenu menu;
        menu.LoadMenuW(IDR_MENU1);
        CMenu* pop = menu.GetSubMenu(0);
        pop->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON, point.x,point.y, this);
    }
}


void CWndINJ::OnMenuSet()
{
    // TODO: 在此添加命令处理程序代码
    //AfxMessageBox(L"按下了设置");
    CString GameName = ExeLst.GetItemText(lstSel, 0);
    CString GamePath = ExeLst.GetItemText(lstSel, 2);
    CString GameExe = ExeLst.GetItemText(lstSel, 1);
    CString GameCmds = ExeLst.GetItemText(lstSel, 3);
    CString GameDlls = ExeLst.GetItemText(lstSel, 4);
    
    wndAddGame.Init(this, false, lstSel+1);
    wndAddGame.SetData(GameName, GamePath, GameExe, GameCmds, GameDlls);
    wndAddGame.DoModal();

}


void CWndINJ::OnMenuDel()
{
    // TODO: 在此添加命令处理程序代码
    //AfxMessageBox(L"按下了删除");
    ExeLst.DeleteItem(lstSel);
    SaveLstToIni();
}

void CWndINJ::SaveLstToIni()
{
    int count = ExeLst.GetItemCount();
    for (int i = 0; i < count; i++) {
        
        CString GameName = ExeLst.GetItemText(i, 0);
        CString GamePath = ExeLst.GetItemText(i, 2);
        CString GameExe = ExeLst.GetItemText(i, 1);
        CString GameCmds = ExeLst.GetItemText(i, 3);
        CString GameDlls = ExeLst.GetItemText(i, 4);

        int tempI = i + 1;
        CString key;
        key.Format(L"count_%d", tempI);

        WritePrivateProfileString(key, L"GameName", GameName, GameIni);
        WritePrivateProfileString(key, L"GamePath", GameExe, GameIni);
        WritePrivateProfileString(key, L"GameFullPath", GamePath, GameIni);
        WritePrivateProfileString(key, L"GameCmds", GameCmds, GameIni);
        WritePrivateProfileString(key, L"DllPath", GameDlls, GameIni);
    }

    CString wCount;
    wCount.Format(L"%d", count);
    WritePrivateProfileString(L"main", L"count", wCount, GameIni);

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/747561.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Docker(九)-Docker运行redis6.0.8容器实例

1.宿主机新建目录存放redis.conf文件 目的&#xff1a;运行redis容器实例时使用自己的配置文件2.运行redis容器实例 docker run -d -p 6379:6379 --privilegedtrue -v 【宿主机配置文件目录】:/etc/redis/redis.conf -v 【宿主机数据目录】:/data --nameredis6.0.8 redis:6.0…

Keka for Mac:轻量级压缩解压神器

Keka for Mac是一款专为Mac用户打造的轻量级压缩解压软件&#xff0c;凭借其强大的功能和简洁易用的界面&#xff0c;赢得了众多用户的喜爱。无论是日常办公还是学习娱乐&#xff0c;Keka都能为您提供高效、安全的文件压缩和解压体验。 Keka for Mac v1.4.2中文版下载 产品特点…

记录一次CMS的代码审计

本次代码审计使用了白加黑的手法&#xff0c;用黑盒的视角测试功能点&#xff0c;用白盒的方式作为验证。 0x1 XSS guestbook处&#xff0c;可以看到有一个留言板 idea搜索guestbook。发现代码如下&#xff0c;其中的getModel是获取数据的方法。Guestbook.class就是具体要获取…

MySQL索引优化解决方案--索引介绍(1)

什么是索引 MySQL官方对于索引的定义&#xff1a;索引是帮助MySQL高效过去数据的数据结构。 MySQL在存储数据之外&#xff0c;数据库系统中还维护着满足特定查找算法的数据结构&#xff0c;这些数据结构以某种引用&#xff08;指向&#xff09;表中的数据&#xff0c;这样我们…

使用ChatGPT提升编程效率:程序员的最佳实践分享

在这个信息技术飞速发展的时代&#xff0c;编程已经成为了越来越多人的必备技能。无论你是初学者&#xff0c;还是经验丰富的开发者&#xff0c;都可能会遇到编程中的各种问题和挑战。幸运的是&#xff0c;AI 技术的进步让我们有了新的解决工具——ChatGPT。作为一名科技博客博…

51单片机STC89C52RC——9.1 DS1302涓流充电计时芯片

目录 目的/效果 一&#xff0c;STC单片机模块 二&#xff0c;DS1302计时器 2.1 特性/板子位置 2.1.1 特性 2.1.2 板子上的位置 2.2 针脚定义 2.3 数据传输 2.3.1 读数据 2.3.2 写数据 2.4 BCD码 2.5 可编程涓流充电器 2.6 时钟动态设置 三&#xff0c;创建Keil项目…

Leetcode 102.目标和

给定一个正整数数组 nums 和一个整数 target 。 向数组中的每个整数前添加 ‘’ 或 ‘-’ &#xff0c;然后串联起所有整数&#xff0c;可以构造一个 表达式 &#xff1a; 例如&#xff0c;nums [2, 1] &#xff0c;可以在 2 之前添加 ‘’ &#xff0c;在 1 之前添加 ‘-’ &…

2024最新pd激活码 Parallels Desktop 19 激活秘钥分享

Parallels Desktop 19 for Mac 乃是一款适配于 Mac 的虚拟化软件。它能让您在 Mac 计算机上同时运行多个操作系统。您可借此创建虚拟机&#xff0c;并于其中装设不同的操作系统&#xff0c;如 Windows、Linux 或 macOS。使用 Parallels Desktop 19 mac 版时&#xff0c;您可在 …

【UE5.3】笔记2--资源导入

资源导入 方式一&#xff1a;内置资源--初学者内容包 方式二&#xff1a;虚幻商城 搜索免费资源&#xff1a; 添加到工程之后 搜素&#xff1a;虚幻学习工具包&#xff0c;需要注意的是支持的引擎版本 当然商城里包含了大量的免费的资源&#xff0c;初期学习不想投入太多可以…

OpenCL在移动端GPU计算中的应用与实践

一、引言 移动端芯片性能的不断提升为在手机上进行计算密集型任务&#xff0c;如计算机图形学和深度学习模型推理&#xff0c;提供了可能。在Android设备上&#xff0c;GPU&#xff0c;尤其是高通Adreno和华为Mali&#xff0c;因其卓越的浮点运算能力&#xff0c;成为了异构计…

OZON跨境卖家爆款产品有哪些

OZON跨境卖家爆款产品有哪些&#xff1f;国内的Ozon跨境卖家做这几个品&#xff0c;不爆都难&#xff01; Top1 太阳镜 Очки солнцезащитные 商品id&#xff1a;1556874194 月销量&#xff1a;1095 OZON跨境卖家爆款产品工具&#xff1a;D。DDqbt。COm/…

【Docker】Docker简介_运行原理

1、简介 1.1基本概念 容器&#xff1a;容器是Docker的基本部署单元。它是一个轻量级的、独立的运行时环境&#xff0c;包含应用程序及其相关依赖。容器利用Linux内核的命名空间和控制组技术&#xff0c;实现了隔离性和资源管理&#xff0c;使得应用程序在不同的容器中运行不会…

2024 最新运营小工具 API 推荐,助力高效工作

在当今数字化运营的时代&#xff0c;各种高效便捷的 API 服务成为了企业和个人提升运营效率、获取精准数据的得力助手。无论是进行市场调研、拓展业务&#xff0c;还是优化网络资源配置&#xff0c;都离不开这些强大的工具。本文将为您详细介绍一系列实用的运营小工具 API 服务…

使用API有效率地管理Dynadot域名,为文件夹更名

关于Dynadot Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮…

【HarmonyOS4学习笔记】《HarmonyOS4+NEXT星河版入门到企业级实战教程》课程学习笔记(十八)

课程地址&#xff1a; 黑马程序员HarmonyOS4NEXT星河版入门到企业级实战教程&#xff0c;一套精通鸿蒙应用开发 &#xff08;本篇笔记对应课程第 28 节&#xff09; P28《27.网络连接-Http请求数据》 案例&#xff1a; 这里不懂后端假设服务器的前端小伙伴就需要课程源码资料了…

华三交换机的软件版本升级操作

升级操作很常见&#xff0c;掌握方法是关键 实验环境&#xff1a;1台华三S6520-EI交换机&#xff0c;版本从2432P03升级成2432P05。 整体思路&#xff1a; 1.先查验软件版本 2.官网下载对于设备型号的软件版本 3.配置交换机地址使得与电脑进行通信&#xff0c;使用TFTP/FTP工…

宿主机无法通过ip连接wsl2解决方案

文章目录 原因排查网络模式win11防火墙关闭wsl ubuntu防火墙 如果之前能连接现在连接不上可以参考该方案 原因排查 网络模式win11防火墙(win11新增了Hyper-V防火墙)wsl2 ubuntu防火墙 网络模式 wsl2的默认网络模式是NAT&#xff0c;建议修改为镜像模式。在C:\Users\<User…

深圳,不止是“搞钱之都”

深圳又结结实实火了一把。 “建议深圳人吃饭不要谈工作”&#xff0c;这条微博话题热度飙升&#xff0c;超过五百多万人围观&#xff0c;引来无数网友吐槽“深圳人饭局的真实写照”。 从高档粤菜包间到路边小摊&#xff0c;从茶餐厅到烧烤摊&#xff0c;深圳人吃饭似乎总绕不…

Objects and Classes (对象和类)

Objects and Classes [对象和类] 1. Procedural and Object-Oriented Programming (过程性编程和面向对象编程)2. Abstraction and Classes (抽象和类)2.1. Classes in C (C 中的类)2.2. Implementing Class Member Functions (实现类成员函数)2.3. Using Classes References O…

华为---VRRP基本配置(一)

10、VRRP 10.1 VRRP基本配置 10.1.1 原理概述 随着Internet的发展&#xff0c;人们对网络可靠性的要求越来越高。对于用户来说&#xff0c;能够时刻与外部网络保持通信非常重要&#xff0c;但内部网络中的所有主机通常只能设置一个网关IP地址&#xff0c;通过该出口网关实现…
最新文章