515151 发表于 2025-3-11 15:14:40

防止学生强制退出学生端程序NCStu.exe程序源代码

凌波多媒体网络教室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 发表于 2025-3-11 16:47:01

高手,请弄一个极域的成品,极域多媒体教室互动管理系统软件V2.0.17466

lnnhzx 发表于 2025-3-11 16:50:43

膜拜大神!

515151 发表于 2025-3-12 08:03:00

回 dpxqs 的帖子

dpxqs:
高手,请弄一个极域的成品,极域多媒体教室互动管理系统软件V2.0.17466 images/back.gif

const std::wstring processName = L"NCStu.exe";   这里改为极域学生端程序
const std::wstring processPath = L"C:\\\\Program Files (x86)\\\\lingbo\\\\netclass7\\\\NCStu.exe";这里改为极域学生端程序含路径

dpxqs 发表于 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) images/back.gif

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

515151 发表于 2025-3-12 09:26:02

回 dpxqs 的帖子

dpxqs:谢谢回复,把那些代码保存为批处理,是不? (2025-03-12 09:16) images/back.gif

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

dpxqs 发表于 2025-3-12 10:02:30

输出的文件类型选什么呢

爱琴海 发表于 2025-3-12 13:08:41

教学相长,哈哈

attriber 发表于 2025-3-12 20:11:48

楼主能出个成品吗?

654410842 发表于 2025-3-16 20:52:37

如果学生将程序进程暂停或则挂起,而没有退出,可能就没有效果了!!
页: [1] 2
查看完整版本: 防止学生强制退出学生端程序NCStu.exe程序源代码