使用VS2017开发ActiveX控件来显示视频
程序员文章站
2022-04-05 19:45:58
...
ActiveX 开发
ActiveX是Microsoft对于一系列策略性面向对象程序技术和工具的称呼,其中主要的技术是组件对象模型(COM)。 —— [ 百度百科 ]
创建ActiveX工程
添加调用接口
* 这里注意字符串尽量使用BSTR类型 *
添加回调接口
* 注意添加事件的地方不在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库的依赖。
上一篇: Zookeeper的基本命令
下一篇: 初尝图像识别