论坛风格切换切换到宽版
  • 1193阅读
  • 11回复

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

上一主题 下一主题
离线515151
 

发帖
282
金钱
62852
威望
3
贡献值
2

凌波多媒体网络教室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;
}
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水
离线dpxqs

发帖
446
金钱
1301
威望
0
贡献值
0
只看该作者 1 发表于: 03-11
高手,请弄一个极域的成品,极域多媒体教室互动管理系统软件V2.0.17466
离线lnnhzx

发帖
343
金钱
29707
威望
1
贡献值
0
只看该作者 2 发表于: 03-11
膜拜大神!
离线515151

发帖
282
金钱
62852
威望
3
贡献值
2
只看该作者 3 发表于: 03-12
回 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";这里改为极域学生端程序含路径
离线dpxqs

发帖
446
金钱
1301
威望
0
贡献值
0
只看该作者 4 发表于: 03-12
回 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) 

谢谢回复,把那些代码保存为批处理,是不?
离线515151

发帖
282
金钱
62852
威望
3
贡献值
2
只看该作者 5 发表于: 03-12
回 dpxqs 的帖子
dpxqs:谢谢回复,把那些代码保存为批处理,是不? (2025-03-12 09:16) 

在源代码中修改,然后在小熊猫C++中编译
离线dpxqs

发帖
446
金钱
1301
威望
0
贡献值
0
只看该作者 6 发表于: 03-12
输出的文件类型选什么呢
离线爱琴海

发帖
1603
金钱
34325
威望
2
贡献值
15
只看该作者 7 发表于: 03-12
教学相长,哈哈
离线attriber

发帖
2
金钱
75
威望
0
贡献值
0
只看该作者 8 发表于: 03-12
楼主能出个成品吗?
离线654410842

发帖
16
金钱
160
威望
0
贡献值
0
只看该作者 9 发表于: 03-16
如果学生将程序进程暂停或则挂起,而没有退出,可能就没有效果了!!
快速回复
限100 字节
 
上一个 下一个