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

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

[源码下载]

与众不同 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",0);
    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(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 <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,
        0,
        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(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

<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
[源码下载]

时间: 2024-11-08 22:22:57

与众不同 windows phone (48) - 8.0 其它: C# 调用 C++的相关文章

与众不同 windows phone (34) - 8.0 新的控件: LongListSelector

原文:与众不同 windows phone (34) - 8.0 新的控件: LongListSelector [源码下载] 与众不同 windows phone (34) - 8.0 新的控件: LongListSelector 作者:webabcd 介绍与众不同 windows phone 8.0 之 新的控件 新的控件 - LongListSelector 示例演示 LongListSelector 控件的应用 1.提供数据Controls/CityInfo.txt 101330101=澳

与众不同 windows phone (45) - 8.0 语音: TTS, 语音识别, 语音命令

原文:与众不同 windows phone (45) - 8.0 语音: TTS, 语音识别, 语音命令 [源码下载] 与众不同 windows phone (45) - 8.0 语音: TTS, 语音识别, 语音命令 作者:webabcd 介绍与众不同 windows phone 8.0 之 语音 TTS(Text To Speech) 语音识别 语音命令 示例1.演示 TTS(Text To Speech)的应用Speech/TTS.xaml <phone:PhoneApplicationP

与众不同 windows phone (40) - 8.0 媒体: 音乐中心的新增功能, 图片中心的新增功能, 后台音乐播放的新增功能

原文:与众不同 windows phone (40) - 8.0 媒体: 音乐中心的新增功能, 图片中心的新增功能, 后台音乐播放的新增功能 [源码下载] 与众不同 windows phone (40) - 8.0 媒体: 音乐中心的新增功能, 图片中心的新增功能, 后台音乐播放的新增功能 作者:webabcd 介绍与众不同 windows phone 8.0 之 媒体 添加音乐到音乐中心,从音乐中心删除音乐 与图片中心相关的新增功能 BackgroundAudioPlayer 的新增功能 示例

与众不同 windows phone (43) - 8.0 相机和照片: 镜头的可扩展性, 图片的可扩展性, 图片的自动上传扩展

原文:与众不同 windows phone (43) - 8.0 相机和照片: 镜头的可扩展性, 图片的可扩展性, 图片的自动上传扩展 [源码下载] 与众不同 windows phone (43) - 8.0 相机和照片: 镜头的可扩展性, 图片的可扩展性, 图片的自动上传扩展 作者:webabcd 介绍与众不同 windows phone 8.0 之 相机和照片 镜头的可扩展性 图片的可扩展性 图片的自动上传扩展 示例1.演示如何将本 app 注册为镜头扩展CameraAndPhoto/Len

与众不同 windows phone (41) - 8.0 相机和照片: 通过 AudioVideoCaptureDevice 捕获视频和音频

原文:与众不同 windows phone (41) - 8.0 相机和照片: 通过 AudioVideoCaptureDevice 捕获视频和音频 [源码下载] 与众不同 windows phone (41) - 8.0 相机和照片: 通过 AudioVideoCaptureDevice 捕获视频和音频 作者:webabcd 介绍与众不同 windows phone 8.0 之 相机和照片 通过 AudioVideoCaptureDevice 捕获视频和音频 示例演示 AudioVideoCa

与众不同 windows phone (36) - 8.0 新的瓷贴: FlipTile, CycleTile, IconicTile

原文:与众不同 windows phone (36) - 8.0 新的瓷贴: FlipTile, CycleTile, IconicTile [源码下载] 与众不同 windows phone (36) - 8.0 新的瓷贴: FlipTile, CycleTile, IconicTile 作者:webabcd 介绍与众不同 windows phone 8.0 之 新的瓷贴 FlipTileData - 翻转瓷贴.继承了 wp7 时代的 StandardTileData CycleTileDat

与众不同 windows phone (35) - 8.0 新的启动器: ShareMediaTask, SaveAppointmentTask, MapsTask, MapsDirectionsTask, MapDownloaderTask

原文:与众不同 windows phone (35) - 8.0 新的启动器: ShareMediaTask, SaveAppointmentTask, MapsTask, MapsDirectionsTask, MapDownloaderTask [源码下载] 与众不同 windows phone (35) - 8.0 新的启动器: ShareMediaTask, SaveAppointmentTask, MapsTask, MapsDirectionsTask, MapDownloaderT

与众不同 windows phone (37) - 8.0 文件系统: StorageFolder, StorageFile, 通过 Uri 引用文件, 获取 SD 卡中的文件

原文:与众不同 windows phone (37) - 8.0 文件系统: StorageFolder, StorageFile, 通过 Uri 引用文件, 获取 SD 卡中的文件 [源码下载] 与众不同 windows phone (37) - 8.0 文件系统: StorageFolder, StorageFile, 通过 Uri 引用文件, 获取 SD 卡中的文件 作者:webabcd 介绍与众不同 windows phone 8.0 之 文件系统 通过 StorageFolder 和

与众不同 windows phone (46) - 8.0 通信: Socket, 其它

原文:与众不同 windows phone (46) - 8.0 通信: Socket, 其它 [源码下载] 与众不同 windows phone (46) - 8.0 通信: Socket, 其它 作者:webabcd 介绍与众不同 windows phone 8.0 之 通信 Socket Demo 获取当前连接的信息 http rss odata socket bluetooth nfc voip winsock 示例1.演示 socket tcp 的应用(本例既做服务端又做客户端)Com