欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

使用VS2017开发ActiveX控件来显示视频

程序员文章站 2022-04-05 19:45:58
...

ActiveX 开发

ActiveX是Microsoft对于一系列策略性面向对象程序技术和工具的称呼,其中主要的技术是组件对象模型(COM)。 —— [ 百度百科 ]


创建ActiveX工程

使用VS2017开发ActiveX控件来显示视频

添加调用接口

使用VS2017开发ActiveX控件来显示视频

* 这里注意字符串尽量使用BSTR类型 *

添加回调接口

使用VS2017开发ActiveX控件来显示视频

* 注意添加事件的地方不在Events菜单里面,迁移到 Ctrl菜单里面 *

js调用sample

<!DOCTYPE HTML>  
<HEAD>  
<TITLE>Test ActiveX</TITLE>  
</HEAD>  
<body>
<OBJECT name="MFCActiveXDemo" ID="Test_MFCActiveXDemo" WIDTH=528 HEIGHT=545 classid="CLSID:5ab0294d-c437-4f20-b3ad-e9b1888ccf45">  
    <PARAM NAME="_Version" VALUE="65536">  
    <PARAM NAME="_ExtentX" VALUE="12806">  
    <PARAM NAME="_ExtentY" VALUE="1747">  
    <PARAM NAME="_StockProps" VALUE="0">  
</OBJECT>  
<script language="javascript">
function doTest()
{
    MFCActiveXDemo.AboutBox();
}

<br/>
<input type="button" value="ActiveX About" id="Test" onclick="doTest();">


</body>
</HTML>  

打包发布

注意事项

  • 1
    ActiveX的接口参数中如果有字符串,尽量不要使用char/char*等参数,使用BSTR(LPCTSTR),否则会调用不到,可以使用下面函数进行wide char与char之间的转换
void UnicodeToUtf8(const wchar_t* unicode, char* UTF8, int size)
{
    int len = WideCharToMultiByte(CP_UTF8, 0, (wchar_t *)unicode, -1, NULL, 0, NULL, NULL);
    memset(UTF8, 0, size);

    len = min(len, size);
    WideCharToMultiByte(CP_UTF8, 0, (wchar_t *)unicode, -1, UTF8, len, NULL, NULL);
}

void UTF8ToUnicode(const char* UTF8, wchar_t* UnicodeStr, int size)
{
    DWORD dwUnicodeLen = MultiByteToWideChar(CP_UTF8, 0, UTF8, -1, NULL, 0);
    memset(UnicodeStr, 0, size);

    if (dwUnicodeLen < size / sizeof(wchar_t)) {
        MultiByteToWideChar(CP_UTF8, 0, UTF8, -1, UnicodeStr, dwUnicodeLen);
    } else {
        MultiByteToWideChar(CP_UTF8, 0, UTF8, -1, UnicodeStr, size / sizeof(wchar_t));
    }
}
  • 2
    回调js的代码一定要在UI线程当中执行,可以用PostMessage的方式,将消息转发到主线程当中回调,否则回调会失败

  • 3
    使用StretchDIBits函数在hwnd上面画RGB图像时

    • 先要调用SetStretchBltMode,否则图像会有噪点
SetStretchBltMode(pdc->m_hDC, COLORONCOLOR);
StretchDIBits(pdc, 0, 0, width, height,
        0, 0, mVideoWidth, mVideoHeight,
        mVideoBuffer, m_pBmpInfo, DIB_RGB_COLORS, MERGECOPY);
  • 注意windows的RGB排列是BGR BGR BGR的方式,如果图像是ffmpeg转换出来的话,需要使用AV_PIX_FMT_BGR24格式,否则RB会相反,图像颜色错误
  • 24位RGB要使用bmiHeader.biCompression = BI_RGB;格式,32位RGB使用bmiHeader.biCompression = BI_BITFIELDS; 同时使用
        DWORD *mask = (DWORD*)&m_pBmpInfo->bmiColors;
        *mask++ = 0x00FF0000;
        *mask++ = 0x0000FF00;
        *mask = 0x000000FF;

来控制RGB的排列

  • 如果ocx编译提示无法注册输出,则使用管理员权限打开vs环境,因为要注册控件到系统,需要权限,同样在cmd通过regsvr32注册的时候,也要以管理员权限打开cmd

  • 如果最终打包成的ocx无法在系统当中注册,比如缺失一些库,可以用dependencywalker程序去看一下缺少什么库

  • MFC要静态依赖,可以减少安装环境对MFC库的依赖。

相关标签: 微软 ActiveX js