系统服务的处理(C++版)

【log4】c++日志工具之——log4cpp 1、log4cpp概述 Log4cpp是一个开源的C++类库,它提供了C++程序中使用日志和跟踪调试的功能,它的优点如下: 提供应用程序运行上下文,方便跟踪调试; 可扩展的、多种方式记录日志,包括命令行、文件、回卷文件、内存、syslog服务器、Win事件日志等; 可以动态控制日志记录级别,在效率和功能中进行调整; 所有配置可以通过配置文件进行动态调整; 多语言支持,包括Java(log4j),C++(log4cpp、log4cplus),C(log4c),python(... 阅读详情
int __fastcall  Server_Servers::QueryServerStats(AnsiString SERV,AnsiString Service)
{
    SERVICE_STATUS ssStatus;
    DWORD dwOldCheckPoint;
    SC_HANDLE schService , schSCManager ;
    schSCManager 
= OpenSCManager(
                SERV.c_str(),  
// pointer to machine name string
                NULL,  // pointer to database name string
                SC_MANAGER_ALL_ACCESS  // type of access
            );

    schService 
= OpenService(
                schSCManager,                      
//   SCM   database
                Service.c_str(),          //   service   name Topsky_ServerService
                SERVICE_ALL_ACCESS);
    
if (schService == NULL)
    
{
        PMSGDLG
->ShowErrorMsg("服务不存在!");
        
return -1;
    }


    
if (!QueryServiceStatus(
                schService,        
//   handle   to   service
                &ssStatus) )     //   address   of   status   information
    {
        PMSGDLG
->ShowErrorMsg("查询服务状态失败!");
        
return -1;
    }

    
else
        
return  ssStatus.dwCurrentState;


}

//启动服务
void __fastcall Server_Servers::StartServerServers(AnsiString SERV,AnsiString Service)
{
    SERVICE_STATUS ssStatus;
    DWORD dwOldCheckPoint;
    SC_HANDLE schService , schSCManager ;
    schSCManager 
= OpenSCManager(
                SERV.c_str(),  
// pointer to machine name string
                NULL,  // pointer to database name string
                SC_MANAGER_ALL_ACCESS  // type of access
            );

    schService 
= OpenService(
                schSCManager,                      
//   SCM   database
                Service.c_str(),          //   service   name Topsky_ServerService
                SERVICE_ALL_ACCESS);

    
if (schService == NULL)
    
{
        PMSGDLG
->ShowErrorMsg("服务不存在!");
        
return ;
    }


    
if (!StartService(schService, 0, NULL)) //
    {
        PMSGDLG
->ShowErrorMsg("无法启动服务!");
        
return ;
    }

    
else
        ;
// PMSGDLG->ShowErrorMsg("服务正在启动...");

    
//   Check   the   status   until   the   service   is   no   longer   start   pending.

    
if (!QueryServiceStatus(
                schService,        
//   handle   to   service
                &ssStatus) )     //   address   of   status   information
    {
        PMSGDLG
->ShowErrorMsg("查询服务状态失败!");
        
return ;
    }


    
while (ssStatus.dwCurrentState == SERVICE_START_PENDING)
    
{
        
//   Save   the   current   checkpoint.

        dwOldCheckPoint 
= ssStatus.dwCheckPoint;

        
//   Wait   for   the   specified   interval.

        Sleep(ssStatus.dwWaitHint);

        
//   Check   the   status   again.

        
if (!QueryServiceStatus(
                    schService,        
//   handle   to   service
                    &ssStatus) )     //   address   of   status   information
            break;

        
//   Break   if   the   checkpoint   has   not   been   incremented.

        
if (dwOldCheckPoint >= ssStatus.dwCheckPoint)
            
break;
    }


    
if (ssStatus.dwCurrentState == SERVICE_RUNNING)
        ;
//  PMSGDLG->ShowErrorMsg("启动服务成功!");
    else
    
{
        PMSGDLG
->ShowErrorMsg("CurrentState:   " + AnsiString(ssStatus.dwCurrentState));
        PMSGDLG
->ShowErrorMsg("Win32ExitCode:   " + AnsiString(ssStatus.dwWin32ExitCode));
        PMSGDLG
->ShowErrorMsg("ServiceSpecificExitCode:   " + AnsiString(ssStatus.dwServiceSpecificExitCode));
        PMSGDLG
->ShowErrorMsg("CheckPoint:   " + AnsiString( ssStatus.dwCheckPoint));
        PMSGDLG
->ShowErrorMsg("WaitHint:   " + AnsiString( ssStatus.dwWaitHint));
    }

    CloseServiceHandle(schService);
}

//停止服务
void __fastcall Server_Servers::StopServerServers(AnsiString SERV,AnsiString Service)
{
    SC_HANDLE schSCManager , schService ;
    SERVICE_STATUS ssStatus;
    DWORD dwOldCheckPoint;
    schSCManager 
= OpenSCManager(SERV.c_str(), NULL, SC_MANAGER_ALL_ACCESS);
    
if (schSCManager != NULL)
    
{
        schService 
= OpenService(schSCManager, Service.c_str(), SERVICE_STOP | SERVICE_QUERY_STATUS);
        
if (schService != NULL)
        
{
            ControlService(schService, SERVICE_CONTROL_STOP, 
&ssStatus);
            Sleep(
2000);
            
if (!QueryServiceStatus(
                        schService,        
//   handle   to   service
                        &ssStatus) )     //   address   of   status   information
            {
                PMSGDLG
->ShowErrorMsg("查询服务状态失败!");
                
return ;
            }

            
while (ssStatus.dwCurrentState == SERVICE_STOP_PENDING)
            
{
                
//   Save   the   current   checkpoint.
                dwOldCheckPoint = ssStatus.dwCheckPoint;
                
//   Wait   for   the   specified   interval.
                Sleep(ssStatus.dwWaitHint);
                
//   Check   the   status   again.
                if (!QueryServiceStatus(
                            schService,        
//   handle   to   service
                            &ssStatus) )     //   address   of   status   information
                    break;

                
//   Break   if   the   checkpoint   has   not   been   incremented.
                if (dwOldCheckPoint >= ssStatus.dwCheckPoint)
                    
break;
            }


            
if (ssStatus.dwCurrentState == SERVICE_STOPPED)
                ;
//  PMSGDLG->ShowErrorMsg("停止服务成功!");
            else
            
{
                PMSGDLG
->ShowErrorMsg("CurrentState:   " + AnsiString(ssStatus.dwCurrentState));
                PMSGDLG
->ShowErrorMsg("Win32ExitCode:   " + AnsiString(ssStatus.dwWin32ExitCode));
                PMSGDLG
->ShowErrorMsg("ServiceSpecificExitCode:   " + AnsiString(ssStatus.dwServiceSpecificExitCode));
                PMSGDLG
->ShowErrorMsg("CheckPoint:   " + AnsiString( ssStatus.dwCheckPoint));
                PMSGDLG
->ShowErrorMsg("WaitHint:   " + AnsiString( ssStatus.dwWaitHint));
            }

            CloseServiceHandle(schService);

        }

        CloseServiceHandle(schSCManager);
    }

}

//暂停服务
void __fastcall Server_Servers::PauseServerServers(AnsiString SERV,AnsiString Service)
{
    SC_HANDLE schSCManager , schService ;
    SERVICE_STATUS ssStatus;
    DWORD dwOldCheckPoint;
    schSCManager 
= OpenSCManager(SERV.c_str(), NULL, SC_MANAGER_ALL_ACCESS);
    
if (schSCManager != NULL)
    
{
        schService 
= OpenService(schSCManager, Service.c_str(), SERVICE_PAUSE_CONTINUE);
        
if (schService != NULL)
        
{
            ControlService(schService, SERVICE_CONTROL_PAUSE, 
&ssStatus);
            Sleep(
3000);
            CloseServiceHandle(schService);
        }

        CloseServiceHandle(schSCManager);
    }

}

//继续服务
void __fastcall Server_Servers::ContinueServerServers(AnsiString SERV,AnsiString Service)
{
    SC_HANDLE schSCManager , schService ;
    SERVICE_STATUS ServiceStatus;
    schSCManager 
= OpenSCManager(SERV.c_str(), NULL, SC_MANAGER_ALL_ACCESS);
    
if (schSCManager != NULL)
    
{
        schService 
= OpenService(schSCManager, Service.c_str(), SERVICE_PAUSE_CONTINUE);
        
if (schService != NULL)
        
{
            QueryServiceStatus(schService, 
&ServiceStatus);
            ControlService(schService, SERVICE_CONTROL_CONTINUE, 
&ServiceStatus);
            Sleep(
3000);
            CloseServiceHandle(schService);
        }

        CloseServiceHandle(schSCManager);
    }

}

//取得网上邻居
bool __fastcall Server_Servers::EnumHosts(NETRESOURCE* pNetRes)
{
    HANDLE hEnum 
= NULL;
    DWORD dwRet
= WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, pNetRes, &hEnum);
    
if (dwRet != NO_ERROR)
        
return false;

    NETRESOURCE
* pResBuf = new NETRESOURCE[8];
    DWORD cCount, dwBuf 
= 8*sizeof( NETRESOURCE);
    DWORD i;
    
do
    
{
        cCount 
= (DWORD)-1;
        dwRet 
= WNetEnumResource(hEnum, &cCount, (LPVOID)pResBuf, &dwBuf);
        
for ( i = 0; i < cCount; ++i)
        
{
            ;
//  AddHostToVector(&pResBuf[i]);
        }

        
if(pResBuf[i].dwUsage & RESOURCEUSAGE_CONTAINER)
            EnumHosts(
&pResBuf[i]);

        
if (dwRet == ERROR_NO_MORE_ITEMS)
        
{ //Enum finished.
            dwRet = NO_ERROR;
            
break;
        }

        
else if (dwRet != NO_ERROR)
            
break;
    }

    
while (dwRet == NO_ERROR);

    delete pResBuf;
    
return (dwRet == NO_ERROR);
}

 
【RabbitMQ C++】AMQP-CPP实战:从零构建高效消息队列系统 本文详细介绍了如何使用C++和AMQP-CPP库从零构建高效的RabbitMQ消息队列系统。内容涵盖环境搭建、核心概念解析,并通过实战代码示例演示了如何编写生产者和消费者程序,实现消息的发布与订阅。文章重点讲解了如何与libev事件循环集成,以构建高性能、可靠的异步通信组件,为C++分布式系统开发提供了一套完整的解决方案。 阅读详情

