青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

C++ Coder

HCP高性能計算架構,實現,編譯器指令優化,算法優化, LLVM CLANG OpenCL CUDA OpenACC C++AMP OpenMP MPI

C++博客 首頁 新隨筆 聯系 聚合 管理
  98 Posts :: 0 Stories :: 0 Comments :: 0 Trackbacks

#

     摘要: http://www.cnblogs.com/linzheng/archive/2012/06/30/2571281.html Windows 8 的metro風格應用程序的開發編程和Windows phone 7是非常類似的,不過Windows 8對開發語言的支持是比Windows Phone 7強大很多,支持C++,C#和JavaScript,而Windows Phone 7只是支持C#,當...  閱讀全文
posted @ 2012-10-29 21:35 jackdong 閱讀(473) | 評論 (0)編輯 收藏


    看了個BUILD的PPT,Windows Runtime (RT)并不是一些新聞網站說的那樣微軟自廢.NET武功,而是恰恰相反,WinRT是Win32API的現代版,其中有很深的.NET的基因,是Metro UI的.NET基礎,如果考察Metadata的變化,WinRT的API定義的元數據是基于標準ECMA 335,也就是.NET的標準 ,WinRT也是一個沙箱的環境,針對AppStore環境設計的。

基礎知識

微軟以推出Windows 8為契機,以解決Windows長期存在的問題,并帶來了新的用戶界面,使得Windows更加安全和AppStore的商業模式。微軟在Windows 8 里打造了第三個 XAML-based UI 系統, WPF只是一個供 .NET 這個圈子使用的XAML UI系統 Silverlight只是給瀏覽器使用的XAML UI系統,Windows Phone7將Silverlight到了手機,現在將XAML帶到了涵蓋PC、Pad、Phone的所有系統(雖然微軟認為平板也是PC,我還是想叫他Pad,用過iPad的都知道蘋果所定義的Pad和PC有很大區別)。

.NET開發人員都對.NET 的P / Invoke和COM Interop 很熟悉了,這兩種技術使得.NET人員可以使用Win32 API和COM組件,Mono也是使用P/Invoke技術創建原生的庫,例如Gtk# 綁定到 Gtk+ API, MonoMac 綁定到Cocoa API, Qyoto 綁定到Qt API,Mono出現了MonoTouch,MonoDroid和MonoMac等等很有創新性的產品。 COM Interop 還可以使得C/C++ 從 C#導入Com類型庫。

創建原生庫的方法很多,但是這些工作都得是手工去做,很乏味而且容易出錯,從這點來說WinRT也是一個很有創新的,可以讓所有的開發者用同一個模型創建Metro UI的應用。

WinRT

WinRT是一個新的API 集合,具有以下特性:

  • 它實現了Metro UI規范的UI庫
  • 為Windows開發人員提供一個簡單的UI編程模型,你不需要學習Win32API的那些復雜的API了
  • 它使用XAML-base的UI系統
  • API都設計成了異步的
  • 它和.NET一樣是個沙箱的API,自成體系,用于創建AppStore上的應用程序。
  • API的元數據格式是ECMA335,和.NET一樣的標準。這是不是意味著以后Mono也可以在xUnit上去實現這樣的API呢?

WinRT包裝的新的用戶界面系統,和Win32API一樣是Com的上層。

WinRT Projections

我們所說的“Binding”,微軟現在叫做“Projections”,又是一個新名詞。Projections就是向三個環境 Native (C and C++), HTML/Javascript 和.NET 暴露接口的過程。所以在Win8上各類開發者依然可以用著不同的工具,但是卻是使用著統一的模型。

如果開發者使用.NET或者C++ 寫的組件,它的API被存儲在一個WinMD文件里,你可以在三種環境(原生、javascript和.NET)。即使你的組件是用C++ 寫的,也不需要通過COM向外暴露,使用起來更像是一個面向對象的C++ API。

WinRT的底層定義了一套基本的類型和各種環境的映射,這是不是很像.NET環境里面對不同語言的支持哈。

異步API

微軟認為,當給開發者一個使用同步和異步的API的選擇的時候,開發者會選擇簡單的同步API,這在我們的.NET 編程實踐中得到證明,.NET有很成熟的異步編程模型,還有特意為并行和異步處理而設計的F#,結果是什么呢,各位同學心里有數。

在WinRT中,微軟一直遵循一個簡單的規則:如果一個API預計耗時超過50毫秒,那么API就是異步的,也就是說API是異步的哦,這樣就能確保Metro UI上的操作體驗是最好的。

異步編程歷來是一個繁瑣的過程,回調和狀態,還有異常處理等。為了簡化這個過程,C#和VB也擴展了支持 F#-inspired await/async 模型,異步編程變成了歡樂之旅。

.NET的首要地位不見了嗎?

之前的新聞中一直在質疑.NET 被微軟拋棄了,當然不是了。也不是所有的.NET API 都集成到了WinRT中,只是一個子集。

當你使用C#和VB,你使用的是完整的.NET框架。但是他們只暴露了一個較小的子集API給Windows 8的開發者。你可能會想,我可以通過一些技巧使用到整個.NET,如果你的程序不需要提交AppStore上接受微軟的審核,這是可以的。這種策略明顯是跟蘋果學的。

借此機會.NET團隊也對.NET做了一次清理,mscorlib.dll和System.dll中已被分割在不同的庫里頭了,隨著Win8發布的.NET版本是4.5了,也就是說.NET 4.5不是.NET 4的簡單補丁包,里頭加了不少東西,ASP.NET的版本號也是4.5,不像.NET 2.0 ~3.5 SP1,ASP.net的版本還是2。0。為了在Win8里開發,開始學習.NET 4.5又是必須的了,這里關注的集中在客戶端開發,同樣的在服務器端開發方面.NET 4.5也加入大量的干貨。

創建WinRT 組件

雖然WinRT支持很多的語言,但是微軟只是用C++和.NET演示了如何開發一個WinRT組件,使用.NET來開發WinRT組件會比C++簡單得多。也不是所有的.NET特性都能用上哦,比如組件類就不能使用private 字段,在異步的API里不能使用Task<T> ,要用IAsyncOperation 代替。

public sealed class AddTwo
{
public int Add (int a, int b)
{
return a + b;
}

public async IAsyncOperation SubAsync (int a, int b)
{
return a - await (CountEveryBitByHand (b));
}
}

你會發現上述代碼沒有任何形式的COM聲明,唯一限制的是,類必須是個密封的(除非你是在創建一個XAML UI組件,這種情形下這種限制是接觸的)

UI編程

當涉及到用戶界面的開發的時候,你你可以使用HTML與CSS樣式或使用XAML的你的應用程序的用戶界面。當你回到界面層,就可以用HTML & CSS或者是XAML UI,用HTML& Css做出來的界面就是Web了,而是一個Windows應用,早在Vista開始就有了類似的應用,Windows7上做了改進,叫做Gadgets ,Windows 8就進化到了Metero UI,和C++、.NET并駕齊驅了。

Windows8的開發框架并沒有基于HTML5和JavaScript,開發者完全可以用原生C++、C#和Silverlight去開發對平板和觸控友好的應用,HTML5和JavaScript只是提供了一種選擇。

