Delphi版Ocx制作CAB

Delphi开发OCX详细步骤总结(含源码) Delphi开发OCX详细步骤讲解,每个步骤均有截图。内容包括:创建ocx,增加接口函数,ocx的注册和卸载,编写html调用ocx ,调试OCX,调试OCX没有进入断点的解决方法。释放源码内容包括:获取ocx所在路径,ocx执行存储过程获取数据,ocx使用socket传递信息 立即下载
unit UnitMakeCAB;

interface
  uses
      ActiveX
    , SysUtils
    , Classes
    , Windows;

//.inf文件模板
const
  Templete 
=
    
'; %Title%'#13#10+
    
'; File Name %DLLName%  File Version= %DllVersion%'#13#10+
    
'; ProgId= %ProgId% ClassId= %DLLClsid%'#13#10#13#10+
    
'[version]'#13#10+
    
'signature="$CHICAGO$"'#13#10+
    
'AdvancedINF=2.0'#13#10#13#10+
    
'[Add.Code]'#13#10+
    
'%DLLName%=%DLLName%'#13#10#13#10+
    
'[%DLLName%]'#13#10+
    
'file-win32-x86=thiscab'#13#10+
    
'RegisterServer=yes'#13#10+
    
'clsid=%DLLClsid%'#13#10+
    
'DestDir='#13#10+
    
'FileVersion=%DLLVersion%'#13#10#13#10+
    
'[Setup Hooks]'#13#10+
    
'AddToRegHook=AddToRegHook'#13#10#13#10+
    
'[AddToRegHook]'#13#10+
    
'InfSection=DefaultInstall'#13#10#13#10+
    
'[DefaultInstall]'#13#10+
    
'AddReg=AddToRegistry'#13#10#13#10+
    
'[AddToRegistry]'#13#10+
    
'HKLM,"SOFTWAREClassesCLSID%DLLClsid%Implemented Categories{7DD95801-9882-11CF-9FA9-00AA006C42C4}"'#13#10+
    
'HKLM,"SOFTWAREClassesCLSID%DLLClsid%Implemented Categories{7DD95802-9882-11CF-9FA9-00AA006C42C4}"';

//MackCab 用的中间文件模板,文件附加在后面,不能带路径(估计可以支持8.3短路径)
  MakeCabDirective 
=
    
'.OPTION EXPLICIT     ; Generate errors'#13#10+
    
'.Set CabinetNameTemplate=%CABFile%'#13#10+
    
'.set DiskDirectoryTemplate=CDROM ; All cabinets go in a single  directory'#13#10+
    
'.Set CompressionType=MSZIP;** All files are compressed in cabinet files'#13#10+
    
'.Set UniqueFiles="OFF"'#13#10+
    
'.Set Cabinet=on'#13#10+
    
'.Set DiskDirectory1=%CABFilePath%'#13#10;

//取得CoClass的ClassID
function GetCLSID(FileName: String): WideString;
//取得ProgID
function GetProgID(FileName: String): String;
//制作用于发布的CAB包
procedure MakeCAB(FileName: String);

implementation

//取得CoClass的ClassID
function GetCLSID(FileName: String): WideString;
var
  spTypeLib: ITypeLib;
  spTypeInfo: ITypeInfo;
  pta: PTypeAttr;
  hr: HRESULT;
  
Count, I: UINT;

begin
  Result :
= '{00000000-0000-0000-0000-000000000000}';
  hr :
= LoadTypeLib(PWideChar(WideString(FileName)),spTypeLib);
  
if Failed(hr) then Exit;
  
Count := spTypeLib.GetTypeInfoCount;
  I :
= 0;
  
while I < Count do begin
    hr :
= spTypeLib.GetTypeInfo(I, spTypeInfo);
    
if Failed(hr) then Exit;
    hr :
= spTypeInfo.GetTypeAttr(pta);
    
if Failed(hr) then Exit;
    
if TKIND_COCLASS = pta.typekind then begin
      StringFromGUID2(pta.guid, PWideChar(Result), Length(Result)
* sizeof(WideChar));
      spTypeInfo.ReleaseTypeAttr(pta);
      pta :
