重新想象 Windows 8 Store Apps (71) - 其它: C# 调用 C++
作者:webabcd
介绍
重新想象 Windows 8 Store Apps 之 其它
- C# 中调用 Windows Runtime Component(C++)
- 让 Windows Runtime Component(C++) 作为代理以调用 DLL(C++)
- 通过 C++ 和 D3D 获取屏幕分辨率
示例
一、演示如何在 C# 中调用 Windows Runtime Component(C++),以及 Windows Runtime Component(C++) 如何作为代理调用 DLL(C++)
1、WindowsDll 项目
WindowsDll.h
#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_APP int Add(int x, int y)
{
return x + y;
}
2、WindowsRuntimeComponent 项目
MyRuntimeComponent.h
#pragma once
#include <windows.h> namespace 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", );
myAdd add = (myAdd)GetProcAddress(hDll, "Add"); int result = add(i, j); FreeLibrary(hDll); return result;
}
3、调用者
CPP/Demo.xaml
<Page
x:Class="XamlDemo.CPP.Demo"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:XamlDemo.CPP"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"> <Grid Background="Transparent">
<StackPanel Margin="120 0 0 0"> <TextBlock Name="lblMsg" FontSize="14.667" TextWrapping="Wrap" /> </StackPanel>
</Grid>
</Page>
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(, ).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(, ).ToString(); base.OnNavigatedTo(e);
}
}
}
二、演示如何在 C# 中调用 Windows Runtime Component(C++ & D3D),从而获取屏幕的分辨率
1、WindowsRuntimeComponent 项目
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>
#include <d2d1_1.h>
#include <d2d1effects.h>
#include <dwrite_1.h>
#include <wincodec.h> 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<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>
#include <windows.ui.xaml.media.dxinterop.h> 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<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
<Page
x:Class="XamlDemo.CPP.GetResolution"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:XamlDemo.CPP"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"> <Grid Background="Transparent">
<StackPanel Margin="120 0 0 0"> <TextBlock Name="lblMsg" FontSize="14.667" TextWrapping="Wrap" /> </StackPanel>
</Grid>
</Page>
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);
}
}
}
OK
[源码下载]
重新想象 Windows 8 Store Apps (71) - 其它: C# 调用 C++的更多相关文章
- 重新想象 Windows 8 Store Apps 系列文章索引
[源码下载][重新想象 Windows 8.1 Store Apps 系列文章] 重新想象 Windows 8 Store Apps 系列文章索引 作者:webabcd 1.重新想象 Windows ...
- 重新想象 Windows 8 Store Apps (34) - 通知: Toast Demo, Tile Demo, Badge Demo
[源码下载] 重新想象 Windows 8 Store Apps (34) - 通知: Toast Demo, Tile Demo, Badge Demo 作者:webabcd 介绍重新想象 Wind ...
- 重新想象 Windows 8 Store Apps (35) - 通知: Toast 详解
[源码下载] 重新想象 Windows 8 Store Apps (35) - 通知: Toast 详解 作者:webabcd 介绍重新想象 Windows 8 Store Apps 之 通知 Toa ...
- 重新想象 Windows 8 Store Apps (36) - 通知: Tile 详解
[源码下载] 重新想象 Windows 8 Store Apps (36) - 通知: Tile 详解 作者:webabcd 介绍重新想象 Windows 8 Store Apps 之 通知 Tile ...
- 重新想象 Windows 8 Store Apps (37) - 契约: Settings Contract
[源码下载] 重新想象 Windows 8 Store Apps (37) - 契约: Settings Contract 作者:webabcd 介绍重新想象 Windows 8 Store Apps ...
- 重新想象 Windows 8 Store Apps (38) - 契约: Search Contract
[源码下载] 重新想象 Windows 8 Store Apps (38) - 契约: Search Contract 作者:webabcd 介绍重新想象 Windows 8 Store Apps 之 ...
- 重新想象 Windows 8 Store Apps (39) - 契约: Share Contract
[源码下载] 重新想象 Windows 8 Store Apps (39) - 契约: Share Contract 作者:webabcd 介绍重新想象 Windows 8 Store Apps 之 ...
- 重新想象 Windows 8 Store Apps (40) - 剪切板: 复制/粘贴文本, html, 图片, 文件
[源码下载] 重新想象 Windows 8 Store Apps (40) - 剪切板: 复制/粘贴文本, html, 图片, 文件 作者:webabcd 介绍重新想象 Windows 8 Store ...
- 重新想象 Windows 8 Store Apps (41) - 打印
[源码下载] 重新想象 Windows 8 Store Apps (41) - 打印 作者:webabcd 介绍重新想象 Windows 8 Store Apps 之 打印 示例1.需要打印的文档Pr ...
随机推荐
- 360随身WiFi驱动下载
一场不算太好的体验,但还是解决问题了 360随身WiFi驱动下载地址 事情经过: 某天在家里组装起PC,才发现当时没有在这屋里预留网线接口,走明线穿堂过户肯定是不合适的,还是买个无线网卡吧 自然还是要 ...
- 【Cocos2d-Js基础教学(4)cocostudio在cocos2dx-Js中的使用】
首先我们打开官方网站www.cocos2d-x.org,下载我们安装最新的cocostudio(cocos). 简介: Cocos Studio升级为cocos.更优秀的产品.更优质的服务.游戏开发一 ...
- Wtl之奇技淫巧篇:一、SDI如何居中显示视图
Wtl的sdi应用,视图默认铺满框架的客户区.视图通常用modeless对话框,所有的界面元素都拥挤在左上角,这明显很丑陋.我们尝试让视图居中显示,保持原始大小,这是个很典型的问题,看似简单,诸多细节 ...
- C++14 make code cleaner
在C++11中我们如果要写一个通过tuple实现函数调用的函数要这样写: template<int...> struct IndexTuple{}; template<int N, ...
- 网络存储-Samba、NAS---未知的用户名或错误密码
项目中的文件需要保存到网络存储设备中,之前用的是NAS.因没来得及采购就先用Samba顶上.代码发现通用…… 一.定义: Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件,由服务器 ...
- 锁屏上显示Activity
在Android中,有些比较强的提醒,需要用户紧急处理的内容.需要唤醒屏幕,甚至在锁定屏幕的情况下,也要显示出来.例如,来电界面和闹钟提醒界面.这是怎样实现的呢? 其实,实现起来非常简单.只要给Act ...
- ubuntu下搭建lamp
一.使用apt-get方式为Ubuntu安装PHP+MYSQL+Apache 分别执行如下命令: (1)安装MYSQL sudo apt-get install mysql-server ...
- Linux下MySQL不能远程访问
最近在Linux上装了个MySQL数据库,可是远程连接MySQL时总是报出erro 2003: Can't connect to MySQL server on '211.87.***.***' (1 ...
- CSS HACK 及常见问题
一.CSS常用hack 1.方式一:条件注释法 这种方式是IE浏览器专有的Hack方式,微软官方推荐使用的hack方式.举例如下 只在IE下生效 <!--[if IE]> 这段文字只在IE ...
- linux 环境变量设置及查看
1. 显示环境变量HOME $ echo $HOME /home/redbooks 2. 设置一个新的环境变量hello $ export HELLO="Hello!" $ ech ...