博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
与众不同 windows phone (48) - 8.0 其它: C# 调用 C++
阅读量:5750 次
发布时间:2019-06-18

本文共 6754 字,大约阅读时间需要 22 分钟。

原文:

与众不同 windows phone (48) - 8.0 其它: C# 调用 C++

作者:
介绍
与众不同 windows phone 8.0 之 其它

  • C# 中调用 Windows Phone Runtime Component(C++)
  • 让 Windows Phone Runtime Component(C++) 作为代理以调用 DLL(C++)
  • 通过 C++ 和 D3D 获取屏幕分辨率

示例
一、演示如何在 C# 中调用 Windows Phone Runtime Component(C++),以及 Windows Phone Runtime Component(C++) 如何作为代理调用 DLL(C++)
1、PhoneDLL 项目
PhoneDLL.h

#pragma once// 用于演示 C# 调用 Windows Phone Dynamic Link Library(C++) 中的函数(需要通过 Windows Phone Runtime Component 做为代理)extern "C" _declspec(dllexport) int Add(int x, int y);

PhoneDLL.cpp

#include "pch.h"#include "PhoneDLL.h"int Add(int x, int y) {     return x + y;}

2、WPRuntimeComponent 项目
WPRuntimeComponent.h

#pragma once#include 
using namespace Platform;namespace WPRuntimeComponent{ public ref class WindowsPhoneRuntimeComponent sealed { public: // 用于演示 C# 调用 Windows Phone Runtime Component(C++) 中的函数 int Add(int x,int y); // 用于演示通过此 Windows Phone Runtime Component 做为代理,然后调用 Windows Phone Dynamic Link Library(C++) 中的函数 typedef int(*myAdd)(int x,int y); int Add2(int i,int j); };}

WPRuntimeComponent.cpp

#include "pch.h"#include "WPRuntimeComponent.h"using namespace WPRuntimeComponent;using namespace Platform;int WindowsPhoneRuntimeComponent::Add(int x, int y){    return x + y;}// 作为代理,调用 PhoneDLL.dll 中的函数int WindowsPhoneRuntimeComponent::Add2(int i,int j){    HINSTANCE hDll = LoadPackagedLibrary(L"PhoneDLL.dll",0);    myAdd add = (myAdd)GetProcAddress(hDll, "Add");    int result = add(i, j);    FreeLibrary(hDll);    return result;}

3、调用者
CPP/Demo.xaml

CPP/Demo.xaml.cs

/* * 演示如何在 C# 中调用 Windows Phone Runtime Component(C++),以及 Windows Phone Runtime Component(C++) 如何作为代理调用 DLL(C++) *  *  * 注: * 1、Windows Phone Runtime Component(C++) 项目参见:WPRuntimeComponent 项目 * 2、DLL(C++) 项目参见:PhoneDLL 项目 * 3、将 PhoneDLL.dll 复制到本项目的根目录下,以便 WPRuntimeComponent 项目调用 */using System;using System.Windows.Navigation;using Microsoft.Phone.Controls;namespace Demo.CPP{    public partial class Demo : PhoneApplicationPage    {        public Demo()        {            InitializeComponent();        }        protected override void OnNavigatedTo(NavigationEventArgs e)        {            // 引用 Windows Phone Runtime Component 项目            WPRuntimeComponent.WindowsPhoneRuntimeComponent component = new WPRuntimeComponent.WindowsPhoneRuntimeComponent();            // 调用 Windows Phone Runtime Component(C++) 中的函数            lblMsg.Text = "调用 Windows Phone Runtime Component 中的函数:" + component.Add(10, 10).ToString();            lblMsg.Text += Environment.NewLine;            // 调用 DLL(C++) 中的函数,方式:Windows Phone Runtime Component(C++) 作为一个代理调用 DLL(C++),然后 C# 调用 Windows Phone Runtime Component(C++)            lblMsg.Text += "调用 Windows Phone Runtime Component 中的函数(其仅作为一个代理,实际调用的是 PhoneDLL 中的函数):" + component.Add2(10, 10).ToString();            base.OnNavigatedTo(e);        }    }}

二、演示如何在 C# 中调用 Windows Phone Runtime Component(C++ & D3D),从而获取屏幕的分辨率
1、WPRuntimeComponent 项目
Helper.h

/** 注意:* 由于需要 D3D,所以需要在 项目属性 -> 配置属性 -> 链接器 -> 输入 -> 附加依赖项 中增加“d3d11.lib”** 参考:* http://blogs.microsoft.co.il/blogs/tomershamam/archive/2012/07/24/get-screen-resolution-in-windows-8-metro-style-application.aspx*/#pragma once#include 
#include
namespace DX{ inline void ThrowIfFailed(HRESULT hr) { if (FAILED(hr)) { // 抛出 DirectX API 的错误 throw Platform::Exception::CreateException(hr); } }}namespace WPRuntimeComponent{ public ref class Helper sealed { public: Helper(); // 一个属性,用于得到屏幕分辨率 property Windows::Foundation::Point ScreenResolution { Windows::Foundation::Point get(); } private: D3D_FEATURE_LEVEL m_featureLevel; Microsoft::WRL::ComPtr
m_d3dDevice; };}

Helper.cpp

/** 注意:* 由于需要 D3D,所以需要在 项目属性 -> 配置属性 -> 链接器 -> 输入 -> 附加依赖项 中增加“d3d11.lib”** 参考:* http://blogs.microsoft.co.il/blogs/tomershamam/archive/2012/07/24/get-screen-resolution-in-windows-8-metro-style-application.aspx*/#include "pch.h"#include "Helper.h"#include 
using namespace Microsoft::WRL;using namespace Windows::Foundation;using namespace WPRuntimeComponent;using namespace Platform;Helper::Helper(){ UINT creationFlags = D3D11_CREATE_DEVICE_BGRA_SUPPORT;#if defined(_DEBUG) creationFlags |= D3D11_CREATE_DEVICE_DEBUG;#endif D3D_FEATURE_LEVEL featureLevels[] = { D3D_FEATURE_LEVEL_11_1, D3D_FEATURE_LEVEL_11_0, D3D_FEATURE_LEVEL_10_1, D3D_FEATURE_LEVEL_10_0, D3D_FEATURE_LEVEL_9_3, D3D_FEATURE_LEVEL_9_2, D3D_FEATURE_LEVEL_9_1 }; ComPtr
device; ComPtr
context; DX::ThrowIfFailed( D3D11CreateDevice( nullptr, D3D_DRIVER_TYPE_HARDWARE, 0, creationFlags, featureLevels, ARRAYSIZE(featureLevels), D3D11_SDK_VERSION, &device, &m_featureLevel, &context ) ); DX::ThrowIfFailed(device.As(&m_d3dDevice));}// 获取屏幕分辨率Point Helper::ScreenResolution::get(){ ComPtr
dxgiDevice; DX::ThrowIfFailed(m_d3dDevice.As(&dxgiDevice)); ComPtr
dxgiAdapter; DX::ThrowIfFailed(dxgiDevice->GetAdapter(&dxgiAdapter)); IDXGIOutput * pOutput; if (dxgiAdapter->EnumOutputs(0, &pOutput) != DXGI_ERROR_NOT_FOUND) { DXGI_OUTPUT_DESC desc; pOutput->GetDesc(&desc); return Point(desc.DesktopCoordinates.right, desc.DesktopCoordinates.bottom); } return Point(0, 0);}

2、调用者
CPP/GetResolution.xaml

CPP/GetResolution.xaml.cs

/* * 演示如何在 C# 中调用 Windows Phone Runtime Component(C++ & D3D),从而获取屏幕的分辨率 *  *  * 注: * 用于获取屏幕分辨率的 Windows Phone Runtime Component(C++ & D3D) 项目参见:WPRuntimeComponent 项目 */using System.Windows.Navigation;using Microsoft.Phone.Controls;using Windows.Foundation;namespace Demo.CPP{    public partial class GetResolution : PhoneApplicationPage    {        public GetResolution()        {            InitializeComponent();        }        protected override void OnNavigatedTo(NavigationEventArgs e)        {            // 引用 C++ 项目,实例化 Helper 类            WPRuntimeComponent.Helper helper = new WPRuntimeComponent.Helper();            // 调用 Helper 中的属性,得到屏幕分辨率            Point screenResolution = helper.ScreenResolution;            // 显示分辨率            lblMsg.Text = string.Format("分辨率:{0}×{1}", screenResolution.X.ToString(), screenResolution.Y.ToString());            base.OnNavigatedTo(e);        }    }}

OK

转载地址:http://lrhzx.baihongyu.com/

你可能感兴趣的文章
Spring Transactional
查看>>
shell脚本实例
查看>>
我的友情链接
查看>>
Windows Phone 7 隔离存储空间资源管理器
查看>>
Microsoft Excel 2000/2003修复工具
查看>>
apache安装报错undefined reference ssl
查看>>
关于爱情只有一句忠告
查看>>
CentOS 7下安装部署Oracle11g图文教程
查看>>
F#初学笔记06
查看>>
实战:将企业域名解析委派给企业DNS服务器
查看>>
在Lync 2013环境部署Office Web Apps
查看>>
微软大会Ignite,你准备好了么?
查看>>
读书笔记-高标管事 低调管人
查看>>
Master带给世界的思考:是“失控”还是进化
查看>>
用户和开发者不满苹果iCloud问题多多
查看>>
java.lang.UnsatisfiedLinkError:no dll in java.library.path终极解决之道
查看>>
我的工具:文本转音频文件
查看>>
【许晓笛】从零开始运行EOS系统
查看>>
【跃迁之路】【460天】程序员高效学习方法论探索系列(实验阶段217-2018.05.11)...
查看>>
C++入门读物推荐
查看>>