与众不同 windows phone (48) - 8.0 其它: C# 调用 C++
作者:webabcd
介绍
与众不同 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 <windows.h> 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",);
myAdd add = (myAdd)GetProcAddress(hDll, "Add"); int result = add(i, j); FreeLibrary(hDll); return result;
}
3、调用者
CPP/Demo.xaml
<phone:PhoneApplicationPage
x:Class="Demo.CPP.Demo"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
FontFamily="{StaticResource PhoneFontFamilyNormal}"
FontSize="{StaticResource PhoneFontSizeNormal}"
Foreground="{StaticResource PhoneForegroundBrush}"
SupportedOrientations="Portrait" Orientation="Portrait"
mc:Ignorable="d"
shell:SystemTray.IsVisible="True"> <Grid Background="Transparent">
<StackPanel> <TextBlock x:Name="lblMsg" TextWrapping="Wrap" /> </StackPanel>
</Grid> </phone:PhoneApplicationPage>
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(, ).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(, ).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 <wrl/client.h>
#include <d3d11_1.h> 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<ID3D11Device1> 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 <agile.h> 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<ID3D11Device> device;
ComPtr<ID3D11DeviceContext> context;
DX::ThrowIfFailed(
D3D11CreateDevice(
nullptr,
D3D_DRIVER_TYPE_HARDWARE,
,
creationFlags,
featureLevels,
ARRAYSIZE(featureLevels),
D3D11_SDK_VERSION,
&device,
&m_featureLevel,
&context
)
); DX::ThrowIfFailed(device.As(&m_d3dDevice));
} // 获取屏幕分辨率
Point Helper::ScreenResolution::get()
{
ComPtr<IDXGIDevice> dxgiDevice;
DX::ThrowIfFailed(m_d3dDevice.As(&dxgiDevice)); ComPtr<IDXGIAdapter> dxgiAdapter;
DX::ThrowIfFailed(dxgiDevice->GetAdapter(&dxgiAdapter)); IDXGIOutput * pOutput;
if (dxgiAdapter->EnumOutputs(, &pOutput) != DXGI_ERROR_NOT_FOUND)
{
DXGI_OUTPUT_DESC desc;
pOutput->GetDesc(&desc);
return Point(desc.DesktopCoordinates.right, desc.DesktopCoordinates.bottom);
} return Point(, );
}
2、调用者
CPP/GetResolution.xaml
<phone:PhoneApplicationPage
x:Class="Demo.CPP.GetResolution"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
FontFamily="{StaticResource PhoneFontFamilyNormal}"
FontSize="{StaticResource PhoneFontSizeNormal}"
Foreground="{StaticResource PhoneForegroundBrush}"
SupportedOrientations="Portrait" Orientation="Portrait"
mc:Ignorable="d"
shell:SystemTray.IsVisible="True"> <Grid Background="Transparent">
<StackPanel> <TextBlock x:Name="lblMsg" TextWrapping="Wrap" /> </StackPanel>
</Grid> </phone:PhoneApplicationPage>
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
[源码下载]
与众不同 windows phone (48) - 8.0 其它: C# 调用 C++的更多相关文章
- 与众不同 windows phone (34) - 8.0 新的控件: LongListSelector
[源码下载] 与众不同 windows phone (34) - 8.0 新的控件: LongListSelector 作者:webabcd 介绍与众不同 windows phone 8.0 之 新的 ...
- 与众不同 windows phone (35) - 8.0 新的启动器: ShareMediaTask, SaveAppointmentTask, MapsTask, MapsDirectionsTask, MapDownloaderTask
[源码下载] 与众不同 windows phone (35) - 8.0 新的启动器: ShareMediaTask, SaveAppointmentTask, MapsTask, MapsDirec ...
- 与众不同 windows phone (36) - 8.0 新的瓷贴: FlipTile, CycleTile, IconicTile
[源码下载] 与众不同 windows phone (36) - 8.0 新的瓷贴: FlipTile, CycleTile, IconicTile 作者:webabcd 介绍与众不同 windows ...
- 与众不同 windows phone (37) - 8.0 文件系统: StorageFolder, StorageFile, 通过 Uri 引用文件, 获取 SD 卡中的文件
[源码下载] 与众不同 windows phone (37) - 8.0 文件系统: StorageFolder, StorageFile, 通过 Uri 引用文件, 获取 SD 卡中的文件 作者:w ...
- 与众不同 windows phone (38) - 8.0 关联启动: 使用外部程序打开一个文件或URI, 关联指定的文件类型或协议
[源码下载] 与众不同 windows phone (38) - 8.0 关联启动: 使用外部程序打开一个文件或URI, 关联指定的文件类型或协议 作者:webabcd 介绍与众不同 windows ...
- 与众不同 windows phone (39) - 8.0 联系人和日历
[源码下载] 与众不同 windows phone (39) - 8.0 联系人和日历 作者:webabcd 介绍与众不同 windows phone 8.0 之 联系人和日历 自定义联系人存储的增删 ...
- 与众不同 windows phone (40) - 8.0 媒体: 音乐中心的新增功能, 图片中心的新增功能, 后台音乐播放的新增功能
[源码下载] 与众不同 windows phone (40) - 8.0 媒体: 音乐中心的新增功能, 图片中心的新增功能, 后台音乐播放的新增功能 作者:webabcd 介绍与众不同 windows ...
- 与众不同 windows phone (41) - 8.0 相机和照片: 通过 AudioVideoCaptureDevice 捕获视频和音频
[源码下载] 与众不同 windows phone (41) - 8.0 相机和照片: 通过 AudioVideoCaptureDevice 捕获视频和音频 作者:webabcd 介绍与众不同 win ...
- 与众不同 windows phone (42) - 8.0 相机和照片: 通过 PhotoCaptureDevice 捕获照片
[源码下载] 与众不同 windows phone (42) - 8.0 相机和照片: 通过 PhotoCaptureDevice 捕获照片 作者:webabcd 介绍与众不同 windows pho ...
随机推荐
- 关于 Enum.TryParse 方法的一个小坑…
今天在测试导入数据的时候,突然发现本应该是枚举内容的数据,导入了进了一个很大的不在枚举定义内的数字. 记得当时用的是 Enum.TryParse 方法对导入的文本进行校验的,于是调试了一下,发现果然是 ...
- C#下水晶报表打印自定义纸张
在VB6中,如果要自定义纸张很方便: Rpt.PaperSize = crPaperUser Rpt.SetUserPaperSize lZZG, lZZK 但在C#中却不行了,没有发现 SetU ...
- 介绍几个工作开发中封装的好用的android自定义控件
首先看效果图, 看下这两个界面,第一个中用到了一个自定义的FlowRadioGroup,支持复合子控件,自定义布局: 第二个界面中看到了输入的数字 自动4位分割了吧:也用到了自定义的DivisionE ...
- getRequestURI,getRequestURL的区别
转自:http://www.cnblogs.com/JemBai/archive/2010/11/10/1873764.html test1.jsp======================= &l ...
- CSS基础(五):定位
CSS定位机制 CSS 有三种基本的定位机制:相对定位.浮动和绝对定位. 相对定位 相对定位指的是设置为相对定位的元素框会偏移某个距离.元素仍然保持其未定位前的形状,它原本所占的空间仍保留. 如果将b ...
- C# 实现字符串去重
方法一 注:需要.net 3.5框架的支持 string s = "101,102,103,104,105,101,102,103,104,105,106,107,101,108" ...
- 一次受限于操作系统进程数的OOM
在64bit机上跑应用,结果进程刚起来就挂,就刚起来就挂..还OOM,还fork不出新进程,尼玛,这什么情况? 1. 如果是应用层面OOM,那么不应该任何命令都不被执行了,不应该OS直接crash掉. ...
- linux下mysql的root密码忘记解决方法
1.首先确认服务器出于安全的状态,也就是没有人能够任意地连接MySQL数据库. 因为在重新设置MySQL的root密码的期间,MySQL数据库完全出于没有密码保护的 状态下,其他的用户也可以任意地登录 ...
- VMware三个版本workstation、server、esxi的区别
VMware三个版本 workstation: 单机级,用在个人桌面系统中,需要操作系统支持 servier:工作组级,用于服务器,需要操作系统支持 esxi:企业级,用于服务器,不需要操作系统支持 ...
- js 获取时间比较全,留备用(zhuan)
var myDate = new Date(); myDate.getYear(); //获取当前年份(2位) myDate.getFullYear(); //获取完整的年份(4位 ...