作者: 自由、創新、研究、探索……
出處:http://shanyou.cnblogs.com/
版權:本文版權歸作者和博客園共有
轉載:歡迎轉載,為了保存作者的創作熱情,請按要求【轉載】,謝謝
要求:未經作者同意,必須保留此段聲明;必須在文章中給出原文連接;否則必究法律責任
posted @ 2012-10-29 21:30 jackdong 閱讀(560) | 評論 (0)編輯 收藏

 英文原文:C# and Visual Basic on the WinRT API

  (作者:Jonathan Allen 譯者:侯伯薇

  盡管我們可以使用 .NET 語言來調用 Win32 API,但那樣做會很困難。所以在過去的兩年間微軟一直在構建替代的方案,它就是實現了跨語言支持的 Windows 運行時,即 WinRT。我們可以在 C++ 和 .NET 中創建 WinRT 組件,并且可由二者以及 JavaScript 使用。

  盡管 COM 在表面上是一種基于 OOP 的框架,但它與 .NET 之間有很大的區別。在 WinRT 出現之前,COM 是基于接口而不是基于類的。這意味著其中缺少很多 .NET 開發者認為應該有的內容,像構造函數以及靜態方法等。C++組件擴展解決了這個問題。

  WinRT 形式的 COM 使用的元數據格式和通用語言運行時(Common Language Runtime)相同。這些信息存儲在表示結構的 WINMD 文件中,盡管沒有實現,但在所有公有類中都會有。FXCop 被用于檢驗這些文件所暴露的 API 是否遵循 .NET Framework 的設計指南。

  .NET 在最開始時就有“API 設計委員會(API Design Board)”。受此啟發,Windows 運行時也會建立 API 設計委員會來對其進行管理。很多最初的成員都在 .NET 委員會中,并且很多指南都直接來自于 .NET 基本類庫所遵循的原則。

  Windows 運行時會返回 HRESULT,而不會拋出異常。對于眾所周知的 HRESULT 值來說,會拋出相應的異常,而對于其他值就只能拋出 COMException。

  WinRT 的 IAsyncOperation 接口現在使用新的 async/await 關鍵字,就像 .NET 的 Task 對象一樣。

  所有 Windows 運行時的集合接口都被映射到 .NET 框架的等價物上。在 .NET 4.5中添加了 IReadOnlyList 和 IReadOnlyDictionary,用來負責處理 WinRT 中的只讀集合。

  WinRT 和 .NET API 在兩個地方無法匹配。WinRT 的 stream 無法直接與 .NET 的 IO.Stream 類兼容,但是可以調用名為 AsStream 的擴展方法來進行轉換。WinRT 還擁有名為 IBuffer 的接口,這在 .NET 中也無法簡單地實現。在此也有一個擴展方法來進行 IBuffer 和比特數組之間的轉換。

  我們可以使用 C# 和 VB 來創建新的 Windows 運行時程序庫,過程非常簡單。為了把類暴露為 Windows 運行時組件,我們只需要把項目類型設置為“WINMD 文件”,并確保遵循以下規則:

  1. API 簽名只使用 Windows 運行時的類型
  2. 結構體只能擁有公有的數據字段
  3. 只允許對 XAML 控件使用繼承,其它類型都必須使用 sealed 關鍵字。
  4. 只支持內建的泛型

  編譯這些庫之后,我們就可以在 C++ 和 JavaScript 中調用它們,就像從 .NET 中調用一樣簡單。

  警告

  由于 WinRT 是基于 COM 構建的,所以你同樣會有引用計數和 mark-and-sweep 垃圾回收器之間無法融合的問題。對于實現了析構函數釋放非內存資源的對象來說,這是最常見的問題。我們可以考慮調用“Marshal.FinalReleaseComObject”來解決問題,但是那本身也存在問題。

  COM 風格的 marshaling 需要在 .NET 和本地組件之間調用。盡管這通常是無關緊要的,但是如果 API 非常不正式,那么就會出現問題。

  內建的 WinRT 庫(而不是 XAML)是在 Metro 運行時環境之外提供的。然而,第三方的 WinRT 庫并非如此。這是 WinRT 中激活框架(activation framework)的限制,而不是 .NET 的問題。

posted @ 2012-10-29 21:27 jackdong 閱讀(277) | 評論 (0)編輯 收藏

http://www.ithov.com/article/118831.shtml

對于 Windows 8,我們徹底顛覆改造了平臺,您可以選擇您已了解的編程語言和技術來構建為設備和外形因素定制的應用。而對于 Windows 運行時,您甚至可以在單一應用中輕松地使用多種語言。通過使用 C++ 來構建您自有的 Windows 運行時組件,您可以通過可與 Xbox 360 控制器交互的 HTML 和 JavaScript 來構建出色的 Metro 風格應用。您可以構建通過 Windows 運行時組件公開的可重用 XAML 控件,這些控件可供使用 C++ 和 C# 編寫的 Metro 風格應用即時使用。實質上,我們已允許您在 Windows 8 平臺上使用您選擇的語言并以毫不遷就的方式來構建應用。

在本篇博文中,我們將討論構建 Windows 運行時組件所需了解的必要知識。

基礎知識

Windows 運行時是實現語言選擇的核心。它自身是公開的,從而您可以從 JavaScript、C++、C# 和 Visual Basic 中以自然而熟悉的方式對其進行調用。這種基礎方法也同樣適用于構建您自有的 API。

您在應用中構建和打包的 Windows 運行時組件通常被稱作第三方 Windows 運行時組件。這與已作為 Windows 8 平臺中一部分的第一方組件有所不同。您可以使用 C++、C# 或 Visual Basic 編寫這些第三方 Windows 運行時組件。您可以從任何位置調入它們公開的 API,包括打包到您的應用中的其他 Windows 運行時組件。您也可以使用任何語言來調入通過 Windows 運行時組件公開的 API。

您為應用編寫的 Windows 運行時組件可使用 Windows 運行時 API、Win32、COM、.NET API 或第三方庫(只要它們支持 Metro 風格應用開發)。請注意您所構建的 Windows 運行時組件與傳統意義上公開 API 的 C++ DLL 或 .NET 程序集并不相同。使用 .Net 創建類庫或者使用 C++ 創建獨立的 DLL 與構建 Windows 運行時組件完全不同。Windows 運行時組件在公開 Windows 運行時元數據的 .wnmd 文件中聲明,并且允許 JavaScript 等語言來自然地使用 Windows 運行時 API(例如,向 JavaScript 公開的 API 的 pascalCasedNames 支持)。Windows 運行時元數據還允許 Visual Studio 提供出色的工具功能,如 IntelliSense 支持。

為何要構建您自有的 Windows 運行時組件

創建 Windows 運行時組件可幫助您對可重用性和語言互操作性進行設計。我們來看一下展示如何使用第三方 Windows 運行時組件來構建更佳體驗的一些應用程序方案。


在您的 Metro 風格應用中使用 Win32 和 COM API

Internet Explorer 10 提供的平臺允許您使用 HTML、CSS 和 JavaScript 創建出色的 Metro 風格應用體驗。但是,如果您已使用 HTML5 Canvas 構建游戲,并希望與 Windows 的 Xbox 360 控制器相集成,那情況會怎樣?允許應用從控制器接收輸入的 XInput API 會將不可用的 Win32 API 直接向 JavaScript 公開。

這是通過創建 Windows 運行時組件來解決該問題并使您能夠在基于 HTML 的 Metro 風格應用中使用 XInput API 的經典示例。XInput 和 JavaScript 控制器草圖示例準確地展現了這一點。該示例應用包含一個游戲控制器 Windows 運行時組件,它使用 C++ 編寫并用于包裝 XInput API 公開的功能。該控制器草圖基于 HTML 的應用使用游戲控制器 C++ Windows 運行時組件來實現與 Xbox 360 控制器的交互。

這一方案(無法單獨使用 HTML 和 JavaScript 實現)是通過創建第三方 Windows 運行時組件來完成通過其他方法無法完成的復雜方案的完美示例。

大計算量的操作

為諸如科學、工程和地圖/地理等字段創建應用通常需要大計算量的操作。這些大量的操作通常需要強大的并行處理且非常適合于使用 C++ 獲得最佳性能。在開發 Bing 地圖旅行優化器(使用 JavaScript 和 C++ 開發的 Metro 風格應用)中,我們看到了另一種方案,即使用 C++ 創建 Windows 運行時組件使我們可以創建最佳的應用體驗。

您可能會考慮為何用戶完全使用本地數據計算旅行路線,而他們可以在云端的 Bing 服務器上運行這種大計算量的操作。Bing 地圖為公開執行此操作的 JavaScript API,而有時應用必須脫機運行。另外,我們也希望用戶通過觸控實時拖動和更改路線。如果我們在本地運行此類大量的操作,則我們需要創建甚至更好的體驗。

通過使用并行任務類庫而用 C++ 編寫大計算量的操作,我們可以利用客戶端的強大功能來為用戶創建出色的使用體驗。Windows 運行時可完美適用于該方案,它允許我們使用 Bing 地圖 AJAX 控件來創建使用 HTML 和 JavaScript 的豐富用戶界面 (UI),而使用 C++ 代碼運行的所有大量路線操作可通過并行計算提高計算的速度。


社區中擁有著大量而出色的庫,開發人員已進行匯總并與廣大用戶共享。在過去,您可能會認為重用其中的一些庫可能很具挑戰性,如果它們與實現您的應用的編程語言不匹配的話。例如,您構建了一個出色的 .NET 應用,但必須完成痛苦的互操作藍框(如 PInvoke),才能使用通過 C++ 編寫的庫。

Windows 運行時可以彌合 Windows 8 中的語言分歧,使包含單個基本代碼的單一 Windows 運行時組件庫可以擴展至更廣泛的開發人員,無論組件的語言或應用的主要編程語言是什么。

現在,您可以創建一個可供全部 C++ 和 C# 開發人員使用的公開 Windows 運行時的單一 XAML 自定義控件。您可以在您的基于 XAML 或 HTML 的 Metro 風格應用中使用由開發人員共享的各種數據存儲 Windows 運行時庫。所有這些方案均無需編寫互操作代碼即可實現。

我們認為 Windows 運行時將惠及由開發人員創建并與社區中廣泛的 Metro 風格應用??發人員共享的各種庫。現在,我們來看看兩個展示使用 C++/CX 和 C# 構建第三該 Windows 運行時組件的具體示例。

應用場景 1:通過本機音頻來增強您的應用

假設我們要使用擁有 C# 編寫的應用邏輯支持的 XAML 來構建一個軟件合成器應用。為了向我們的音樂應用添加過濾器,我們將使用 XAudio 來直接控制音頻緩沖器。

將 Windows 運行時組件添加到我們的解決方案

使用 Visual Studio,我們可以將全新的 C++ Windows 運行時組件項目添加到我們現有的解決方案。該 Windows 運行時組件包括音樂處理功能:

使用 Visual Studio 來將一個全新的 C++ Windows 運行時組件添加到我們的音樂應用
圖 2:添加一個全新的 C++ Windows 運行時組件

Visual Studio 為我們創建了一個 C++ 項目,用于公開 API,而 API 的實現將打包到一個 DLL 文件,而 Windows 運行時元數據將打包到 winmd 文件中。它們全部可用于我們的 C# 項目。

定義向我們的 XAML C# 項目公開的類

我們使用 C++/CX 來構建向 C# 項目公開的 API,但您也可以使用 Windows 運行時 C++ 模板庫 (WRL)。我們首先定義一個非常基本的類以封裝 XAudio 功能:

XAudioWrapper.h

#pragma once

#include "mmreg.h"
#include <vector>
#include <memory>

namespace XAudioWrapper
{
    public ref class XAudio2SoundPlayer sealed
    {
    public:
        XAudio2SoundPlayer(uint32 sampleRate);
        virtual ~XAudio2SoundPlayer();

        void Initialize();

        bool   PlaySound(size_t index);
        bool   StopSound(size_t index);
        bool   IsSoundPlaying(size_t index);
        size_t GetSoundCount();

        void Suspend();
        void Resume();

    private:
        interface IXAudio2*                     m_audioEngine;
        interface IXAudio2MasteringVoice*       m_masteringVoice;
        std::vector<std::shared_ptr<ImplData>>  m_soundList;
    };
}

首先,您必須注意類聲明中 public、ref 和 sealed 等關鍵字的使用。對于通過 JavaScript 或 C# 等其他語言在 Metro 風格應用中實例化的類來說,該類必須聲明為 public ref class sealed。

類的公共功能(方法、屬性等)僅限于 C++ 內置的類型或 Windows 運行時類型。這些是可在 Windows 運行時組件中跨越語言界限的唯一類型。但話雖如此,您仍然可以將常規的 C++ 庫(即標準模板庫集合)用于您的類中的專用數據成員,如在該代碼斷中所示。這些專用數據成員無需遵從與跨越語言界限有關的規則。如果您使用不支持的構造,則 Visual Studio 編譯器將發出錯誤消息并提供相應的指導。

 

實現在我們的 Windows 運行時組件中公開的類

現在,我們已定義了類的基本接口,接下來讓我們來看看一些實現方法:

XAudioWrapper.cpp

XAudio2SoundPlayer::XAudio2SoundPlayer(uint32 sampleRate) :
m_soundList()
{
// Create the XAudio2 engine
UINT32 flags = 0;

XAudio2Create(&m_audioEngine, flags);

// Create the mastering voice
m_audioEngine->CreateMasteringVoice(
&m_masteringVoice,
XAUDIO2_DEFAULT_CHANNELS,
sampleRate
);
}

void XAudio2SoundPlayer::Resume()
{
m_audioEngine->StartEngine();
}

bool XAudio2SoundPlayer::PlaySound(size_t index)
{
//
// Setup buffer
//
XAUDIO2_BUFFER playBuffer = { 0 };
std::shared_ptr<ImplData> soundData = m_soundList[index];
playBuffer.AudioBytes = soundData->playData->Length;
playBuffer.pAudioData = soundData->playData->Data;
playBuffer.Flags = XAUDIO2_END_OF_STREAM;

HRESULT hr = soundData->sourceVoice->Stop();
if (SUCCEEDED(hr))
{
hr = soundData->sourceVoice->FlushSourceBuffers();
}

//
// Submit the sound buffer and (re)start (ignore any 'stop' failures)
//
hr = soundData->sourceVoice->SubmitSourceBuffer(&playBuffer);
if (SUCCEEDED(hr))
{
hr = soundData->sourceVoice->Start(0, XAUDIO2_COMMIT_NOW);
}

return SUCCEEDED(hr);
}

在該代碼段中,我們使用可用于 Metro 風格應用開發的 XAudio2 COM API 來連接我們的音頻引擎、播放聲音和恢復引擎。另外,我們還可以使用 C++ 構造和除 Windows 運行時類型以外的其他類型來實現必要的功能。

添加和使用 Windows 運行時組件

在定義和實現基本類之后,我們使用 Visual Studio 來將 XAudioWrapper Windows 運行時組件從我們的 C# 項目添加到 C++ 項目:

使用 Visual Studio 來將 XAudioWrapper Windows 運行時組件的引用添加到我們的音樂應用

圖 3:將 XAudioWrapper Windows 運行時組件添加到我們的音樂應用

因此,我們從 C++ 項目公開的類可用于我們的 C# 項目:

MainPage.cs

using XAudioWrapper;

namespace BasicSoundApp
{
public sealed partial class MainPage : Page
{
XAudio2SoundPlayer _audioPlayer = new XAudio2SoundPlayer(48000);
public MainPage()
{
this.InitializeComponent();
}

protected override void OnNavigatedTo(NavigationEventArgs e)
{
_audioPlayer.Initialize();
}

private void Button_Click_1(object sender, RoutedEventArgs e)
{
_audioPlayer.PlaySound(0);
}
}
}

如在該代碼段中所示,我們可以像使用常規 .NET 組件那樣與 C# 中的 XAudio 封裝程序進行交互。我們將引用其命名空間、舉例說明組件并開始調用其公開的各種方法。所有這一切不需要任何 DllImport 來調入本機代碼!

應用場景 2:使用內置的 API 在您的應用中打開 zip 文件

假設我們使用 HTML 來構建文件查看器應用,并希望添加功能來允許該應用的用戶選取 zip 文件。我們希望將 Windows 中已內置并在 .NET 平臺中公開的 API 用于處理 zip 文件。

將 Windows 運行時組件添加到我們的解決方案

該步驟與我們在音樂應用中所描述的步驟完全相同,現在我們將選取 C# Windows 運行時組件來包裝 zip 處理功能:

使用 Visual Studio 來將一個全新的 C# Windows 運行時組件添加到我們的文件查看器應用
圖 4:添加一個全新的 C# Windows 運行時組件 

Visual Studio 為我們創建了一個 C# 項目,用于公開 API,而 API 的實現和 Windows 運行時元數據都將打包到 .winmd 文件,并且可用于我們的 Web 項目。


實現在我們的 Windows 運行時組件中公開的類

我們使用 C# 來構建將向我們的 Web 項目公開的 API,但您同樣可以使用 Visual Basic。我們首先定義一個簡單的 C# 類來封裝 zip 功能:

ZipWrapper.cs

using System;
using System.Collections.Generic;
using System.IO;
using System.IO.Compression;
using System.Runtime.InteropServices.WindowsRuntime;
using System.Threading.Tasks;
using Windows.Foundation;
using Windows.Storage;

public sealed class ZipWrapper
{
public static IAsyncOperationWithProgress<IList<string>, double> EnumerateZipFileAsync(StorageFile file)
{
return AsyncInfo.Run(async delegate(
System.Threading.CancellationToken cancellationToken, IProgress<double> progress)
{
IList<string> fileList = new List<string>();
progress.Report(0);

using (var stream = await file.OpenStreamForReadAsync())
{
using (var archive = new ZipArchive(stream))
{
for (int i = 0; i < archive.Entries.Count; i++)
{
// add code for processing/analysis on the file
// content here

// add to our list and report progress
fileList.Add(archive.Entries[i].FullName);
double progressUpdate = ((i + 1) / ((double)archive.Entries.Count)) * 100; // percentage
progress.Report(progressUpdate);
}
}
}

progress.Report(100.0);
return fileList;
});
}
}

該類是公共的且已密封。類似于構建 C++ Windows 運行時組件,這對于其他語言實例化類來說是必需的。該類中公開的靜態方法混合使用 Windows 運行時類型(例如,StorageFile),并且在方法簽名中作為 .NET 類型(例如,IList)。我們的經驗法則是使用 Windows 運行時類型來定義向其他語言公開的公共字段、參數和返回類型。盡管如此,您仍然可以原封不動地使用某些 .NET 基本類型(即 DateTimeOffset 和 Uri)以及基元(即 IList)。

您還會注意到上述方法利用了在定義您的 Windows 運行時組件時可以(且應該)使用的用于異步性和進度支持的 Windows 運行時基礎結構。就該類中的 Windows 運行時組件或任何專用功能的實現而言,您并不僅限于使用 Windows 運行時類型和 API;您可以自由使用任何向 Metro 應用開發公開的 .NET API 表面,如代碼段 ZipArchive API 中所示。

添加和使用 Windows 運行時組件

我們現在已經實現了 zip 工具封裝程序,我們將使用 Visual Studio 來添加我們的 JavaScript 項目中對 C# 項目的引用:

使用 Visual Studio 添加我們的文件查看器應用中 ZipUtil Windows 運行時組件的引用
圖 5:將 ZipUtil Windows 運行時組件添加到我們的文件查看器應用
 

因此,我們從 C# 項目公開的類將可用于我們的 Web 項目:

program.js

function pickSinglePhoto() {

// Create the picker object for picking zip files
var openPicker = new Windows.Storage.Pickers.FileOpenPicker();
openPicker.viewMode = Windows.Storage.Pickers.PickerViewMode.thumbnail;
openPicker.suggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.picturesLibrary;
openPicker.fileTypeFilter.replaceAll([".zip"]);

// Open the picker for the user to pick a file
openPicker.pickSingleFileAsync().then(function (file) {
if (file) {
ZipUtil.ZipWrapper.enumerateZipFileAsync(file).then(
function (fileList) {
for (var i = 0; i < fileList.length; i++)
document.getElementById('output').innerHTML += " " + fileList[i];
},
function (prog) {
document.getElementById('zipProgress').value = prog;
}
);
} else {
document.getElementById('output').innerHTML = "an error occurred";
}
});
};

正如您所看到的,我們可以與 JavaScript 中我們的 zip 工具封裝程序進行交互,如同它是一個常規的 JavaScript 對象。我們可以調入 Windows 運行時組件中公開的靜態方法,而我們使用 JavaScript 的異步語言構造,如 .then(),也可以完成此操作。

一般指導

并非您為 Metro 風格應用編寫的所有 API 都應公開為第三方 Windows 運行時組件。通常情況下,當您在不同的編程語言之間進行通信時需要使用 Windows 運行時組件類型,并使用語言中內置的類型和構造來實現無法通過 Windows 運行時組件全局公開的功能。另外,跨越語言界限還涉及各種語言特定的功能和規則,當構建 Windows 運行時組件時,您必須將其納入考慮范圍。它們具體包括代理和事件、異步操作、方法重載和處理特定的數據類型(例如,集合、異常處理和調試技巧)。您可以通過訪問構建 Windows 運行時組件中面向您的開發語言的部分,來深入研究這些主題。

總結

就 Windows 運行時組件而言,您現在可以混合使用編寫語言和 API 技術來構建您設想的應用。毫不遷就的理念貫穿于 Windows 8。即使是在開發階段情況依然如此,我們允許您混合使用和匹配適用于您的方案的最佳編程語言。我希望這將使您能夠用更多的時間來考慮創新,而不是在學習全新的編程語言方面浪費大量的時間。

希望您能充分享受構建應用為您帶來的快樂!

-- Windows 項目經理 Ines Khelifi


posted @ 2012-10-29 21:16 jackdong 閱讀(331) | 評論 (0)編輯 收藏

 

    WinRT 不是另一個抽象層;它就像 Win32 API 一樣,直接駐留在內核之上。自從 1993 年 Win32 伴隨 Windows NT 被引入以來,這標志著對于 Windows 核心的首次重大突破。WinRT 與 Win32 截然不同,它代表了新的語義學應用程序執行環境。
 

  不像 Win32 是用C語言思想設計的,而 WinRT API 是用 C++ 編寫的,并且從一開始的設計就是面向對象的。一致性、易用性、以及性能都是新的運行時 API 的重要方面。WinRT API 中的每個對象都支持反射,以便甚至連諸如 JavaScript 等動態語言都可有效地使用它們。隨之而來還有統一對象模型,這對于基于庫的 C++ 而言是個稀罕物。

  附注:Win32 API 并未被移除,而且那些使用傳統應用程序執行環境的較早的應用程序將繼續按預期方式工作。

  C++開發

  在 C++ 中編寫用戶界面將首選 XAML。所有與 XAML 一起使用的庫都已被移植到C++,并且被編譯為本地 x86 版本。使用 XAML 和 C++ 編寫的 Metro 風格應用程序并不運行在 .NET 之上,它們就像其他任何 Visual C++ 應用程序一樣,被直接編譯為 x86 版本。

  調用 UI 控件的方法就像在 C++ 中調用任何其他對象的方法一樣。在機器碼級別上,某個指令將 this 指針推送到堆棧上,然后通過虛函數表(v-table)調用相應函數。這使得即使在低功耗設備上也能達到最優的性能。

  支持一些現代的 C++ 應用程序所用的庫,例如 Boost。

  重疊窗口不復存在

  對話框是來自上一版 Windows 的核心概念,而在 WinRT 中它將不復存在。對于微軟而言,性能成本和可用性問題已不再是理所當然的。希望使用這種模式的應用程序將要開發其他的方式來傳遞信息,例如消息框的方式。

  另一并未納入 WinRT 的庫是 GDI。如果某個應用程序要使用 Metro 風格界面,那么它需要按自上而下的方式來做,將 Metro 風格與經典用戶界面相混合的情況是不可能出現的。

  PlayTo 契約

  另一被公開的契約是 PlayTo(由……發揮)。這使得應用程序可發送如音頻及視頻等媒體文件到某個 charm[1]。然后那個 charm 將允許用戶選擇某個他們想用的應用程序來查看該文件。據推測,媒體文件不僅限于物理文件,而是任何可表示為數據流的媒體形式。

  C#/VB:平臺調用(P/Invoke)之終結

  從 .NET 中調用本地函數通常涉及建立結構和操縱指針。而在 WinRT 環境下,所有的 API 被公開為許多可通過 C# 及 VB 直接使用的對象。這把 .NET 開發者置于與 C++ 開發者平等的層面上。

  應用程序的響應速度對于微軟而言是非常重要的。所有耗時超過 50 毫秒的操作系統級別的 API 調用將被公開為異步操作,正是為了向開發者傳遞這種價值觀。

  JavaScript

  對于 Windows 8 而言,第四大語言就是 JavaScript。盡管它不使用 XAML,但它就像本地及 .NET 應用程序一樣,擁有對底層 WinRT API 的直接訪問權。這不僅是個像 PhoneGap 一樣的容器,JavaScript 開發者還可獲得與其他開發者所使用的同樣豐富的 API。

  由于是 JavaScript,因此所選擇的 UI 工具包是 HTML 和 CSS 而非 XAML。IE 10 及 Metro 風格的 JavaScript 應用程序使用的是同一渲染引擎,盡管那些應用程序實際并不運行在瀏覽器中。JavaScript 應用程序看起來就像任何其他 Metro 風格應用程序一樣。

  JavaScript 中的用戶控件幾乎與 C++ 及 .NET 中的控件不相上下。有些控件對于 HTML 渲染引擎而言是固有的,而另外一些控件則是用 JavaScript 編寫的。這些基于 JavaScript 的控件都是基于 div 的,非常像那些使用 jQuery 創建的控件。

  應用程序容器和應用程序權限

  Metro 風格應用程序運行在被稱為“應用程序容器”(app container)的環境中。這似乎取代了由基于 Win32 應用程序所使用的窗體環境。

  大多數 API 調用被直接發送給底層內核。然而,有些調用將被通過系統代理(system broker)路由。系統代理確保應用程序只能訪問那些經用戶已批準的功能。例如,當某個應用程序首次嘗試訪問攝像頭時,服務代理(service broker)將提示用戶以獲取他們的批準。應用程序必須包括一份清單,其中注明該應用程序可能需要的所有限制服務。這種模式對于移動設備開發者而言將是非常熟悉的。

  所有 Metro 風格應用程序都會運行在 WinRT 的應用程序容器中,而且會受到系統代理的監控,甚至連那些用 C++ 編寫的應用程序也不例外。該思想是為了限制應用程序破壞系統的能力。雖然也許并不是不可能的,但是在 WinRT 下創建惡意軟件與在 Win32 中相比將會難得多。

  所有 Metro 風格應用程序必須進行數字簽名

  不允許匿名應用程序。應用程序為了測試可進行自簽名,但是當它們出現在應用商店里時,它們就必須使用真實證書進行簽名。

  譯注

  [1] charm,微軟已將“CHARM”注冊為計算機、軟件產品、電氣和科學產品類商標。微軟將 CHARM 描述為計算機程序、圖形用戶界面軟件和操作系統程序。在觸摸版 Windows 8 中,charms 在屏幕右側;在傳統版(使用鼠標和鍵盤)Windows 8 中,charms 出現在屏幕左側。charms 包括:Search(搜索)、Share(分享)、Start(開始)、Devices(設備)、Settings(設置)。詳見微軟申請 Windows 8 功能 charm 注冊商標(圖)。

  作者:Jonathan Allen 譯者:高翌翔

  查看英文原文:WinRT: An Object Orientated Replacement for Win32 

  相關博客文章:Windows Runtime(WinRT) 揭秘


http://dotnet.cnblogs.com/page/115787/
posted @ 2012-10-29 15:21 jackdong 閱讀(414) | 評論 (0)編輯 收藏

http://blog.csdn.net/dongjun7357/article/details/6277682

一、GProfile簡介

      GProfile是gcc的一個工具,用于對應用程序的測試。

      GProfile可以分析出函數的調用次數、函數的調用關系以及函數消耗的時間。

 

二、GProfile原理

      在編譯和鏈接你的程序的時候,gcc 在你應用程序的每個函數中都加入了一個名為mcount ( or "_mcount" , or "__mcount" , 依賴于編譯器或操作系統)的函數,也就是說你的應用程序里的每一個函數都會調用mcount, 而mcount 會在內存中保存一張函數調用圖,并通過函數調用堆棧的形式查找子函數和父函數的地址。這張調用圖也保存了所有與函數相關的調用時間,調用次數等等的所有信息。 

     程序運行結束后,會在程序退出的路徑下生成一個gmon.out文件,用來保存監控數據。從而通過gprof來解讀數據對程序進行分析。

          

三、GProfile用法

      1、在編譯時加入參數 -pg就可以打開GProfile的開關。

      2、gprof只查看用戶函數信息,不能對庫函數進行查看。 如果想查看庫函數的信息,在編譯時加入"-lc_p"編譯參數代替"-lc"編譯參數,這樣程序會鏈接libc_p.a庫,就可以查看庫函數的信息了。 
  3、 gprof只能在程序正常結束退出之后才能生成程序測評報告,原因是gprof通過在atexit()里注冊了一個函數來產生結果信息,任何非正常退出都不會執行atexit()的動作,所以不會產生gmon.out文件。如果你的程序是一個不會退出的服務程序,那就只有修改代碼來達到目的。如果不想改變程序的運行方式,可以添加一個信號處理函數解決問題(這樣對代碼修改最少),例如: 
  static void sighandler( int sig_no ) 
  { 
  exit(0); 
  } 
  signal( SIGUSR1, sighandler ); 
  當使用kill -USR1 pid 后,程序退出,生成gmon.out文件。 

 

四、GProfile舉例


#include 
<stdio.h> 

  
int ppp(int a) 

  


     
int i, b; 

     b 
= 0

     
for(i = 0; i<1000000; i++

        b
++

     }
 

     
return 0

  }
 

 


  