= Nil;
      
Exit;
    
end;
    spTypeInfo.ReleaseTypeAttr(pta);
    pta :
= Nil;
    Inc(I);
  
end;
end;

//取得ProgID
function GetProgID(FileName: String): String;
var
  spTypeLib: ITypeLib;
  spTypeInfo: ITypeInfo;
  pta: PTypeAttr;
  hr: HRESULT;
  
Count, I: UINT;
  bstrName0, bstrName: WideString;
begin
  Result :
= '';
  hr :
= LoadTypeLib(PWideChar(WideString(FileName)),spTypeLib);
  
if Failed(hr) then Exit;
  
Count := spTypeLib.GetTypeInfoCount;
  hr :
= spTypeLib.GetDocumentation(   -1
                                    , 
@bstrName0
                                    , Nil
                                    , 
0
                                    , Nil
                                    );
  
if Failed(hr) then Exit;
  I :
= 0;
  
while I < Count do begin
    hr :
= spTypeLib.GetTypeInfo(I, spTypeInfo);
    
if Failed(hr) then Exit;
    hr :
= spTypeInfo.GetDocumentation(  -1
                                      , 
@bstrName
                                      , Nil
                                      , 
0
                                      , Nil
                                      );
    
if Failed(hr) then Exit;
    hr :
= spTypeInfo.GetTypeAttr(pta);
    
if Failed(hr) then Exit;
    
if TKIND_COCLASS = pta.typekind then begin
      Result :
= WideString(bstrName0) + '.' + WideString(bstrName);
      spTypeInfo.ReleaseTypeAttr(pta);
      pta :
= Nil;
      
Exit;
    
end;
    spTypeInfo.ReleaseTypeAttr(pta);
    pta :
= Nil;
    Inc(I);
  
end;
end;

//取得文件版本
function GetVersion(FileName: String): String;
var
    dwHandle: DWORD ;
    m_szVersion: array
[0..255] of char;
    dwVerSize: DWORD;
    pbBuffer: PChar;
    lpVSInfo: PVSFixedFileInfo;
    uiVerSize: UINT;
begin
  Result :
= '0,0,0,0';
  uiVerSize :
= 0;
  dwVerSize  :
= GetFileVersionInfoSize(PChar(FileName), &dwHandle);
  lpVSInfo :
= Nil;
  pbBuffer :
= AllocMem( dwVerSize);
    
if (pbBuffer = Nil) then Exit;
    
if (GetFileVersionInfo(PChar(FileName), 0, dwVerSize, pbBuffer)) then begin
        
if (VerQueryValue(pbBuffer, '', Pointer(lpVSInfo), uiVerSize)) then begin
            Result :
= Format( '%d,%d,%d,%d',
                                    
[ (lpVSInfo^.dwFileVersionMS shr 16) and $FFFF,
                                      lpVSInfo^.dwFileVersionMS and $FFFF,
                                      (lpVSInfo^.dwFileVersionLS shr 16) and $FFFF,
                                      lpVSInfo^.dwFileVersionLS and $FFFF
                        
]
                                  );
    
end;
  
end;

    FreeMem(pbBuffer);
end;

//制作用于发布的CAB包
procedure MakeCAB(FileName: String);
var
  CABFileName, DDFFileName, InfFileName: String;
  F: TFileStream;
  P: PChar;
  iLen, iWrote: 
Integer;

  Title, DLLName, ProgID, ClsID, FileVer: String;

  CABDirective, InfFile: String;

  _hfile: HFILE;
    mCreationTime, mLastAccessTime, mLastWriteTime: FILETIME;

    StartInfo: STARTUPINFO ; 
// name structure
    ProcInfo: PROCESS_INFORMATION ; 
// name structure
begin
  CoInitialize(Nil);
  try
    FileVer :
= GetVersion(FileName);
    ClsID :
= GetCLSID(FileName);
    DLLName :
= ExtractFileName(FileName);
    ProgID :
= GetProgID(FileName);
    Title :
= 'Ocx Inf file Maker';
    InfFileName :