相关推荐

log4cpp 详解及使用操作

Log4cpp是一个开源的C++类库,它提供了在C++程序中使用日志和跟踪调试的功能。使用log4cpp,可以很便利地将日志或者跟踪调试信息写入字符流、内存字符串队列、文件、回滚文件、调试器、Windows日志、本地syslog和远程syslog服务器中。 1、Log4cpp简介   Log4cpp是个基于LGPL的开源项目,移植自Java的日志处理跟踪项目log4j,并保持了API上的一致。...

Zhanganliu的博客 7148

C++编写及注册windows服务程序

原文链接:http://eggbucket.iteye.com/blog/1135630 1、注册服务 :在 "开始->运行->cmd" 中输入 sc create TEST binPath = "C:\TEST.EXE" 则在windows下注册了一项服务 sc create TestService binpath= "c:\ServiceTest.exe" displa

liumu1209的专栏 1508

c++ 利用yaml-cpp读写yaml配置文件

在程序员的开发生涯中,读写配置文件必不可少。 配置文件有利于我们灵活配置工程,解决大量重复劳动,也方便调试。 配置文件的格式有很多,最简单的有一行一行的文本,也有像 json、xml、protocol buffer 这样结构化的格式,当然也有 yaml 这种格式。 今天的博文介绍的是如何在 C++ 开发中利用 yaml-cpp 开源库读写 yaml 配置文件。 如果有 Python 开发经验的同学,可能知道用 Python 读取 yaml 是再简单不过了,但是 C++ 麻烦一点,它需要你自己下载源码然后编译