int prime(int n) 

  


     
int i, j, b; 

     b 
= 0

     
for(i=2; i<n; i++

         
for(j = 0; j<1000000; j++

              b
++

         }
 

         
if(n%== 0

           
return 0

         
return 1

        }
 

   }
 

  


   
int main(void

   


      
int i, n; 

      n 
= 1000

      
for(i=2; i<=n; i++

         
if(prime(i)) 

            ppp(i); 

         }
 

      }
 

      
return 0

   }
 

編譯程序:gcc -pg -o test test.c
  運行源程序./test后會生成一個gmon.out的文件
   分析結果:gprof -b test gmon.out
 

  

 

 五、GProfile對于結果的分析

      -b 不再輸出統計圖表中每個字段的詳細描述。 
  -p 只輸出函數的調用圖(Call graph的那部分信息)。 
  -q 只輸出函數的時間消耗列表。 
  -e Name 不再輸出函數Name 及其子函數的調用圖(除非它們有未被限制的其它父函數)。可以給定多個 -e 標志。一個 -e 標志只能指定一個函數。 
  -E Name 不再輸出函數Name 及其子函數的調用圖,此標志類似于 -e 標志,但它在總時間和百分比時間的計算中排除了由函數Name 及其子函數所用的時間。 
  -f Name 輸出函數Name 及其子函數的調用圖。可以指定多個 -f 標志。一個 -f 標志只能指定一個函數。 
  -F Name 輸出函數Name 及其子函數的調用圖,它類似于 -f 標志,但它在總時間和百分比時間計算中僅使用所打印的例程的時間。可以指定多個 -F 標志。一個 -F 標志只能指定一個函數。-F 標志覆蓋 -E 標志。 
  -z 顯示使用次數為零的例程(按照調用計數和累積時間計算)。 

      GProfile的詳細請參考:http://www.cs.utah.edu/dept/old/texinfo/as/gprof.html

      這個文檔對GProfile說的很詳細,很好。


