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...

使用Qt自动注册Lav的更多相关文章

  1. 制作dll自动注册工具

    记录一个简单的dll自动注册工具制作:主要用到的是DllRegisterServer()方法,其实我们平常注册dll文件内部都会调用这个方法. 这里我就直接写在主程序里面了,需要注意的地方也直接在代码 ...

  2. pb自动注册ole控件

    方法一:  1.手工注册OCX控件 将该控件随程序一起发布,然后,将此文件拷到windows\system,或者直接放在本运行目录,然后执行dos命令,run( "regsvr32   *. ...

  3. C#实现Dll(OCX)控件自动注册的两种方法 网上找的 然后 自己试了试 还是可以用的

    尽管MS为我们提供了丰富的.net framework库,我们的程序C#开发带来了极大的便利,但是有时候,一些特定功能的控件库还是需要由第三方提供或是自己编写.当需要用到Dll引用的时候,我们通常会通 ...

  4. 在 node.js 的 express web 框架中自动注册路由

    该方法主要是动态注册自己写的 router . 注册器 router 文件名为 loader.js  . var express = require('express'); var fs = requ ...

  5. .NET Core扩展IServiceCollection自动注册服务

    前言 在ASP.NET Core中使用依赖注入中使用很简单,只需在Startup类的ConfigureServices()方法中,通过IServiceCollection接口进行注入即可,其它的无需关 ...

  6. Unity3.0基于约定的自动注册机制

    前文<Unity2.0容器自动注册机制>中,介绍了如何在 Unity 2.0 版本中使用 Auto Registration 自动注册机制.在 Unity 3.0 版本中(2013年),新 ...

  7. Unity2.0容器自动注册机制

    现如今可能每个人都会在项目中使用着某种 IoC 容器,并且我们的意识中已经形成一些固定的使用模式,有时会很难想象如果没有 IoC 容器工作该怎么进展. IoC 容器通过某种特定设计的配置,用于在运行时 ...

  8. C++11实现一个自动注册的工厂

    实现动机 工厂方法是最简单地创建派生类对象的方法,也是很常用的,工厂方法内部使用switch-case根据不同的key去创建不同的派生类对象,下面是一个伪代码. Message* create(int ...

  9. 【转】第6篇:Xilium CefGlue 关于 CLR Object 与 JS 交互类库封装报告:自动注册JS脚本+自动反射方法分析

    作者: 牛A与牛C之间 时间: 2013-11-21 分类: 技术文章 | 暂无评论 | 编辑文章 主页 » 技术文章 » 第6篇:Xilium CefGlue 关于 CLR Object 与 JS ...

随机推荐

  1. redis集群数据迁移txt版

    ./redis-trib.rb create --replicas 1 192.168.112.33:8001 192.168.112.33:8002 192.168.112.33:8003 192. ...

  2. 洛谷$P2050\ [NOI2012]$美食节 网络流

    正解:网络流 解题报告: 传送门$QwQ$ 昂开始看到$jio$得,哇长得好像上一题嗷$QwQ$ 然后仔细康康数据范围,发现,哇好像要几万个点,,,显然就$GG$了 但感$jio$思路方向好对的亚子? ...

  3. 【原创】够强!一行代码就修复了我提的Dubbo的Bug。

    这是 why 技术的第 28 篇原创文章 之前在<Dubbo 一致性哈希负载均衡的源码和 Bug,了解一下?>中写到了我发现了一个 Dubbo 一致性哈希负载均衡算法的 Bug. 对于解决 ...

  4. k8s(1.14.0)+etcd(3.3.10)+flanneld(0.10)

    K8s(1.14) 几张比较不错的图 1.kubernetes 组件图 kubernetes 架构图 2.kubernetes 网络架构图 数据从源容器中发出后,经由所在主机的docker0虚拟网卡转 ...

  5. 大白话带你梳理一下Dubbo的那些事儿

    首先声明,本文并不是什么代码实战类型的文章,适合于想对dubbo有更加全面认识的读者阅读,文章不会过于深奥,只是将一系列的知识点串通起来,帮助读者温故而知新. RPC服务的介绍 相信有过一些分布式开发 ...

  6. InnoDB与MyISAM的区别(高性能MySQL笔记)

    1.InnoDB支持事务,MyISAM不支持,也就是说MyISAM不支持事务回滚操作,这个功能可能是致命的 2.InnoDB支持行锁,MyISAM只支持表锁,不过InnoDB的行锁是建立在索引之上的, ...

  7. C#调用JS的WebService的方法返回null

    连上了别人的VPN后,使用WebService测试软件测试了一下,结果正常,但是当我在vs里面添加WebService服务,调用的时候就出现了问题,问题如下图: 后来问了一下服务端那边的同事,他们说服 ...

  8. js去除字符串的前后空白

    使用gravatar生成邮箱的头像时需要对邮箱地址哈希化,其中需要去除邮箱地址的首尾空白,查找了一些资料,总结一下 使用 js 提供的函数 trim() trim() 方法会删除一个字符串两端的空白字 ...

  9. Scala实践1

    一.Scala安装和配置 1.1安装 Scala需要Java运行时库,安装Scala需要首先安装jdk. 然后在Scala官网下载 程序安装包 根据不同的操作系统选择不同的安装包,下载完成后,将安装包 ...

  10. 小白学 Python 爬虫(41):爬虫框架 Scrapy 入门基础(八)对接 Splash 实战

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...