= ChangeFileExt(FileName, '.inf');
    CabFileName :
= ChangeFileExt(FileName, '.cab');
    DDFFileName :
= ChangeFileExt(FileName, '.ddf');

    CABDirective :
=    StringReplace(    MakeCabDirective,
                                    
'%CABFile%',
                                    ExtractFileName(CabFileName),
                                    
[rfReplaceAll, rfIgnoreCase]
                                    );
    CABDirective :
=    StringReplace(    CABDirective,
                                    
'%CABFilePath%',
                                    ExtractFilePath(CabFileName),
                                    
[rfReplaceAll, rfIgnoreCase]
                                    )
                    
+ '"' + FileName + '"'
                    
+    #13#10'"' + InfFileName + '"';

    
//如果还有其它附加文件需要打包请在这里增加一个CallBack
    
//直接按每文件一行往上附加

    InfFile :
= StringReplace(  Templete,
                              
'%Title%',
                              Title,
                              
[rfReplaceAll, rfIgnoreCase]
                              );
    InfFile :
= StringReplace(    InfFile,
                              
'%DLLName%',
                              DLLName,
                              
[rfReplaceAll, rfIgnoreCase]
                              );
    InfFile :
= StringReplace(    InfFile,
                              
'%DllVersion%',
                              FileVer,
                              
[rfReplaceAll, rfIgnoreCase]
                              );
    InfFile :
= StringReplace(    InfFile,
                              
'%ProgId%',
                              ProgID,
                              
[rfReplaceAll, rfIgnoreCase]
                              );
    InfFile :
= StringReplace(    InfFile,
                              
'%DLLClsid%',
                              ClsID,
                              
[rfReplaceAll, rfIgnoreCase]
                              );

    
//写入INF文件
    f :
= TFileStream.Create(InfFileName,fmCreate);
    try
      p :
= PChar(InfFile);
      iLen :
= Length(InfFile);
      
while (iLen > 0) do begin
        iWrote :
= f.Write(p^, iLen);
        Inc(p, iWrote);
        
Dec(iLen, iWrote);
      
end;
    finally
      f.Free;
    
end;

    
//如果还有其它附加文件请在这里增加一个CallBack
    
//文件通常有两类:1.需要注册的;2.不需要注册的.
    
//另外就是文件可能安装目录有两种:1.当前目录(即随机目录);2.特定目录(可以使用环境变量)
    
//写Inf文件请按照.Ini格式,比如TIniFile类或者API来操作等


    
//更新.INF的文件时间为.OCX的时间
    _hFile :
= _lopen(PChar(FileName), OF_READWRITE);
    GetFileTime(  THANDLE(_hFile),
                  
@mCreationTime,
                  
@mLastAccessTime,
                  
@mLastWriteTime
                  );
    _lclose(_hFile);

    _hFile :
= _lopen(PChar(InfFile), OF_READWRITE);
    SetFileTime(    THANDLE(_hFile),
                  
@mCreationTime,
                  
@mLastAccessTime,
                  
@mLastWriteTime
                  );
    _lclose(_hFile);

    
//写入DDF文件,供工具程序MakeCab.exe使用
    f :
= TFileStream.Create(DDFFileName,fmCreate);
    try
      p :
= PChar(CABDirective);
      iLen :
= Length(CABDirective);
      
while (iLen > 0) do begin
        iWrote :
= f.Write(p^, iLen);
        Inc(p, iWrote);
        
Dec(iLen, iWrote);
      
end;
    finally
      f.Free;
    
end;

    
//执行MakeCAB创建CAB包

    fillchar(ProcInfo, sizeof(ProcInfo), 
0); // Set up memory block
    fillchar(StartInfo, sizeof(StartInfo), 
0); // Set up memory block
    StartInfo.cb :
= sizeof(StartInfo); // Set structure size
    
if Not CreateProcess( Nil,
                          PChar(
'makecab /f "' + DDFFileName + '"'),
                          Nil,
                          Nil,
                          False,
                          
0,
                          Nil,
                          PChar(ExtractFilePath(FileName)),
                          StartInfo,
                          ProcInfo) 
then
      