posted @ 2012-10-26 15:41 jackdong 閱讀(1209) | 評論 (0)編輯 收藏

查看系統信息 
cat /proc/cpuinfo - CPU (i.e. vendor, Mhz, flags like mmx) 
cat /proc/interrupts - 中斷 
cat /proc/ioports - 設備IO端口 
cat /proc/meminfo - 內存信息(i.e. mem used, free, swap size) 
cat /proc/partitions - 所有設備的所有分區 
cat /proc/pci - PCI設備的信息 
cat /proc/swaps - 所有Swap分區的信息 
cat /proc/version - Linux的版本號 相當于 uname -r 
uname -a - 看系統內核等信息 (1) 處理器使用率 
(2) 內存使用率 
(3) 流入流出數據包 
(4) 整體網絡負載 
這些數據分別要從/proc/stat、/proc/net/dev、/proc/meminfo三個文件中提取。如里有問題或對要提取的數據不太清楚,可以使用man proc來查看proc文件系統的聯機手冊。 
(1) 處理器使用率 
這里要從/proc/stat中提取四個數據:用戶模式(user)、低優先級的用戶模式(nice)、內核模式(system)以及空閑的處理器時間(idle)。它們均位于/proc/stat文件的第一行。CPU的利用率使用如下公式來計算。 
CPU利用率 = 100 *(user + nice + system)/(user + nice + system + idle) 
(2) 內存使用率 
這里需要從/proc/meminfo文件中提取兩個數據,當前內存的使用量(cmem)以及內存總量(amem)。 
內存使用百分比 = 100 * (cmem / umem) 
(3)網絡利用率 
為了得到網絡利用率的相關數據,需要從/proc/net/dev文件中獲得兩個數據:從本機輸出的數據包數,流入本機的數據包數。它們都位于這個文件的第四行。 
性能收集程序開始記錄下這兩個數據的初始值,以后每次獲得這個值后均減去這個初始值即為從集群啟動開始從本節點通過的數據包。 
利用上述數據計算出網絡的平均負載,方法如下: 
平 均網絡負載 = (輸出的數據包+流入的數據包) / 2 獲取cpu和內存的還有2種方 法:1)toptop -n 1 -p [pid1,pid2,,,] >>topinfo.txt打開topinfo.txt就能獲取進程 的內存cpu信息。2)psps -aux|grep [pid name]|grep -v grep獲取到進程的內存cpu信息,其信息更加精練。  從以上來看,由于多線程程序cpu切換是與進程一樣,因此無法體現真實的cpu使用率,要將上面方法綜合使用才能獲取到真實合理的系統信息。
posted @ 2012-10-24 23:12 jackdong 閱讀(982) | 評論 (0)編輯 收藏

