C++调用WPF
acmilan2016/07/07软件综合 IP:四川

对,不是C++/CLI。用的是.NET的非托管接口和反射特性。

优点是与编译器无关,缺点是比较麻烦,需要用反射进行调用。

<code class="language-app.config"><configuration>
  <startup uselegacyv2runtimeactivationpolicy="true">
    <supportedruntime version="v4.0.30319">
    <supportedruntime version="v2.0.50727">
  </supportedruntime></supportedruntime></startup>
</configuration>
</code>
<code class="language-cpp">// bindcoree.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

#pragma warning(disable: 4996)

#include <windows.h>
#include <shlwapi.h>
#include <mscoree.h>
#import <mscorlib.tlb> rename("ReportEvent", "ReportEvent_mscor")
#pragma comment(lib, "shlwapi.lib")
#pragma comment(lib, "mscoree.lib")
using namespace mscorlib;

int _tmain(int argc, _TCHAR* argv[])
{
	// 初始化COM线程模型
	HRESULT hr = CoInitialize(NULL); // 重要!运行WinForms和WPF必需

	// 构造app.config路径
	WCHAR path[MAX_PATH];
	GetModuleFileName(NULL, path, MAX_PATH);
	PathRemoveFileSpec(path);
	PathAppend(path, L"app.config");
	
	// 初始化.NET运行库(没找到app.config按.NET2.0/3.x加载)
	ICorRuntimeHost *crh = NULL;
	hr = CorBindToCurrentRuntime(path, CLSID_CorRuntimeHost, IID_ICorRuntimeHost, (void**)&crh);
	crh->Start();

	// 获取当前程序域
	IUnknownPtr domainunk;
	crh->CurrentDomain(&domainunk);
	_AppDomainPtr domain;
	domain = domainunk;
	
	// 加载WPF运行库程序集(只加载需要的就行了)
	// 注册程序集一般要强名称才能加载,可以去以下两个地方找到相关信息:
	// C:\Windows\assembly - .NET 2.0/3.x
	// C:\Windows\Microsoft.NET\assembly - .NET 4.x
	_AssemblyPtr prefx = domain->Load_2(_bstr_t(L"PresentationFramework, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"));
	//_AssemblyPtr precore = domain->Load_2(_bstr_t(L"PresentationCore, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"));
	//_AssemblyPtr winbase = domain->Load_2(_bstr_t(L"WindowsBase, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"));
	
	// 获取Window类型信息
	_TypePtr twindow = prefx->GetType_2(_bstr_t(L"System.Windows.Window"));

	// 创建Window类型实例
	variant_t objwindow = prefx->CreateInstance(_bstr_t(L"System.Windows.Window"));
	
	// 调用ShowDialog方法
	twindow->InvokeMember_3(_bstr_t(L"ShowDialog"),
		(BindingFlags)(BindingFlags_InvokeMethod|BindingFlags_Instance|BindingFlags_Public),
		NULL, objwindow, NULL);

	/////////////////////////////////////////////////////////////////////////////////////////////////
	// 下面是调用没有强名称的一般程序集的做法

	//_AssemblyPtr assembly = domain->Load_2(_bstr_t(L"ClassLibrary"));

	//_TypePtr t = assembly->GetType_2(_bstr_t(L"ClassLibrary.Class1"));

	//variant_t nullobj;
	//t->InvokeMember_3(_bstr_t(L"WriteVersion"),
	//	(BindingFlags)(BindingFlags_InvokeMethod|BindingFlags_Static|BindingFlags_Public),
	//	NULL, nullobj, NULL);

	///////////////////////////////////////////////////////////////////////////////////////////////////

	// 卸载ICorRuntimeHost(只有它不是智能指针)
	crh->Release();
	crh = NULL;

	// 卸载COM
	CoUninitialize();

	return 0;
}
</mscorlib.tlb></mscoree.h></shlwapi.h></windows.h></code>

[修改于 8年5个月前 - 2016/07/07 05:41:04]

来自:计算机科学 / 软件综合
0
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也

想参与大家的讨论?现在就 登录 或者 注册

所属专业
所属分类
上级专业
同级专业
acmilan
进士 学者 笔友
文章
461
回复
2934
学术分
4
2009/05/30注册,5年10个月前活动
暂无简介
主体类型:个人
所属领域:无
认证方式:邮箱
IP归属地:未同步
文件下载
加载中...
{{errorInfo}}
{{downloadWarning}}
你在 {{downloadTime}} 下载过当前文件。
文件名称:{{resource.defaultFile.name}}
下载次数:{{resource.hits}}
上传用户:{{uploader.username}}
所需积分:{{costScores}},{{holdScores}}下载当前附件免费{{description}}
积分不足,去充值
文件已丢失

当前账号的附件下载数量限制如下:
时段 个数
{{f.startingTime}}点 - {{f.endTime}}点 {{f.fileCount}}
视频暂不能访问,请登录试试
仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。
音频暂不能访问,请登录试试
支持的图片格式:jpg, jpeg, png
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}