Exit;

    WaitForSingleObject(ProcInfo.hProcess, INFINITE);
    CloseHandle(ProcInfo.hThread);
    CloseHandle(ProcInfo.hProcess);

    
//更新CAB的文件时间为.OCX的时间
    _hFile :
= _lopen(PChar(FileName), OF_READWRITE);
    GetFileTime(  THANDLE(_hFile),
                  
@mCreationTime,
                  
@mLastAccessTime,
                  
@mLastWriteTime
                  );
    _lclose(_hFile);

    _hFile :
= _lopen(PChar(CabFileName), OF_READWRITE);
    SetFileTime(    THANDLE(_hFile),
                  
@mCreationTime,
                  
@mLastAccessTime,
                  
@mLastWriteTime
                  );
    _lclose(_hFile);
  finally
    CoUninitialize;
  
end;

end;
end.

示例代码:

uses
    UnitMakeCAB;
procedure TForm3.Button1Click(Sender: TObject);
var
  FileName: String;
begin
  
if OpenDialog1.Execute then begin
    FileName :
= OpenDialog1.FileName;
    
if SameText(ExtractFileExt(FileName), '.ocx') then begin
      MakeCAB(FileName);
    end;
  end;
end;

 

 

制作cab与数字签名 制作cab与数字签名 ACTiveX嵌入到网页中的数字签名实现 立即下载

相关推荐

强化学习实战:如何用PPO算法训练一个超级马里奥AI(附完整代码)

本文提供了一份详细的强化学习实战指南,教你如何使用PPO算法训练一个能玩《超级马里奥》的AI智能体。内容涵盖从环境搭建、自定义奖励函数设计到PPO智能体的PyTorch完整实现,并附有可运行的代码,帮助开发者快速上手游戏AI开发。

h6j7k8l9p0的博客 947

Delphi发布ActiveX控件 制作CAB包 数字签名

Delphi发布ActiveX控件制作CAB包数字签名 最近我正在研究ActiveX技术。我使用Delphi 7创建了一个具有ActiveForm的ActiveX控件应用程序。这个控件产生一个.OCX文件。现在,我需要把这个控件部署在服务器端,在用户浏览网页并选择安装这个控件的时候,用户的IE才会下载、安装并显示这个控件。但是我的控件必须作数字签名以后,IE才会...

weixin_30917213的博客 197

一个完整的c#股票分析软件源码

完整的c#股票分析软件源码

qq_35600909的博客 4595

获取com对象的所有属性和方法

package com.bovy.officehelper; import org.eclipse.swt.SWT; import org.eclipse.swt.SWTException; import org.eclipse.swt.internal.ole.win32.TYPEATTR; import org.eclipse.swt.ole.win32.OLE; import

KimmKing的技术博客 4719

微信取证不求人:最新免费DAT解码工具使用指南(含闪退解决方案)

本文提供了一份详细的微信DAT文件免费解码工具使用指南。针对用户常见的图片无法查看问题,手把手教学如何安全获取并操作开源图形化工具,将加密的DAT文件一键还原为JPG/PNG图片。文章重点剖析了DAT文件的加密原理,并给出了详细的步骤解决工具运行中最常见的“程序闪退”等疑难杂症,帮助普通用户轻松完成微信取证。

m0n1o2p的博客 479

Difftest踩坑笔记(一)

Difftest是差分测试框架,有什么用呢?高性能CPU的设计需要做复杂的测试,传统的测试方法运行较慢,而且出了问题很难定位,Difftest就是为了解决这两个问题。

http://www.icfgblog.com/ 4196

Delphi发布ActiveX控件 制作CAB包 数字签名相关

文件: SignTool.rar 大小: 84KB 下载: 下载 最近我正在研究ActiveX技术。我使用Delphi 7创建了一个具有ActiveForm的ActiveX控件应用程序。这个控件产生一个.OCX文件。现在,我需要把这个控件部署在服务器端,在用户浏览网页并选择安装这个控件的时候,用...

weixin_34007879的博客 263

LM339 vs LM358:手把手教你选对比较器和运放(附电路设计避坑指南)