top 命令詳解

版權聲明:可以任意轉載,但轉載時必須標明原作者charlee、原始鏈接http://tech.idv2.com/2006/08/16/top-command/以及本聲明。

top命令是Linux下常用的性能分析工具,能夠實時顯示系統中各個進程的資源占用狀況,類似于Windows的任務管理器。下面詳細介紹它的使用方法。


認識top的顯示結果

top命令的顯示結果如下所示:

top - 01:06:48 up 1:22, 1 user, load average: 0.06, 0.60, 0.48
Tasks: 29 total, 1 running, 28 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.3% us, 1.0% sy, 0.0% ni, 98.7% id, 0.0% wa, 0.0% hi, 0.0% si
Mem: 191272k total, 173656k used, 17616k free, 22052k buffers
Swap: 192772k total, 0k used, 192772k free, 123988k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1379 root 16 0 7976 2456 1980 S 0.7 1.3 0:11.03 sshd
14704 root 16 0 2128 980 796 R 0.7 0.5 0:02.72 top
1 root 16 0 1992 632 544 S 0.0 0.3 0:00.90 init
2 root 34 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/0
3 root RT 0 0 0 0 S 0.0 0.0 0:00.00 watchdog/0統計信息區

前五行是系統整體的統計信息。第一行是任務隊列信息,同 uptime 命令的執行結果。其內容如下:

