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

  • 相关阅读:
    【Android Developers Training】 73. 布局变化的动画
    【Android Developers Training】 72. 缩放一个视图
    【Android Developers Training】 71. 显示翻牌动画
    svn更改地址怎么办
    python学习手册
    failed to bind pixmap to texture
    Ubuntu 12.04安装Google Chrome
    svn update 时总是提示 Password for '默认密钥' GNOME keyring: 输入密码
    重设SVN 的GNOME keyring [(null)] 的密码
    Nginx + uWSGI + web.py 搭建示例
  • 原文地址:https://www.cnblogs.com/webabcd/p/3526422.html
Copyright © 2011-2022 走看看