原文: 2、WindowsRuntimeComponent 项目MyRuntimeComponent.h 3、调用者CPP/Demo.xaml 二、演示如何在 C# 中调用 Windows Runtime Component(C++ & D3D),从而获取屏幕的分辨率1、WindowsRuntimeComponent 项目Helper.h 2、调用者CPP/GetResolution.xaml OK
重新想象 Windows 8 Store Apps (71) - 其它: C# 调用 C++
作者:介绍重新想象 Windows 8 Store Apps 之 其它 - C# 中调用 Windows Runtime Component(C++)
- 让 Windows Runtime Component(C++) 作为代理以调用 DLL(C++)
- 通过 C++ 和 D3D 获取屏幕分辨率
#pragma once// 用于演示 C# 调用 Windows Dynamic Link Library(C++) 中的函数(需要通过 Windows Runtime Component 做为代理)extern "C" _declspec(dllexport) int Add(int x, int y);
WindowsDll.cpp
#include "pch.h"#include "WindowsDll.h"// 注意:要想 C# 能调用此 dll,则必须要有以下这两行(wp8 则不需要)#include "winapifamily.h""#define WINAPI_FAMILY WINAPI_PARTITION_APPint Add(int x, int y){ return x + y;}
#pragma once#includenamespace WindowsRuntimeComponent{ public ref class MyRuntimeComponent sealed { public: // 用于演示 C# 调用 Windows Runtime Component(C++) 中的函数 int Add(int x, int y); // 用于演示通过此 Windows Runtime Component 做为代理,然后调用 Windows Dynamic Link Library(C++) 中的函数 typedef int(*myAdd)(int x, int y); int Add2(int i, int j); };}
MyRuntimeComponent.cpp
#include "pch.h"#include "MyRuntimeComponent.h"using namespace WindowsRuntimeComponent;int MyRuntimeComponent::Add(int x, int y){ return x + y;}// 作为代理,调用 WindowsDLL.dll 中的函数int MyRuntimeComponent::Add2(int i, int j){ HINSTANCE hDll = LoadPackagedLibrary(L"CPP/WindowsDLL.dll", 0); myAdd add = (myAdd)GetProcAddress(hDll, "Add"); int result = add(i, j); FreeLibrary(hDll); return result;}
CPP/Demo.xaml.cs
/* * 演示如何在 C# 中调用 Windows Runtime Component(C++),以及 Windows Runtime Component(C++) 如何作为代理调用 DLL(C++) * * * 注: * 1、Windows Runtime Component(C++) 项目参见:WindowsRuntimeComponent 项目 * 2、DLL(C++) 项目参见:WindowsDll 项目 * 3、将 PhoneDLL.dll 复制到本项目的根目录下,以便 WPRuntimeComponent 项目调用 */using System;using Windows.UI.Xaml.Controls;using Windows.UI.Xaml.Navigation;namespace XamlDemo.CPP{ public sealed partial class Demo : Page { public Demo() { this.InitializeComponent(); } protected override void OnNavigatedTo(NavigationEventArgs e) { // 引用 Windows Runtime Component 项目 WindowsRuntimeComponent.MyRuntimeComponent component = new WindowsRuntimeComponent.MyRuntimeComponent(); // 调用 Windows Runtime Component(C++) 中的函数 lblMsg.Text = "调用 Windows Runtime Component 中的函数:" + component.Add(10, 10).ToString(); lblMsg.Text += Environment.NewLine; // 调用 DLL(C++) 中的函数,方式:Windows Runtime Component(C++) 作为一个代理调用 DLL(C++),然后 C# 调用 Windows Runtime Component(C++) lblMsg.Text += "调用 Windows Runtime Component 中的函数(其仅作为一个代理,实际调用的是 WindowsDLL 中的函数):" + component.Add2(10, 10).ToString(); base.OnNavigatedTo(e); } }}
/* * 注意: * 由于需要 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 #include #include #include #include namespace DX{ inline void ThrowIfFailed(HRESULT hr) { if (FAILED(hr)) { // 抛出 DirectX API 的错误 throw Platform::Exception::CreateException(hr); } }}namespace WindowsRuntimeComponent{ 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#include using namespace Microsoft::WRL;using namespace Windows::Foundation;using namespace WindowsRuntimeComponent;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);}
CPP/GetResolution.xaml.cs
/* * 演示如何在 C# 中调用 Windows Runtime Component(C++ & D3D),从而获取屏幕的分辨率 * * * 注: * 用于获取屏幕分辨率的 Windows Runtime Component(C++ & D3D) 项目参见:WindowsRuntimeComponent 项目 */using Windows.Foundation;using Windows.UI.Xaml.Controls;using Windows.UI.Xaml.Navigation;namespace XamlDemo.CPP{ public sealed partial class GetResolution : Page { public GetResolution() { this.InitializeComponent(); } protected override void OnNavigatedTo(NavigationEventArgs e) { // 引用 C++ 项目,实例化 Helper 类 WindowsRuntimeComponent.Helper helper = new WindowsRuntimeComponent.Helper(); // 调用 Helper 中的属性,得到屏幕分辨率 Point screenResolution = helper.ScreenResolution; // 显示分辨率 lblMsg.Text = string.Format("分辨率:{0}×{1}", screenResolution.X.ToString(), screenResolution.Y.ToString()); base.OnNavigatedTo(e); } }}
posted on 2014-03-09 17:37 阅读( ...) 评论( ...)