01:06:48 當前時間 up 1:22 系統運行時間,格式為時:分 1 user 當前登錄用戶數 load average: 0.06, 0.60, 0.48 系統負載,即任務隊列的平均長度。
三個數值分別為 1分鐘、5分鐘、15分鐘前到現在的平均值。

第二、三行為進程和CPU的信息。當有多個CPU時,這些內容可能會超過兩行。內容如下:

Tasks: 29 total 進程總數 1 running 正在運行的進程數 28 sleeping 睡眠的進程數 0 stopped 停止的進程數 0 zombie 僵尸進程數 Cpu(s): 0.3% us 用戶空間占用CPU百分比 1.0% sy 內核空間占用CPU百分比 0.0% ni 用戶進程空間內改變過優先級的進程占用CPU百分比 98.7% id 空閑CPU百分比 0.0% wa 等待輸入輸出的CPU時間百分比 0.0% hi 0.0% si

最后兩行為內存信息。內容如下:

Mem: 191272k total 物理內存總量 173656k used 使用的物理內存總量 17616k free 空閑內存總量 22052k buffers 用作內核緩存的內存量 Swap: 192772k total 交換區總量 0k used 使用的交換區總量 192772k free 空閑交換區總量 123988k cached 緩沖的交換區總量。
內存中的內容被換出到交換區,而后又被換入到內存,但使用過的交換區尚未被覆蓋,
該數值即為這些內容已存在于內存中的交換區的大小。
相應的內存再次被換出時可不必再對交換區寫入。 進程信息區

統計信息區域的下方顯示了各個進程的詳細信息。首先來認識一下各列的含義。

序號 列名 含義 a PID 進程id b PPID 父進程id c RUSER Real user name d UID 進程所有者的用戶id e USER 進程所有者的用戶名 f GROUP 進程所有者的組名 g TTY 啟動進程的終端名。不是從終端啟動的進程則顯示為 ? h PR 優先級 i NI nice值。負值表示高優先級,正值表示低優先級 j P 最后使用的CPU,僅在多CPU環境下有意義 k %CPU 上次更新到現在的CPU時間占用百分比 l TIME 進程使用的CPU時間總計,單位秒 m TIME+ 進程使用的CPU時間總計,單位1/100秒 n %MEM 進程使用的物理內存百分比 o VIRT 進程使用的虛擬內存總量,單位kb。VIRT=SWAP+RES p SWAP 進程使用的虛擬內存中,被換出的大小,單位kb。 q RES 進程使用的、未被換出的物理內存大小,單位kb。RES=CODE+DATA r CODE 可執行代碼占用的物理內存大小,單位kb s DATA 可執行代碼以外的部分(數據段+棧)占用的物理內 存大小,單位kb t SHR 共享內存大小,單位kb u nFLT 頁面錯誤次數 v nDRT 最后一次寫入到現在,被修改過的頁面數。 w S 進程狀態。
D=不可中斷的睡眠狀態
R=運行
S=睡眠
T=跟蹤/停止
Z= 僵尸進程 x COMMAND 命令名/命令行 y WCHAN 若該進程在睡眠,則顯示睡眠中的系統函數名 z Flags 任務標志,參考 sched.h

默認情況下僅顯示比較重要的 PID、USER、PR、NI、VIRT、RES、SHR、S、%CPU、%MEM、TIME+、COMMAND 列。可以通過下面的快捷鍵來更改顯示內容。

更改顯示內容

通過 f 鍵可以選擇顯示的內容。按 f 鍵之后會顯示列的列表,按 a-z 即可顯示或隱藏對應的列,最后按回車鍵確定。

o 鍵可以改變列的顯示順序。按小寫的 a-z 可以將相應的列向右移動,而大寫的 A-Z 可以將相應的列向左移動。最后按回車鍵確定。

按大寫的 FO 鍵,然后按 a-z 可以將進程按照相應的列進行排序。而大寫的 R 鍵可以將當前的排序倒轉。

posted @ 2012-10-24 22:43 jackdong 閱讀(681) | 評論 (0)編輯 收藏

http://www.cnblogs.com/greatverve/archive/2010/11/19/vc-dll.html

1 用VC創建DLL動態鏈接庫
1.1 創建dll項目

1.2 為dll項目編寫源文件

頭文件dllDemo.h
extern "C" _declspec(dllexport) int Sum(int a,int b);//加法函數。
extern "C" _declspec(dllexport) int Max(int a, int b);//取較大值函數
extern "C" _declspec(dllexport) int Min(int a, int b);//取較小值函數
源文件dllDemo.cpp
復制代碼
大氣象
#include "dllDemo.h"
extern "C" _declspec(dllexport)int Sum(int a, int b)
{
return a+b;}
extern "C" _declspec(dllexport)int Max(int a, int b)
{
    
if(a>=b)
        
return a;
    
else
        
return b;
}
extern "C" _declspec(dllexport)int Min(int a, int b)
{
    
if(a>=b)
        
return b;
    
else
        
return a;
}
復制代碼

1.3 生成dll文件

編譯源文件,如果沒有出現錯誤提示,那么,在項目文件根目錄的Debug文件夾內會生成一個dll文件“dllDemo.dll”。

調用
新建了個MFC單對話框項目,
dllDemo.dll”和”dllDemo.lib”文件復制到本項目的Debug目錄下,
在VC工作空間的文件視圖下面將”dllDemo.lib”添加到項目中

在對話框頭文件添加引用:

復制代碼
大氣象
// FileOperDlg.h : 頭文件
//

#pragma once

extern "C"_declspec(dllimport) int Sum(int a,int b);
extern "C"_declspec(dllimport) int Max(int a,int b);
extern "C"_declspec(dllimport) int Min(int a,int b);
// CFileOperDlg 對話框
class CFileOperDlg : public CDialog
{
// 構造
public:
    CFileOperDlg(CWnd
* pParent = NULL);    // 標準構造函數

// 對話框數據
    enum { IDD = IDD_FILEOPER_DIALOG };

    
protected:
    
virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持


// 實現
protected:
    HICON m_hIcon;

    
// 生成的消息映射函數
    virtual BOOL OnInitDialog();
    afx_msg 
void OnSysCommand(UINT nID, LPARAM lParam);
    afx_msg 
void OnPaint();
    afx_msg HCURSOR OnQueryDragIcon();
    DECLARE_MESSAGE_MAP()
public:
    CString m_info;
};
復制代碼

 

調用:

CString str;
int c=Sum(4,5);  
//c=Max(5,6);  
//c=Min(5,6);
str.Format("%d",c);
AfxMessageBox(str);

 

調試
直接運行,選擇一個調用dll的exe確定之后,就可以調試了,設置個斷點試試。

 

 

 

參考:

VC++的DLL應用(含Demo演示)

