Qt播放视频使用QMediaPlayer要注册Lav解码器,如果手动去注册,每次去使用管理员运行命令或者生成.bat文件都比较麻烦。

解决方法步骤如下:

一:编写注册Lav解码器脚本,并取消控制台的显示,生成.bat文件。

二:使用Bat to Exe将.bat文件转换为exe文件。

三:使用QSettings和QProcess进行注册。

实现步骤:

一:注册Lav脚本

/***-------------------------取消控制台显示-----------------------*****/

@echo off

:: BatchGotAdmin
   REM --> Check for permissions
   >nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"

REM --> If error flag set, we do not have admin.
   if '%errorlevel%' NEQ '0' (
   echo Requesting administrative privileges...
   goto UACPrompt
   ) else ( goto gotAdmin )

:UACPrompt
   echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
   echo UAC.ShellExecute "%~s0", "", "", "runas", 1 >> "%temp%\getadmin.vbs"

"%temp%\getadmin.vbs"
   exit /B

:gotAdmin
   if exist "%temp%\getadmin.vbs" ( del "%temp%\getadmin.vbs" )
   pushd "%CD%"

/***-----------------注册Lav-----------------------***/

cd/d %~dp0
   regsvr32/s LAVAudio.ax
   regsvr32/s LAVVideo.ax
   regsvr32/s LAVSplitter.ax
   pause

二:转换为exe(为了Qt进行进程调用)

以及在Bat to exe工具右边菜单栏有个选择是否显示窗口的,我这边是都进行选择了。

并选择不需要管理员权限,最近发现使用这个生成的.exe在360以及win10自带的病毒防护会识别为木马进行隔离   ....?...

查了一下,是因为使用这款工具是对软件进行upx加壳?具体的也没有深究,找个时间再研究下。。zzZ

三:自动注册

检测电脑是否已注册Lav,判断方法是从注册表CLSID去查找,但是不太确定是否得当,如果大家有好的方面,麻烦告知,

谢谢啦~

(1)、填写config文件进行判断,防止每次都要去查找注册表,影响性能。

config文件可以这样添加:

(0:表示未该电脑已注册;1:表示未注册)

将程序放到服务器上,此时config文件填写数据是0,用户自动下载后就会进行本机的检测,有就会置1,否则注册后置1。

(2)、Qt读取config文件:

void RegLav::ReadIniConfigure(QString& strConfigureName, const QString& strKey, QString& strValue)
    {
       QString strConfigureFile = QApplication::applicationDirPath() + "/";
       strConfigureFile += strConfigureName;

QSettings sett(strConfigureFile, QSettings::IniFormat);
       strValue = sett.value(strKey).toString();
      }

(3)、Qt检测及注册

void RegLav::regeditLav()
    {

//注册表项辨别
      QSettings controls(QLatin1String("HKEY_LOCAL_MACHINE\\SOFTWARE\\Classes\\CLSID\\{083863F1-70DE-11D0-BD40-00A0C911CE86}\\Instance\\"), QSettings::NativeFormat); //注册表controls.beginGroup(QLatin1String("/CLSID"));
      QStringList clsids = controls.childGroups();

//遍历查找当前子项

for (int i = 0; i < clsids.size(); i++)
      {
         if (clsids.at(i) == "{171252A0-8820-4AFE-9DF8-5C92B2D66B04}")
         {
           m_bRegLav = true;                                          //控制
           break;
         }
     }
     if (m_bRegLav == false)
    {
      QProcess lpr;                                                         
      QDir lavDir(applicationDirPath());
      QString lavPath = lavDir.absolutePath();
      QString LavCtl = lavPath;
      lavPath += "/lavRegedit.exe";
      lpr.execute(lavPath);                                              //QProcess启动外部程序,关于进程通信,找个时间再码下..zzZ
      LavCtl += "/Config.ini";
      QSettings sett(LavCtl, QSettings::IniFormat);        //注册完后进行改变config固定键值,以防下次打开还需查找遍历注册。
      sett.setValue("IsRegLav/regeditLav",1);
      }
      }

(4)、函数调用

具体的情况看你需要在哪边调用写好的函数。

如:其实构造函数

void    RegLav::RegLav()

{

RegLav::ReadIniConfigure(QString("Config.ini"), QString("IsRegLav/regeditLav"), strLav);
       if (strLav == "0")
       {
        regeditLav();
       }

}

注意:.bat脚本转换的exe文件、lav解码器的三个ax文件及dll要放置的位置要让程序找得到,这里是放置于与主程序一起。

实现以上功能的程序,如果使用了Qt视频播放,而又需要注册Lav解码器可以参考下,菜鸡上路,实力有限,有更好的方法欢迎交流~

zzZ...     zzZ...

最新文章

  1. jpa+springdata
  2. 在Visual Studio中将现有.NET Framework项目迁移至.NET Core 1.1 Preview 1
  3. java 常见关键字的使用
  4. maven打包时使用的pom配置
  5. nodejs net模块实现socket
  6. Java学习-020-Properties 判断是否存在对应的 key 项
  7. Android权限之sharedUserId和签名
  8. (jQuery 插件)封装容器的表单为json对象
  9. 自定义视图控制器切换(iOS)
  10. TestNg JAVA 自动化单元测试框架Demo
  11. 干净的架构The Clean Architecture
  12. HPQC HP Quality Center windows 服务
  13. JQuery基础知识(1)
  14. 多个git账户生成多份rsa秘钥实现多个账户同时使用配置
  15. LightOJ 1370 Bi-shoe and Phi-shoe 数论
  16. CSS文字的跑马灯特效
  17. SpringCloud无废话入门04:Hystrix熔断器及监控
  18. nodejs通过mocha处理运行文件路径下所有js文件
  19. Oracle的安装与配置
  20. 解决sudo: npm: command not found

热门文章

  1. Flink State Backends (状态后端)
  2. ES6学习之二
  3. JAVA8学习——深入Comparator&amp;Collector(学习过程)
  4. Spring Boot 添加Druid连接池(1.5 版本)
  5. 侠说java8-行为参数化(开山篇)
  6. C++ 模板常见特性(函数模板、类模板)
  7. spring之整合Hibernate
  8. 量化投资学习笔记07——python知识补漏
  9. .gitignore 文件配置
  10. java架构之路(多线程)JMM和volatile关键字(二)