非托管MFC调用 C# Activex控件或用户控件

wuzhanhui 2014-06-30 11:50:52
非托管C++(MFC)调用 C# Activex控件或用户控件,目前只能实现调用C#一些简单的函数(通过注册COM组件),想用同样的方法去调用C# Activex控件和用户控件就会出错
,已经想了很多办法是在找不到了,在此恭候各位大神指点
...全文
342 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
wuzhanhui 2014-07-10
  • 打赏
  • 举报
回复
希望能帮助更多的人
wuzhanhui 2014-07-10
  • 打赏
  • 举报
回复
问题解决了,结贴散分,把我写的代码贴上也,19楼的方法我有空去试一下,多谢大家的积极帮忙 HRESULT CreateAxControl(HWND hWnd,const wchar_t * ProgId,IUnknown ** ppControlUnknown,IUnknown ** ppContainerUnknown) { //struct __declspec(uuid("46CE6130-1011-4B4D-9DCF-A32FBB5EA206")) aa; HRESULT hr;//The return codes used by COM interfaces. CLSID cls;//uuid如uuid("46CE6130-1011-4B4D-9DCF-A32FBB5EA206") IOleObject * pObject = NULL;//从IUnknown接口IOleObject接口继承,IOleObject也有这些类型的成员,站点对象负责管理链接或嵌入到文档中的服务器对象,服务器对象所必须实现的接口为IOleObject。 CControlContainer * pContainer = NULL; hr = CLSIDFromProgID(ProgId,&cls);//根据proid获取CLSID if (FAILED(hr)) goto exit1; //参数CLSID:创建的Com对象的类标识符,LPUNKNOWN:指向接口IUnknown的指针,DWORD:运行可执行代码的上下文,REFIID:创建的Com对象的接口标识符,LPVOID:用来接收指向Com对象接口地址的指针变量 hr = CoCreateInstance(cls,NULL,CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER|CLSCTX_LOCAL_SERVER,IID_IOleObject,(void**)&pObject);//创建一个Com对象 //pObject->QueryInterface(uuidof(aa),) if (FAILED(hr)) goto exit1; pContainer = new CControlContainer(hWnd);//创建一个控件容器 hr = pObject->SetClientSite(pContainer);//设置容器位置,设置OLE包容器的站点对象 if (FAILED(hr)) goto exit1; hr = pObject->DoVerb(OLEIVERB_SHOW,0,pContainer,0,hWnd,0);//请求一个对象执行操作以响应用户的动作,激活嵌入对象,并可通过使用不同的动词让嵌入对象执行相应的动作 if (FAILED(hr)) goto exit1; pObject->QueryInterface(IID_IUnknown,(void**)ppControlUnknown);//通过此函数来查询某个组件是否支持某个特定的接口,若支持QueryInterface将返回一个指向这些接口的指针,不支持返回值将是一个失败结果 pContainer->QueryInterface(IID_IUnknown,(void**)ppContainerUnknown); hr = S_OK; exit1: if (pObject) pObject->Release(); if (pContainer) pContainer->Release(); return hr; }
wuzhanhui 2014-07-10
  • 打赏
  • 举报
回复
引用 20 楼 schlafenhamster 的回复:
在 资源 的 控件 窗口 本来 没有 你的 active , 你 要 加入 active 控件 才 有 你的 控件 , 当 你 拖 一个 active 到 对话框的 时候, vc 会 插入 必要的文件, 我不知道 你 是 怎么 拖进来 的 , 拖 进来 的 是不是 你的 active?
是拖进来的哦,我试过了,如果用mfc做的Activex控件的话是会有的,但是那个就不会有,不知道为什么
schlafenhamster 2014-07-09
  • 打赏
  • 举报
回复
在 资源 的 控件 窗口 本来 没有 你的 active , 你 要 加入 active 控件 才 有 你的 控件 , 当 你 拖 一个 active 到 对话框的 时候, vc 会 插入 必要的文件, 我不知道 你 是 怎么 拖进来 的 , 拖 进来 的 是不是 你的 active?
lis2012 2014-07-09
  • 打赏
  • 举报
回复
引用 12 楼 wuzhanhui 的回复:
[quote=引用 8 楼 lis2012 的回复:] 你是如何调用这个控件的(控件插入拖拽到界面,还是 import “XX.tlb”),把你的调用代码放上来
#import "C:\\Users\\Administrator\\Desktop\\Cbb切图与文件\\文件\\C++C#Activi\\InteropDemo\\MFCApplication2\\ActiveXCom.tlb" void CMFCApplication2Dlg::OnBnClickedButton1() { HRESULT hr; //ComInteropDemo::ComInterop *p; //初始化COM CoInitialize ( NULL ); //创建智能指针ComInteropDemo::ComInteropInterface ActiveXCom::ComInterfacePtr ptr; //创建实例 hr = ptr.CreateInstance(__uuidof (ActiveXCom::ComControl)); if(hr == S_OK) { ptr->SetSize (1000.0, 500.0); } CoUninitialize (); // TODO: 在此添加控件通知处理程序代码 } 这个是import进来的,这段代码跟我拖进来的那个Activex没有关系,所以我想怎么拿到我拖进去的那个控件对象,请教一下[/quote] 你上边的写法只是创建了一个接口对象,而不是创建一个activex控件 通过应用接口来动态创建控件对象代码:

if (m_pWndFramework == NULL)//  CWnd* m_pWndFramework;类成员变量 ,在构造函数里面置空
	{

		m_pWndFramework = new CWnd;
		CRect rcRange;    //设置显示区域
		GetClientRect(rcRange);
		BOOL bCreate = m_pWndFramework->CreateControl(__uuidof(XXXXXXX),_T("XXXXXXX"),WS_VISIBLE|WS_CHILD,rcRange,this,IDC_XXXX);//具体参数 百度谷歌 填入相应的clisd 和名称  最后一个参数位  控件ID
		if( bCreate )
		{
			IUnknown * pUn = m_pWndFramework->GetControlUnknown(); 
			if(pUn) 
			{ 
				pUn->QueryInterface(IID_IDispatch,(void **)&m_pFramework);     //m_pFramework 这里才为控件对象
				bResult = TRUE;
			}
		}
	}
wuzhanhui 2014-07-09
  • 打赏
  • 举报
回复
有啊,但是点击add 变量就报错,报的错误信息我上面已经上图了。
schlafenhamster 2014-07-09
  • 打赏
  • 举报
回复
那个控件对象 有ID吧?找到这个ID, 点击Add 变量
lis2012 2014-07-04
  • 打赏
  • 举报
回复
你是如何调用这个控件的(控件插入拖拽到界面,还是 import “XX.tlb”),把你的调用代码放上来
schlafenhamster 2014-07-04
  • 打赏
  • 举报
回复
把Activex控件注册, MFC 应该可以 发现
wuzhanhui 2014-07-04
  • 打赏
  • 举报
回复
引用 5 楼 xuddk727 的回复:
请详细描述下大致是什么样的功能,若时间允许我可以做个示例给你
我现在已经实现了非托管MFC调用 C# Activex控件了,但现在遇到的问题怎么在MFC里面把Activex控件添加成变量, 如果是MFC自己开发的Activex控件在mfc项目里面是可以直接添加变量的,请问怎么实现
wuzhanhui 2014-07-04
  • 打赏
  • 举报
回复
up。。。。。。。。。。。。。
wuzhanhui 2014-07-04
  • 打赏
  • 举报
回复
引用 13 楼 schlafenhamster 的回复:
"拿到我拖进去的那个控件对象" 给这个控件 关联一个 变量
你看上面我截图,就是因为关联变量不了,我就蛋疼了,难道你还有别的办法让他关联,求解
wuzhanhui 2014-07-04
  • 打赏
  • 举报
回复
引用 8 楼 lis2012 的回复:
你是如何调用这个控件的(控件插入拖拽到界面,还是 import “XX.tlb”),把你的调用代码放上来
我现在可以拖进去,但是不知道怎么用代码去改变那个控件 的一些属性,求解
schlafenhamster 2014-07-04
  • 打赏
  • 举报
回复
"拿到我拖进去的那个控件对象" 给这个控件 关联一个 变量
wuzhanhui 2014-07-04
  • 打赏
  • 举报
回复
引用 8 楼 lis2012 的回复:
你是如何调用这个控件的(控件插入拖拽到界面,还是 import “XX.tlb”),把你的调用代码放上来
#import "C:\\Users\\Administrator\\Desktop\\Cbb切图与文件\\文件\\C++C#Activi\\InteropDemo\\MFCApplication2\\ActiveXCom.tlb" void CMFCApplication2Dlg::OnBnClickedButton1() { HRESULT hr; //ComInteropDemo::ComInterop *p; //初始化COM CoInitialize ( NULL ); //创建智能指针ComInteropDemo::ComInteropInterface ActiveXCom::ComInterfacePtr ptr; //创建实例 hr = ptr.CreateInstance(__uuidof (ActiveXCom::ComControl)); if(hr == S_OK) { ptr->SetSize (1000.0, 500.0); } CoUninitialize (); // TODO: 在此添加控件通知处理程序代码 } 这个是import进来的,这段代码跟我拖进来的那个Activex没有关系,所以我想怎么拿到我拖进去的那个控件对象,请教一下
wuzhanhui 2014-07-04
  • 打赏
  • 举报
回复
引用 9 楼 xuddk727 的回复:
添加变量是什么意思?为属性赋值?


如果常规MFC做的Activex控件就可以添加,这样的话就随时改变控件的大小等一些属性
wuzhanhui 2014-07-04
  • 打赏
  • 举报
回复
引用 7 楼 schlafenhamster 的回复:
把Activex控件注册, MFC 应该可以 发现


#include "stdafx.h"
#include "MFCApplication2.h"
#include "MFCApplication2Dlg.h"
#include "afxdialogex.h"
#import "C:\\Users\\Administrator\\Desktop\\Cbb切图与文件\\文件\\C++C#Activi\\InteropDemo\\MFCApplication2\\ActiveXCom.tlb"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// 用于应用程序“关于”菜单项的 CAboutDlg 对话框

class CAboutDlg : public CDialogEx
{
public:
CAboutDlg();

// 对话框数据
enum { IDD = IDD_ABOUTBOX };

protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持

// 实现
protected:
DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()


// CMFCApplication2Dlg 对话框



CMFCApplication2Dlg::CMFCApplication2Dlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CMFCApplication2Dlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CMFCApplication2Dlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CMFCApplication2Dlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1, &CMFCApplication2Dlg::OnBnClickedButton1)
END_MESSAGE_MAP()


// CMFCApplication2Dlg 消息处理程序

BOOL CMFCApplication2Dlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
}