本文深入比较了LM339比较器与LM358运算放大器的核心差异,包括内部架构、输出结构和典型应用场景。通过实测数据和电路设计案例,揭示了选型要点和常见设计陷阱,帮助工程师在电源监控、传感器信号调理等场景中做出正确选择。

convnet3designer的博客 356

如何打包ocx及有文件夹文件的cab包

1.首先将要打包的文件,建一个cab文件夹 2.cab文件夹内放上相应的ocx文件以及dll,并且要加入的文件夹及其文件。 3.在cab文件夹内,新建一个与ocx同名的inf安装配置文件 [version] signature="$CHICAGO$" AdvancedINF=2.0 [DefaultInstall] CopyFiles=FileList Regi...

aiqingquan9205的博客 445

上机任务一:空气质量指数 (air quality index,AQI是定量描述空气质量状况的指数。为了更好地了解和人们身体健康息息相关的天气状况,本书模拟生成500条某地区天气数据,一行样本对应一天

调整后的R平方为0.4308,考虑了模型中的自由度,它略低于多重R平方,说明模型的解释能力可能有限。总的来说,新的模型相对于之前的模型在AIC值上更优,包含了最高温度(X2)和最低温度(X3)这两个重要的预测因子,并且对AQI的解释能力较好。在表中,Df表示自由度,Sum Sq表示总平方和,Mean Sq表示均方(总平方和除以自由度),F value表示F统计量,Pr(>F)表示对应的p值。在分析这些结果时,需要关注系数的显著性(p值),系数的方向(正向或负向影响),以及系数的大小(估计值)。

Mrrunsen的博客 723

AUTOSAR进阶图解==>AUTOSAR_SWS_CANStateManager

AUTOSAR CAN状态管理器(CanSM)摘要 CanSM是AUTOSAR通信栈中的关键模块,负责管理CAN网络状态和模式转换。主要功能包括: 控制CAN控制器/收发器工作模式(STARTED/STOPPED,NORMAL/STANDBY) 处理三种网络状态(全通信、静默通信、无通信)之间的转换 监控和处理总线关闭(Bus-Off)事件 与ComM、CanIf、BswM等模块协同工作 CanSM通过状态机管理网络状态转换,支持可配置的总线关闭恢复策略。它为每个CAN网络维护独立的状态机,实现网络状态的精

一名留德华的,康德的信徒的,专注于汽车电子领域的博客 5579

发布ActiveX控件(把ocx做成cab发布) --activex数字签名

 [Delphi] 发布ActiveX控件(把ocx做成cab发布) ***********转贴**********  作者:光明兄弟 activex数字签名       最近我正在研究ActiveX技术。我使用Delphi 7创建了一个具有ActiveForm的ActiveX控件应用程序。这个控件产生一个.OCX文件。现在,我需要把这个控件部署在服务器端,在用户浏览网页并选择安装这个控件

cai5的专栏 7686

YOLO11实战优化:长尾分布解决 | 引入Seesaw Loss配合YOLO11分类头,完美应对类别极其不平衡的现实业务场景

摘要: YOLO11在工业缺陷检测等长尾分布场景中面临尾部类别检测失效的问题,根源在于头部类别样本的负样本梯度压制了尾部类别的学习。传统方法如重采样、Focal Loss等效果有限。Seesaw Loss通过动态调整缓解因子和补偿因子,平衡类别间的梯度分布,结合YOLO11的解耦分类头、Anchor-Free设计和C2PSA/C3K2模块,显著提升尾部类别识别能力。文章详细解析了Seesaw Loss的数学原理,并提供了可直接集成到YOLO11的PyTorch实现代码,为长尾分布下的目标检测提供了实用解决方

2601_95807009的博客 253

Delphi 发布ActiveX控件 数字签名 CAB Cer

最近我正在研究ActiveX技术。我使用Delphi 7创建了一个具有ActiveForm的ActiveX控件应用程序。这个控件产生一个.OCX文件。现在,我需要把这个控件部署在服务器端,在用户浏览网页并选择安装这个控件的时候,用户的IE才会下载、安装并显示这个控件。 但是我的控

1024

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

IE自动下载安装OCX方法

 【问题的提出】BCB或VC制作的OCX,希望不用手工在客户端注册,就可以在网页里面自动下载、注册、使用。【资料】在MSDN上查找“Packaging ActiveX Controls”,可以找到详细的配置及步骤。完整URL:ms-help://MS.MSDNQTR.2003FEB.2052/activex/workshop/components/activex/packaging.htm另一中文

taozc的专栏 3995

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

发布ActiveX控件(把ocx做成cab发布) --activex数字签名

最近我正在研究ActiveX技术。我使用Delphi 7创建了一个具有ActiveForm的ActiveX控件应用程序。这个控件产生一个.OCX文件。现在,我需要把这个控件部署在服务器端,在用户浏览网页并选择安装这个控件的时候,用户的IE才会下载、安装并显示这个控件。 但是我的控件必须作数字签名以后,IE才会下载安装。问题是如何给ActiveX控件作数字签名呢?现将具体步骤与大家分享...

2345-6789 221

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

delphi 7 创建ocx

新建项目 选择ActiveX 项目重命名 初始界面 全部保存 `ctrl+shift+s` 添加接口并实现 编译 设置打包选项 打包 注册

shepherd_dirk的博客 660

cab文件打包的ActiveX控件(转)

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34037173的博客 382

公布ActiveX控件(把ocx做成cab发布) -activex数字签名

发布ActiveX控件(把ocx做成cab发布) --activex数字签名 最近我正在研究ActiveX技术。我使用Delphi 7创建了一个具有ActiveForm的ActiveX控件应用程序。这个控件产生一个.OCX文件。现在,我需要把这个控件部署在服务器端,在用户浏览网页并选择安装这个控件的时候,用户的IE才会下载、安装并显示这个控件。     但是我的控件必须作数字签名以后,IE

feizhijiang的专栏 1004

linux cab文件怎么安装包,IE控件cab包手动安装

一、XP系统第1步:先解压cab包,在解压的文件中找到*.inf文件,然后右击,选择安装,此时会把解压文件拷到C:Windows\System32文件夹下。第2步:注册拷到上述文件夹下的ocx文件。和普通ocx注册一样,regsvr32 路径*.ocx第3步:加信任站点和自定义级别啦。二、win7或win8系统第1步:先解压cab包,手动把解压的文件拷贝到系统的C:Windows\SysWOW64...

weixin_39814454的博客 497

将delphi做的ocx发布(生成cab)

昨天搞了 很久 有些参数没设置好 找个一劳用逸的方法 现在记录一下 下载cabarc.exe 假设放在 D:\test文件夹里 另外的两个文件 xx.ocx 和 xx.inf 放在这里 xx.inf 的内容: ;cab begin[version]signature="$CHICAGO$"AdvancedINF=2.0 [Add.Code]xx.ocx=xx.ocx [xx.ocx]...

weixin_30279751的博客 168

java 报表工具,delphi 封装 rm报表 ocx

很多人都关注报表的,这里有一个简单易用的 http://download.youkuaiyun.com/detail/lujianfu/2881508 java 报表工具,delphi 封装 rm报表 ocx 一个封装给 java web 报表的打印 使用方法: 范例使用的是access数据库,首先在odbc 注册ReportDemo.mdb 数据源,名字随你喜好, 然后修改classes文件

lujianfu的专栏 749

由上网中病毒木马所想到的...与网页中使用ocx,cab包有关。

由上网中病毒木马所想到的...与网页中使用ocx,cab包有关。 Delphi / Windows SDK/APIhttp://www.delphi2007.net/DelphiBase/html/delphi_20061218114045129.html 不知你是否有这样的经历,打开了某个网页之后,发现系统中毒了,而你并没有进行任何可疑的操作,仅仅是就打开了一个网页而已。 ...

aibi9196的博客 158
上一篇: 制作OCX的网络发布CAB包
下一篇: 对TServerSocket实行IP绑定之一(辗转方式,只用于演示,除非必要不推荐使用)
僵哥
博客等级 码龄25年 1334粉丝 24原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值