zoukankan      html  css  js  c++  java
  • 与众不同 windows phone (48)

    [源码下载]


    与众不同 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
    [源码下载]

  • 相关阅读:
    双向循环链表
    字符串拷贝
    div样式调整.txt
    解析xml的单个节点值和循环节点消息体
    C++中的string
    正则表达式教程
    一个很好的Qt教程个人主页
    单射、双射与满射
    ISO C++ forbids declaration of * with no type
    一个中学生的个人主页
  • 原文地址:https://www.cnblogs.com/webabcd/p/3526422.html
Copyright © 2011-2022 走看看