void CMFCApplication2Dlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialogEx::OnSysCommand(nID, lParam);
}
}

// 如果向对话框添加最小化按钮,则需要下面的代码
// 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
// 这将由框架自动完成。

void CMFCApplication2Dlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文

SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

// 使图标在工作区矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;

// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialogEx::OnPaint();
}
}

//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CMFCApplication2Dlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}



void CMFCApplication2Dlg::OnBnClickedButton1()
{
HRESULT hr;

//ComInteropDemo::ComInterop *p;


//初始化COM
CoInitialize ( NULL );

//创建智能指针ComInteropDemo::ComInteropInterface
ActiveXCom::ComInterfacePtr ptr;

//创建实例
hr = ptr.CreateInstance(__uuidof (ActiveXCom::ComControl));

if(hr == S_OK)
{
ptr->SetSize (1000.0, 500.0);
}

CoUninitialize ();
// TODO: 在此添加控件通知处理程序代码
}

我现在即插入拖拽到界面,又import “XX.tlb”我想调用SetSize一下设置他的高宽,SetSize是我在C#写的给用户控件的高宽,
我访问到了这个函数后赋值成功了,但是控件依然没有变化,我是在那个方法做一个弹出框来确认是否调用到,值也传过去了,
也给那个控件赋值了,但是依然还是不能变,求解
许文君 2014-07-04
  • 打赏
  • 举报
回复
添加变量是什么意思?为属性赋值?
许文君 2014-07-01
  • 打赏
  • 举报
回复
请详细描述下大致是什么样的功能,若时间允许我可以做个示例给你
schlafenhamster 2014-07-01
  • 打赏
  • 举报
回复
"非托管C++(MFC)调用 C# Activex控件或用户控件(托管)" MFC 能不能也设置为 托管 的 ? 否则 原理 都 不一样 (有gc和无gc)
加载更多回复(3)

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