作者:一點一滴的Beer http://beer.cnblogs.com/

      在大學大一的時候學的是C,然后后來大二的時候專業又開了C++這個課程,然后再后來自己又自學了一點VC++,大三的時候也試著編寫過一個MFC的最簡單的窗口程序。到大四的時候,自己又做了一個GIS的項目,是用C#.NET來編寫的,然后發現C#上手好容易,而且還大部分語法規則都沿用了C,C++的習慣,于是覺得C++實在是沒有一點優勢可言啊。但這個暑假的實習經歷又改變了我的觀點:C++在寫窗口程序雖然麻煩,但是卻什么能做,而且對比C#來說,對運行環境的要求不高,不用像C#程序在安裝之前還要安裝100M多的運行.NET環境。C++和C#各有優缺,目前我對它們倆的定位是:C++用來寫一些底層的程序,比如驅動,或者是一些算法類型的函數接口,然后用C#來調用這些接口并進行界面設計。如何函數的實現跨語言呢?顯然DLL是個很重要的內容,故在此對VC++的DLL模塊進行介紹。

1 用VC創建DLL動態連接庫

 

1.1 創建dll項目

clip_image002

然后選擇“一個空的dll工程”,然后點擊“確定”便完成了“創建dll項目”的流程。

 

1.2 為dll項目編寫源文件

新建兩個文件:dllDemo.h, dllDemo.cpp

在頭文件”dllDemo.h”中聲明三個接口函數:

extern "C" _declspec(dllexport) int Sum(int a,int b);//加法函數。
extern "C" _declspec(dllexport) int Max(int a, int b);//取較大值函數
extern "C" _declspec(dllexport) int Min(int a, int b);//取較小值函數

 

然后在“dllDemo.cpp”文件中實現三個接口函數:

 

復制代碼
#include "dllDemo.h"
extern "C" _declspec(dllexport)int Sum(int a, int b)
{
return a+b;
}
extern "C" _declspec(dllexport)int Max(int a, int b)
{
if(a>=b)return a;
else
return b;
}
extern "C" _declspec(dllexport)int Min(int a, int b)
{
if(a>=b)return b;
else
return a;
}
復制代碼

 

 

1.3 生成dll文件

編譯源文件,如果沒有出現錯誤提示,那么,在項目文件根目錄的Debug文件夾內會生成一個dll文件“dllDemo.dll”。

 

 

2 DLL調用

 

2.1 用C++調用顯式鏈接

clip_image004

新建一個Win32的控制臺程序進行顯式調用:

1. 新建“dllConsoleEvident”的Win32控制臺程序項目

2. 新建cpp文件“dllConsoleEvident.cpp”

3. 將在第一節中,在Debug目錄下編譯生成的“dllDemo.dll”(顯式調用時只需要這一個文件就夠了)文件復制到“dllConsoleEvident”項目下的Debug文件夾根目錄下

4. 在“dllConsoleEvident.cpp”文件中編寫以下代碼對dll中的函數進行顯式調用

 

復制代碼
代碼
//////////////////////////////////////////////////////////////////////////
//動態加載DLL文件
#include <iostream.h>
#include
<windows.h>
void main(void)
{
typedef
int(*pMax)(int a,int b);//函數指針
typedef int(*pMin)(int a,int b);
pMax Max
=NULL;
pMin Min
=NULL;
HINSTANCE hDLL;
hDLL
=LoadLibrary("MyDll.dll");//加載動態鏈接庫MyDll.dll文件;
Max=(pMax)GetProcAddress(hDLL,"Max");
Min
=(pMin)GetProcAddress(hDLL,"Min");
if (Max)//如果取出函數成功,則執行下面的語句
{
int A=Max(5,8);
cout
<<"比較的結果為"<<A;
}
if (Min)
{
int B=Min(5,8);
cout
<<"比較的結果為"<<B;
}
FreeLibrary(hDLL);
//卸載MyDll.dll文件;
}
復制代碼

 

 

 

2.2 用C++隱式鏈接(Win32控制臺程序)

clip_image006

新建一個Win32控制臺程序演示靜態調用

1. 利用向導新建“dllConsoleStaticDemo”的空工程

2. 將dllDemo.dll”和“dllDemo.lib文件復制到Debug目錄下,并在項目中包含“dllDemo.lib”文件(或者),否則會出現dll函數找不到的連接錯誤

3. 新建“dllConsoleStaticDemo.cpp”文件,并寫入如下代碼:

 

復制代碼
extern "C"_declspec(dllimport) int Sum(int a,int b);
extern "C"_declspec(dllimport) int Max(int a,int b);
extern "C"_declspec(dllimport) int Min(int a,int b);
#include
<iostream.h>
void main()
{
int c=Sum(4,5);
c
=Max(5,6);
c
=Min(5,6);
cout
<<"Hello,dllConsoleTest~!";
}
復制代碼

 

 

 

 

4.通過斷點,可以看到dll函數調用成功

這種方式的靜態調用的特點是:在程序一開始執行的時候,就將dll文件全部加載到程序中,不會釋放。

 

2.3 用C++隱式鏈接(MFC窗口程序)

clip_image008

新建一個MFC基本對話框窗口程序進行調用:

1. 利用向導建立一個MFC基本對話框

2. 將dllDemo.dll”和”dllDemo.lib”文件復制到本項目的Debug目錄下,在VC工作空間的文件視圖下面將”dllDemo.lib”添加到項目中

3. 在“dllMfcDemoDlg.h”頭文件中的前面對來自外部的dll函數進行聲明

 

復制代碼
// dllMfcDemoDlg.h : header file
//
#if !defined(AFX_DLLMFCDEMODLG_H__E358B876_D188_48FD_8D83_794309C885A9__INCLUDED_)
#define AFX_DLLMFCDEMODLG_H__E358B876_D188_48FD_8D83_794309C885A9__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
/////////////////////////////////////////////////////////////////////////////
// CDllMfcDemoDlg dialog
extern "C"_declspec(dllimport) int Sum(int a,int b);
extern "C"_declspec(dllimport) int Max(int a,int b);
extern "C"_declspec(dllimport) int Min(int a,int b);
……
復制代碼

 

 

 

 

4.在窗體界面上,雙擊“確定”按鈕,進入到OnOk()的事件響應函數體,編寫調用代碼:

 

復制代碼
void CDllMfcDemoDlg::OnOK()
{
// TODO: Add extra validation here
int c=Sum(4,5);
c
=Max(5,6);
c
=Min(5,6);
CDialog::OnOK();
}
復制代碼

 

 

 

通過設置斷點單步運行就可以看到dll文件中的函數已經被成功調用了。

 

2.4 用C#跨語言調用

C#控制臺程序調用VC++建立一個dll:

clip_image010

1. 用Visual Studio建立一個控制臺程序

2. 將“dllDemo.dll”文件復制到項目的Debug目錄下面

3. 在“Program.cs”中編寫如下代碼

 

復制代碼
代碼
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;//引入dll文件中的函數
namespace ConsoleDllDemo
{
class Program
{
//引入dll文件中的函數
[DllImport("dllDemo.dll")]
private static extern int Sum(int a, int b);
[DllImport(
"dllDemo.dll")]
private static extern int Max(int a, int b);
[DllImport(
"dllDemo.dll")]
private static extern int Min(int a, int b);
static void Main(string[] args)
{
int a = Sum(3, 5);
Console.WriteLine(a);
Console.WriteLine(Max(
5,10));
Console.WriteLine(Min(
12,25));
Console.ReadKey();
//要按鍵才退出。
}
}
}
復制代碼

 

 

 

然后斷點單步運行,便可以看到調用函數的結果了。

關于DLL的調用的更詳細內容可以參考另外一些文章:

http://dev.firnow.com/course/3_program/c++/cppsl/2008127/97781.html

http://dev.yesky.com/283/2640283_2.shtml

 

3 dll調試方法

在建立了dll項目后,并寫好相應的實現代碼,點擊“運行”,會彈出現在的對話框:

clip_image012

然后瀏覽,找到一個調用了此dll文件的執行文件“*.exe”文件,然后就可以對dll文件進行斷點調試了。

這個“*.exe”文件可以是任何平臺的,C++也可以,C也可以,C#也可以,只要這個執行文件調用了dll文件中的函數即可。

如果想更換調試的“*.exe”文件,可以在“工程-》設置”對話框中的“調試”選項卡進行設置,瀏覽找到用戶需要的“*.exe”文件

clip_image014

