找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2592|回复: 11

[电子教室] 防止学生强制退出学生端程序NCStu.exe程序源代码

[复制链接]
发表于 2025-3-11 15:14:40 | 显示全部楼层 |阅读模式
凌波多媒体网络教室7.9 怎样防止学生强制退出学生端程序NCStu.exe程序,检测NCStu.exe进程退出,就自动启动NCStu.exe ,并把它做成一个服务,学生端程序安装在C:\Program Files (x86)\lingbo\netclass7\NCStu.exe,供参考
极域也可以这样,只是修改一下服务名及极域学生端程序路径
#include <iostream>
#include <windows.h>
#include <tlhelp32.h>
#include <string>
#include <cstdlib>
#include <thread>
#include <chrono>

SERVICE_STATUS serviceStatus;
SERVICE_STATUS_HANDLE serviceStatusHandle;

bool IsProcessRunning(const std::wstring& processName) {
    HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    PROCESSENTRY32W pEntry;
    pEntry.dwSize = sizeof(pEntry);
    BOOL hRes = Process32FirstW(hSnapShot, &pEntry);
    while (hRes) {
        if (std::wstring(pEntry.szExeFile) == processName) {
            CloseHandle(hSnapShot);
            return true;
        }
        hRes = Process32NextW(hSnapShot, &pEntry);
    }
    CloseHandle(hSnapShot);
    return false;
}

void RestartProcess(const std::wstring& processPath) {
    STARTUPINFOW si;
    PROCESS_INFORMATION pi;
   
    ZeroMemory(&si, sizeof(si));
    si.cb = sizeof(si);
    ZeroMemory(&pi, sizeof(pi));
   
    if (!CreateProcessW(
        NULL, // No module name (use command line)
        const_cast<LPWSTR>(processPath.c_str()),
        NULL, // Process handle not inheritable
        NULL, // Thread handle not inheritable
        FALSE, // Set handle inheritance to FALSE
        CREATE_NO_WINDOW, // Create the process without a window
        NULL, // Use parent's environment block
        NULL, // Use parent's starting directory
        &si, // Pointer to STARTUPINFO structure
        &pi // Pointer to PROCESS_INFORMATION structure
        )) {
        // Handle error if necessary
        return;
    }
   
    // Wait until the process exits
    WaitForSingleObject(pi.hProcess, INFINITE);
   
    // Close handles
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);
}

void ServiceMain(int argc, char** argv) {
    // 使用 Unicode 版本的 RegisterServiceCtrlHandlerW
    serviceStatusHandle = RegisterServiceCtrlHandlerW(L"ky", [](DWORD controlCode) {
        switch (controlCode) {
        case SERVICE_CONTROL_STOP:
        case SERVICE_CONTROL_SHUTDOWN:
            serviceStatus.dwCurrentState = SERVICE_STOPPED;
            break;
        default:
            break;
        }
        SetServiceStatus(serviceStatusHandle, &serviceStatus);
    });
   
    if (!serviceStatusHandle) {
        return;
    }
   
    serviceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
    serviceStatus.dwCurrentState = SERVICE_RUNNING;
    serviceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
    SetServiceStatus(serviceStatusHandle, &serviceStatus);
   
    const std::wstring processName = L"NCStu.exe";
    const std::wstring processPath = L"C:\\Program Files (x86)\\lingbo\\netclass7\\NCStu.exe";
   
    while (serviceStatus.dwCurrentState == SERVICE_RUNNING) {
        if (!IsProcessRunning(processName)) {
            RestartProcess(processPath);
        }
        std::this_thread::sleep_for(std::chrono::seconds(5));
    }
   
    serviceStatus.dwCurrentState = SERVICE_STOPPED;
    SetServiceStatus(serviceStatusHandle, &serviceStatus);
}

int main() {
    // 使用 Unicode 版本的 SERVICE_TABLE_ENTRYW
    SERVICE_TABLE_ENTRYW serviceTable[] = {
        { (LPWSTR)L"ky", (LPSERVICE_MAIN_FUNCTIONW)ServiceMain },
        { NULL, NULL }
    };
   
    // 使用 Unicode 版本的 StartServiceCtrlDispatcherW
    if (!StartServiceCtrlDispatcherW(serviceTable)) {
        std::cerr << "StartServiceCtrlDispatcher failed: " << GetLastError() << std::endl;
    }
   
    return 0;
}
回复

使用道具 举报

发表于 2025-3-11 16:47:01 | 显示全部楼层
高手,请弄一个极域的成品,极域多媒体教室互动管理系统软件V2.0.17466
回复

使用道具 举报

发表于 2025-3-11 16:50:43 | 显示全部楼层
膜拜大神!
回复

使用道具 举报

 楼主| 发表于 2025-3-12 08:03:00 | 显示全部楼层

回 dpxqs 的帖子

dpxqs:
高手,请弄一个极域的成品,极域多媒体教室互动管理系统软件V2.0.17466
const std::wstring processName = L"NCStu.exe";   这里改为极域学生端程序
const std::wstring processPath = L"C:\\\\Program Files (x86)\\\\lingbo\\\\netclass7\\\\NCStu.exe";这里改为极域学生端程序含路径
回复

使用道具 举报

发表于 2025-3-12 09:16:27 | 显示全部楼层

回 515151 的帖子

515151:const std::wstring processName = L"NCStu.exe";   这里改为极域学生端程序
const std::wstring processPath = L"C:\\\\Program Files (x86)\\\\lingbo\\\\netclass7\\\\NCStu.exe";这里改为极域学生端程序含路径 (2025-03-12 08:03) 
谢谢回复,把那些代码保存为批处理,是不?
回复

使用道具 举报

 楼主| 发表于 2025-3-12 09:26:02 | 显示全部楼层

回 dpxqs 的帖子

dpxqs:谢谢回复,把那些代码保存为批处理,是不? (2025-03-12 09:16) 
在源代码中修改,然后在小熊猫C++中编译
回复

使用道具 举报

发表于 2025-3-12 10:02:30 | 显示全部楼层
输出的文件类型选什么呢

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

发表于 2025-3-12 13:08:41 | 显示全部楼层
教学相长,哈哈
回复

使用道具 举报

发表于 2025-3-12 20:11:48 | 显示全部楼层
楼主能出个成品吗?
回复

使用道具 举报

发表于 2025-3-16 20:52:37 | 显示全部楼层
如果学生将程序进程暂停或则挂起,而没有退出,可能就没有效果了!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|腾飞在线 ( 冀ICP备05002530号 )

GMT+8, 2026-2-13 20:11 , Processed in 0.057322 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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