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

 

posted @   scott_h  阅读(553)  评论(0编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· 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)
点击右上角即可分享
微信分享提示