newbeixue的博客 4017

C++实现系统服务暂停、停止、启动

/* 名称:系统服务管理 语言:C++ 作者:由UnixCRoot(CRoot)转载自互联网 介绍:对Windows系统服务的状态获取,服务暂停,开启,停止操作代码 */ void CStartServiceDlg::OnBnClickedButton1() { // 打开服务管理对象 SC_HANDLE hSC = ::OpenSCManager( NULL, ...

weixin_30756499的博客 458

Linux安装Whisper(C++版)音频解析文本

本文介绍了在Linux系统上安装和配置Whisper语音识别工具的全过程。首先在home目录创建whisper文件夹,下载whisper.cpp源码并解压。接着安装ffmpeg和必要的依赖包,通过脚本自动下载CentOS 7.9和EPEL的RPM包。然后配置CMake环境并编译whisper.cpp源码,将生成的可执行文件安装到/opt/whisper/bin目录。最后创建了一个便捷的whisper-transcribe命令脚本,用于调用whisper-cpp进行语音转写,支持自动将输入音频转换为16kHz

YXWik的博客 616

掌握C++日期处理:cpp.fecha库实战指南

本文还有配套的精品资源,点击获取 简介:在C++中处理日期和时间是一项基础任务,尤其在需要记录和分析时间信息的应用开发中尤为重要。cpp.fecha项目通过自定义类扩展了C++标准库的时间处理功能,提供了更丰富的接口来管理日期。本指南将详细介绍cpp.fecha库的类设计、日期格式化与解析、常见日期操作,以及与C++标准库和其他时间处理库的兼容性和扩展性。 1. ...

weixin_35754962的博客 1482

C++ 启动和停止电脑中的服务

#define SERVICE_NO_ERROR 0 #define OPEN_SCMANAGER_ERROR 2 #define OPEN_SERVICE_ERROR 3 #define QUERY_SERVICESTATUS_ERROR 4 #define STOP_SERVICE_ERROR 5 #define START_SERVICE_ERROR 6 int CPmsAndOneCa

luyumiao1990的专栏 2804

创建Windows系统服务demo2(c++版)

如何用c/c++ 创建windows系统服务。

C++创建Windows系统服务

定义    Microsoft Windows 服务(即,以前的 NT 服务)使您能够创建在它们自己的 Windows 会话中可长时间运行的可执行应用程序。这些服务可以在计算机启动时自动启动,可以暂停和重新启动而且不显示任何用户界面。这种服务非常适合在服务器上使用,或任何时候,为了不影响在同一台计算机上工作的其他用户,需要长时间运行功能时使用。还可以在不同于登录用户的特定用户帐户或默认计算机帐户的...

游行天涯 4万+

【实战指南】从零构建UNet多分类分割数据集:标注、转换与训练全流程

本文提供了一份从零构建UNet多分类分割数据集的完整实战指南。详细介绍了使用Labelme进行图像标注的核心技巧与规范,并通过Python脚本将标注结果转换为模型可用的VOC格式。最后,指导如何修改经典的PyTorch版UNet代码,以适配自定义数据集并进行训练与测试,帮助读者完成从数据准备到模型训练的全流程。

arduino9maker的博客 288

一文带你完成ARMv8架构中的cache知识点

【摘要】 在最初开发ARM架构时,处理器的时钟速度和内存的访问速度大致相同。今天的处理器内核要复杂得多,其时钟速度可以快上几个数量级。但是,外部总线和内存设备的频率并没有扩大到同样的程度。有可能实现小块的片上SRAM,它可以以与内核相同的速度运行,但是与标准的DRAM块相比,这种RAM非常昂贵,因为后者的容量可以达到数千倍。在许多基于ARM处理器的系统中,访问外部存储器需要几十甚至几百个内核周期。 cache的技术背景 在最初开发ARM架构时,处理器的时钟速度和内存的访问速度大致相同。今天的处.

ABCCloud的博客 1854

探索高并发网络通信的利器:C++版IOCP完成端口源码

探索高并发网络通信的利器:C++版IOCP完成端口源码 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 在当今互联网高速发展的时代,高并发和高连接数的网络通信需求日益增长。为了满足这一需求,我们推出了一个强大的开源项目——C++版IOCP完成端口源码。该项目基于C++语言,通过实现IOCP(I/O Completion Port)完成端口技术,为开发者提供了一个高效、稳...

gitblog_09803的博客 450

车辆贷款违约预测挑战赛

2021科大讯飞-车辆贷款违约预测挑战赛--方案简介车贷违约预测问题,目的是建立风险识别模型来预测可能违约的借款人。预测结果为借款人是否可能违约,属于二分类问题。偏数据挖掘的比赛,关键点是如何基于对数据的理解抽象归纳出有用的特征。站在大佬的视角,尝试学习总结,站在巨人的肩膀上,也许看得会更远一些。直接进入主题,开始学习套路,芜湖~特征工程1、常用库、数据导入import pandas as pd import numpy as np import lightgbm as lgb import xgboost

平平淡淡,戒急用忍,一生学闭嘴。 3341

C++ //练习 1.2 改写程序,让它返回-1。返回值-1通常被当作成程序错误的标识。重新编译并运行你的程序,观察你的系统如何处理main返回的错误标识。

【代码】C++ //练习 1.2 改写程序,让它返回-1。返回值-1通常被当作成程序错误的标识。重新编译并运行你的程序,观察你的系统如何处理main返回的错误标识。

Made in Code 480

海思SD3403/SS928V100开发(6)单路GMSL-MIPI-YUV相机视频输入调试

硬件连接:森云GMSL相机 -> GMSL 解串器 -> SD3403 MIPI0暂时先进行单路视频输入通路调试。

jzwjzw19900922的博客 1934

ubuntu-25.04-desktop-amd64 工具VMware-tools 正确安装方法

摘要:Ubuntu 25.04虚拟机安装VMware Tools后无法实现主机与虚拟机间的文件复制粘贴和拖拽功能,问题可能源于工具兼容性。建议优先安装open-vm-tools套件(含open-vm-tools-desktop),而非官方VMware Tools。具体方案:通过终端执行安装命令后重启系统。该方法已实测有效解决该兼容性问题。(149字)

安徽锐锋科技-沐雨潇竹 672

图像处理、C++学习路线整理

C++ 主要整理了几个博主关于C++学习路线的建议。 C/C++学习路线 主要讲述C++工程师的知识结构和每一阶段的知识点 我的C++后台开发学习路线(秋招,C++后台,面经) 主要讲述关键资料,语言基础:《C++ Primer》、《STL源码剖析》、《深度探索C++对象模型》、《Effective C++:改善程序与设计的55个具体做法》以及阅读方法。 提高部分:《linux内核设计与实现》、《深入理解计算机系统》、《Linux多线程服务器端编程》、《Redis设计与实现》、《深入理解Nginx》以及阅读

ThetaQing的博客 1593

【2026年米哈游春招 - 3月14日 -第一题- 行列相等】(题目+思路+Java&C++&Python解析+在线测试)

摘要 本文解决了一个矩阵行列和匹配问题:统计矩阵中行和等于列和的所有行列对数量。算法首先计算每行和每列的元素和,然后利用哈希表统计各行列和的出现次数。通过遍历列和并查询对应的行和出现次数,高效计算出匹配对数。该方法时间复杂度为O(nm),空间复杂度为O(n+m),适用于大规模矩阵数据。代码实现了Python、Java和C++版本,通过哈希表优化避免了暴力枚举,显著提高了计算效率。

m0_73659489的博客 83

Cpp入门基础

定义命名空间,需要使⽤到namespace关键字,后⾯跟命名空间的名字,然后接⼀对{}即可,{}中 即为命名空间的成员。命名空间中可以定义变量/函数/类型等。namespace本质是定义出⼀个域,这个域跟全局域各⾃独⽴,不同的域可以定义同名变量,所以下 ⾯的rand不在冲突了。C++中域有函数局部域,全局域,命名空间域,类域;域影响的是编译时语法查找⼀个变量/函数/ 类型出处(声明或定义)的逻辑,所有有了域隔离,名字冲突就解决了。

2401_86658278的博客 5201

环境配置与基础教程:2026大厂标准:使用 DVC (Data Version Control) 实现 YOLO 数据集版本控制全链路管理

本文介绍了使用DVC 3.0对YOLO数据集进行全链路版本控制的方法。主要内容包括: DVC 3.0的核心增强:内容块级缓存去重、并行云传输、AI智能体元数据跟踪等新特性,可显著提升YOLO数据集管理效率。 环境配置:详细说明DVC 3.0的安装步骤、项目初始化方法以及远程存储配置方案(支持S3、GCS、Azure等多种存储后端)。 目录结构规范:提供符合大厂MLOps标准的项目目录结构设计。 实战操作: 原始数据版本化 多格式标注数据版本控制 版本切换方法 优势说明:DVC通过哈希指针机制管理大型数据集,

ZXSXJ的博客 148

华为OD机试:查找接口成功率最优时间段 (C/C++/Py/Java/JS/GO)

华为OD机试双机位C卷 查找接口成功率最优时间段,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解。

qq_45776114的博客 4687

C++ 中 .cc 和 .cpp 文件扩展名之间的区别

C++ 中 .cc 和 .cpp 文件扩展名之间的区别

scott198512的博客 2万+

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

AMQP-CPP完整指南:构建高性能C++ RabbitMQ应用

AMQP-CPP是一个专为C++开发者设计的异步非阻塞RabbitMQ通信库,它提供了现代化的消息队列解决方案,特别适合需要高吞吐量和低延迟的应用场景。 ## 项目概览与核心价值 AMQP-CPP库的核心优势在于其全异步架构设计,完全避免了阻塞式系统调用。该库支持C++17标准,确保了代码的现代性和高效性。与传统的同步消息队列客户端不同,AMQP-CPP能够在高负载情况下保持稳定的性能表现,无

gitblog_00640的博客 1050

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Casbin-CPP:强大的C++访问控制框架

Casbin-CPP:强大的C++访问控制框架 项目介绍 Casbin-CPP 是 Casbin 访问控制框架的C++实现版本。Casbin是一个开源的访问控制库,支持多种访问控制模型,如ACL、RBAC、ABAC等。Casbin-CPP继承了Casbin的核心功能,并针对C++语言特性进行了优化,使其在C++项目中能够高效、灵活地实现访问控制。 Casbin-CPP不仅支持Windows、Lin...

gitblog_00196的博客 850

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

yaml-cpp:轻松处理C++中的YAML配置文件

你是否曾经在C++项目中为配置文件格式而烦恼?JSON太冗长,XML太复杂,INI又太简陋?那么,YAML可能是你的完美解决方案!yaml-cpp是一个功能强大的C++ YAML解析器和生成器,它让你能够轻松地读取、修改和生成YAML格式的数据。 让我告诉你一个秘密:许多知名的开源项目都在使用yaml-cpp来处理它们的配置文件,因为它既保持了YAML的人类可读特性,又提供了C++开发者熟悉的A

gitblog_00740的博客 536

探索 RedPanda-CPP:一个高效、灵活的C++事件处理库

是一个开源的C++库,专为构建高度可扩展和响应迅速的实时系统而设计。它提供了一种基于事件驱动和发布-订阅模型的编程接口,帮助开发者以简洁的方式管理复杂系统的异步通信。 ## 技术分析 ### 发布-订阅模式 RedPanda-CPP 实现了一个轻量级的发布-订阅框架,允许不同组件通过事件进行通信,而不是直接互相依赖。这种解耦的设计提高了代码的可维护性和测试性,使得模块之间能够独立工作。 #

gitblog_00100的博客 1012
上一篇: BCB 编写 DLL 终极手册
下一篇: 漫谈C++ Builder多线程编程技术
52vc
博客等级 码龄23年 53粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值