OCX 控件Tips
http://msdn.microsoft.com/zh-cn/library/aa273162
OCX控件的父类 COleControl
=====
修改uuid, 查看*.idl *.odl 对应的 *ctrl.cpp *.h 也需要修改这4个值,用uuidgen.exe 把所有的值记录下来,再替换。
OCX共4个uuid
* ActiveX Control module
Dispatch interface for * Control
Event interface for * Control
* Control
=====
1.ActiveX 传递字符串 到 JS
这是VS2010 中自动添加的代码
dispidgetName = 1L,
DISP_FUNCTION_ID(CGMRtspPlayerCtrl, "getName", dispidgetName, getName, VT_BSTR, VTS_NONE)
BSTR CGMRtspPlayerCtrl::getName(void)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CString strResult;
// TODO: 在此添加调度处理程序代码
return strResult.AllocSysString();
}
这个我之前返回的是其他类型的值,虽然也可以传递值,但是浏览器IE10 ok,ie8 各种错误[sysFader ......]。血泪史~~~
所以强烈推荐大家自动去添加方法 (别手动写了), 在【类视图】->【XXXXLib】->右键 添加方法和属性
这样比较不容易犯错。
2.选择目录
unsigned long CGMRtspPlayerCtrl::CF_SelectPath(LPTSTR lpPath)
{
TCHAR szPath[MAX_PATH]; //存放选择的目录路径
ZeroMemory(szPath, sizeof(szPath));
BROWSEINFO bi;
// bi.hwndOwner = m_hWnd;
// bi.hwndOwner = GetParent();//ParentWnd();
// bi.hwndOwner = NULL;
bi.pidlRoot = NULL;
bi.pszDisplayName = szPath;
//bi.lpszTitle = L"请选择目录:";
bi.lpszTitle = L"Please select a directory:";
bi.ulFlags = 0;
bi.lpfn = NULL;
bi.lParam = 0;
bi.iImage = 0;
//弹出选择目录对话框
LPITEMIDLIST lp = SHBrowseForFolder(&bi);
if(lp && SHGetPathFromIDList(lp, (LPWSTR)szPath))
{
_tcscpy(lpPath, szPath);
return 1;
}
return 0;
}
3.读写ini文件
UINT uRet1st = WritePrivateProfileString(szSection, szRecordKey, szRecordDirectory, szIniPath);
::GetPrivateProfileString(szSection, szRecordKey, NULL, szRecordDirectory, MAX_PATH, szIniPath);//read ini
4. 获取 *.ocx控件 而不是调用该控件的exe的目录地址,的目录地址(#include <intrin.h> //just 4 _ReturnAddress())
(一般用GetModuleFileName 是获取exe的路径)
(当然还可以用_ReturnAddress()过滤 你想过滤的dll,ocx)
TCHAR szModulePath[MAX_PATH];
LPTSTR CGMRtspPlayerCtrl::CF_GetModulePath()
{
ZeroMemory(szModulePath, sizeof(szModulePath));
HMODULE hCallerModule = NULL;
void *callerAddress = _ReturnAddress(); //http://caicaioffice.blog.163.com/blog/static/1417910220091015104123444/
if (::GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, (LPCWSTR)callerAddress, &hCallerModule))
{
::GetModuleFileName(hCallerModule, szModulePath, ARRAYSIZE(szModulePath));
::PathRemoveFileSpec(szModulePath);
}
return szModulePath;
}
4.对目录进行操作,检测文件是否存在。。。等 最好用 #include "Shlwapi.h"
// PathFileExists(),PathIsDirectory()
可以去头文件看,或者MSDN 看下
5.导出ocx 控件的接口, 创建工程 用MFC AppWizard(exe)-> Dialog based
打开dialog 资源(rc)文件,右键 【Insert ActiveX control...】
选择你要导出的ActiveX(当然你要先注册)
还有OCX路径
看到白色的区域,就是添加的ActiveX部分,
-> 右键 [Class Wizard]
-> tab 选择到【member Variables】
-> 选中你的那个 【IDC_控件名字】 ,
-> 点击【add Variables..】(双击也可以)
开始添加 比如我取名 m_ocx,
OK了,
你可以在你的APP的dlg类中看到添加的 ActiveX类
*Dlg.h//===========================
#include "ipcdeviceconfig.h"
*Dlg.cpp//============================
void COcxExport2Dlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(COcxExport2Dlg)
DDX_Control(pDX, IDC_DEVICECONFIGCTRL1, m_ocx);
//}}AFX_DATA_MAP
}
//=============================
最后就可以用了比如 m_ocx.Connect(ip,port....);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)