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

ActiveX 开发

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


创建ActiveX工程

使用VS2017开发ActiveX控件来显示视频_第1张图片

添加调用接口

使用VS2017开发ActiveX控件来显示视频_第2张图片

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

添加回调接口

使用VS2017开发ActiveX控件来显示视频_第3张图片

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

js调用sample

  
<HEAD>  
<TITLE>Test ActiveXTITLE>  
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();
}


<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库的依赖。

你可能感兴趣的:(windows)