說明:以VC++環境中調用此dll為例,運行dllDemo項目,然后會調用“*.exe”文件,如果此exe文件含有源文件,而且剛好在源文件的Debug目錄下面,那么,可以同時在exe文件的源文件中設置斷點,進行dll和調用dll兩個程序的聯調。(好像跨語言調用的時候不能進行聯調,筆者只在C++互相調用的時候聯調成功過,但C#調用的時候沒有聯調成功,這個問題有待解決)

 

 

4. DLL返回數據類型探究

目前寫的DLL函數反返回值還僅限于整形,還沒有嘗試其它特殊類型的返回值。更豐富的返回值類型,還要今后慢慢學習和研究。等回學校了再研究吧。請見后續文章吧。

 

 

附件:

VC_dll_Realse.rar中是VC編寫DLL并引用DLL的相關源碼文件

CShapr_ConsoleDllDemo.rar中是VS2005編寫的C#引用VC編寫的DLL函數的相關源碼文件

http://files.cnblogs.com/beer/VC_dll_Realese.rar

http://files.cnblogs.com/beer/CSharp_ConsoleDllDemo.rar

------------------------------------------------------------------

posted @ 2012-10-23 14:45 jackdong 閱讀(434) | 評論 (0)編輯 收藏

1  高級程序設計語言的實現

2 針對計算機體系結構的優化

   a 并行性

   b 內存層次結構

3  新計算機體系結構的設計

   a RISC

   b 專用體系結構

4 程序翻譯

   a 二進制翻譯

   b 硬件合成

   c 數據查詢解釋器

   d 編譯然后模擬

5 軟件生產率工具

   a 類型檢查

   b 邊界檢查

   c 內存管理工具

posted @ 2012-10-22 12:07 jackdong 閱讀(488) | 評論 (0)編輯 收藏

僅列出標題
共10頁: 1 2 3 4 5 6 7 8 9 Last 
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲午夜精品一区二区三区他趣| 宅男66日本亚洲欧美视频| 久热精品视频在线观看一区| 含羞草久久爱69一区| 久久久久网址| 欧美大片免费观看| 国产综合视频| 亚洲精品一线二线三线无人区| 欧美午夜精品伦理| 一区二区三区欧美日韩| 欧美激情视频网站| 影音先锋久久精品| 中文国产亚洲喷潮| 久久xxxx精品视频| 一区二区三区欧美| 亚洲自拍电影| 男人的天堂亚洲| 亚洲高清视频的网址| 久久久蜜桃一区二区人| 欧美另类极品videosbest最新版本| 午夜在线a亚洲v天堂网2018| 香蕉乱码成人久久天堂爱免费| 欧美黄色影院| 毛片精品免费在线观看| 亚洲国产精品一区二区www在线| 日韩视频一区二区在线观看| 亚洲综合国产| 久久夜色精品国产噜噜av| 欧美精选在线| 国产伦精品一区二区三区视频黑人| 在线观看91精品国产麻豆| 一本色道久久综合亚洲二区三区| 午夜精品久久久久久久99热浪潮 | 国产欧美精品一区二区色综合| 红桃视频国产精品| 亚洲欧美日韩精品久久久久 | 午夜精品一区二区三区在线 | 欧美日韩国产综合新一区| 国产日韩成人精品| 亚洲图片欧美一区| 欧美成人激情视频| 性久久久久久久久久久久| 欧美日韩hd| 亚洲精品小视频| 乱人伦精品视频在线观看| 亚洲小视频在线| 欧美欧美天天天天操| 亚洲国产精品t66y| 老色鬼久久亚洲一区二区 | 欧美精品综合| 91久久夜色精品国产九色| 久久久不卡网国产精品一区| 中文一区在线| 欧美少妇一区二区| 99精品国产福利在线观看免费| 麻豆精品一区二区av白丝在线| 午夜精品免费在线| 国产日韩欧美高清| 午夜精品一区二区在线观看| 一区二区国产精品| 欧美色播在线播放| 亚洲午夜性刺激影院| 亚洲日本视频| 欧美日韩国产免费| 欧美黄色成人网| 国产亚洲一级高清| 欧美中文在线观看| 亚洲欧美日本精品| 国产日韩一区二区三区在线| 久久精品噜噜噜成人av农村| 亚洲欧美在线播放| 国产综合色精品一区二区三区| 久久久欧美一区二区| 久久精品观看| 亚洲国产欧美一区二区三区同亚洲 | 国产精品色网| 久久激情视频久久| 久久精品成人一区二区三区蜜臀| 影音先锋亚洲视频| 亚洲精品欧美在线| 欧美性大战久久久久久久蜜臀| 亚洲一区二区毛片| 午夜精品久久| 亚洲国产日韩一级| 亚洲视频在线观看| 国产一区二区日韩| 欧美激情第10页| 欧美日韩在线观看一区二区| 午夜亚洲视频| 久久夜色精品国产亚洲aⅴ| 亚洲美女黄网| 中文av字幕一区| 黄色成人av在线| 亚洲韩国青草视频| 国产精品午夜在线| 欧美黄色影院| 国产欧美在线| 最新国产拍偷乱拍精品| 国产一区二区黄色| 亚洲精品一区二区三区樱花| 国产欧美视频一区二区三区| 欧美激情无毛| 国产欧美视频在线观看| 亚洲国产老妈| 狠狠爱www人成狠狠爱综合网| 亚洲欧洲日本国产| 国内精品久久久久影院色| 日韩午夜激情av| 在线观看欧美成人| 亚洲欧美日韩天堂一区二区| 亚洲精品日韩久久| 久久精品成人欧美大片古装| 亚洲欧美日韩高清| 欧美精品1区2区3区| 老司机精品视频网站| 国产免费成人在线视频| 亚洲精品看片| 亚洲经典一区| 久久精品视频网| 欧美亚洲日本一区| 欧美精品在线免费播放| 欧美刺激性大交免费视频| 国产欧美日韩一区二区三区在线| 99这里只有久久精品视频| 国产精品豆花视频| 久久久精彩视频| 国产精品久久久久久久7电影| 91久久久国产精品| 亚洲大片在线| 久久久一区二区三区| 久久九九99| 国产亚洲欧美一区在线观看| 亚洲网站在线看| 亚洲一区二区视频| 欧美日韩综合一区| 99综合在线| 亚洲免费视频一区二区| 国产精品久久久久一区| 一区二区冒白浆视频| 亚洲一区二区三区高清| 欧美日韩一区三区| 亚洲一区二区三区精品动漫| 亚洲欧美国产一区二区三区| 国产精品久久久久77777| 亚洲香蕉伊综合在人在线视看| 亚洲欧美日韩网| 国产精品有限公司| 久久国产精品第一页| 久久综合狠狠综合久久综合88 | 99在线精品视频| 欧美片在线播放| 夜夜精品视频| 亚洲欧美在线磁力| 国产精品青草久久| 亚洲欧美成人在线| 久久久不卡网国产精品一区| 亚洲第一在线综合网站| 欧美成人精品在线观看| 日韩视频不卡| 香蕉av777xxx色综合一区| 国产一区二区三区在线观看视频| 久久狠狠亚洲综合| 91久久精品国产91久久性色tv | 亚洲第一在线综合网站| 一本一本久久a久久精品综合麻豆| 欧美日韩日日骚| 香蕉久久一区二区不卡无毒影院| 麻豆精品在线视频| 一区二区日韩精品| 国产欧美三级| 欧美电影在线观看完整版| 一本久久综合亚洲鲁鲁五月天| 欧美一区二区日韩| 亚洲欧洲精品一区二区三区不卡| 国产精品老牛| 免费日韩av片| 亚洲欧美日本伦理| 亚洲美女视频| 蜜桃精品一区二区三区| 亚洲午夜精品久久| 1024亚洲| 国产午夜精品全部视频在线播放 | 国产综合色在线视频区| 欧美久久影院| 久久久精品国产99久久精品芒果| 亚洲精品一区二区三区在线观看| 久久久久成人网| 亚洲一区二区三区777| ●精品国产综合乱码久久久久| 国产精品国产三级国产aⅴ9色| 久久资源在线| 午夜伦欧美伦电影理论片| 一区在线播放视频| 亚洲欧美中文字幕| 亚洲国产精品第一区二区三区| 欧美日韩国产天堂| 另类国产ts人妖高潮视频| 亚洲欧美中文日韩v在线观看| 亚洲国产日韩综合一区| 久久亚洲春色中文字幕久久久|