C++ Programmer's Cookbook

{C++ 基础} {C++ 高级} {C#界面,C++核心算法} {设计模式} {C#基础}

微软C++标准(事件实例)

一 微软C++标准关键字(包括标准C++,托管C++,微软扩展C++,C++/CLI)

__abstract 2

abstract

__alignof Operator

array

__asm

__assume

__based

bool

__box 2

break

case

catch

__cdecl

char

class

const

const_cast

continue

__declspec

default

__delegate 2

delegate

delete

deprecated 1

dllexport 1

dllimport 1

do

double

dynamic_cast

else

enum

enum class

enum struct

event

__event

__except

explicit

extern

false

__fastcall

__finally

finally

float

for

for each, in

__forceinline

friend

friend_as

__gc 2

gcnew

generic

goto

__hook 3

__identifier

if

__if_exists

__if_not_exists

initonly

__inline

inline

int

__int8

__int16

__int32

__int64

__interface

interface class

interface struct

interior_ptr

__leave

literal

long

__m64

__m128

__m128d

__m128i

__multiple_inheritance

mutable

naked 1

namespace

new

new

__nogc 2

noinline 1

__noop

noreturn 1

nothrow 1

novtable 1

nullptr

operator

__pin 2

private

__property 2

property

property 1

protected

public

__raise

ref struct

ref class

register

reinterpret_cast

return

safecast

__sealed 2

sealed

selectany 1

short

signed

__single_inheritance

sizeof

static

static_cast

__stdcall

struct

__super

switch

template

this

thread 1

throw

true

try

__try/__except, __try/__finally

__try_cast 2

typedef

typeid

typeid

typename

__unaligned

__unhook 3

union

unsigned

using declaration, using directive

uuid 1

__uuidof

value struct

value class

__value 2

virtual

__virtual_inheritance

void

volatile

__w64

__wchar_t, wchar_t

 while


注释:
0)    一般关键字前面加双下划线的表示微软的扩展,也有没有加的啊
1)  关键字后面有1的表示:__declspec 关键字的扩展属性
2) 关键字后面有2的表示:是以前的托管C++的扩展
3) 关键字后面有3的表示:是事件处理中使用的属性,在非托管C++中也可以使用

4)VS6.0只支持非托管C++,VS2002,VS2003还支持托管C++,最新的VS2005中还增加了对C++/CLI的支持。
5)VS IDE中通过 /Za 可以控制使用微软扩展或只使用标准C++.

二 几个常用的微软扩展关键字实例

1)在非托管C++中使用__raise__event
// EventHandlingRef_raise.cpp
struct E {
   __event 
void func1();
   
void func1(int{}

   
void func2() {}

   
void b() {
      __raise func1();
      __raise func1(
1);  // C3745: 'int Event::bar(int)': 
                         
// only an event can be 'raised'
      __raise func2();   // C3745
   }

}
;

int main() {
   E e;
   __raise e.func1();
   __raise e.func1(
1);  // C3745
   __raise e.func2();   // C3745
}


2)在非托管C++中使用__hook__unhook 
// evh_native.cpp
#include <stdio.h>

[event_source(native)]
class CSource {
public:
   __event 
void MyEvent(int nValue);
}
;

[event_receiver(native)]
class CReceiver {
public:
   
void MyHandler1(int nValue) {
      printf_s(
"MyHandler1 was called with value %d.\n", nValue);
   }


   
void MyHandler2(int nValue) {
      printf_s(
"MyHandler2 was called with value %d.\n", nValue);
   }


   
void hookEvent(CSource* pSource) {
      __hook(
&CSource::MyEvent, pSource, &CReceiver::MyHandler1);
      __hook(
&CSource::MyEvent, pSource, &CReceiver::MyHandler2);
   }


   
void unhookEvent(CSource* pSource) {
      __unhook(
&CSource::MyEvent, pSource, &CReceiver::MyHandler1);
      __unhook(
&CSource::MyEvent, pSource, &CReceiver::MyHandler2);
   }

}
;

int main() {
   CSource source;
   CReceiver receiver;

   receiver.hookEvent(
&source);
   __raise source.MyEvent(
123);
   receiver.unhookEvent(
&source);
}


3)在托管C++中使用__Delegate(VS2005中使用/CLR:: oldsytax)

// keyword__delegate.cpp
// compile with: /clr
#using <mscorlib.dll>
using namespace System;

__delegate 
int GetDayOfWeek();
__gc 
class MyCalendar
{
public:
   MyCalendar() : m_nDayOfWeek(
4{}
   
int MyGetDayOfWeek() { Console::WriteLine("handler"); return m_nDayOfWeek; }
   
static int MyStaticGetDayOfWeek() { Console::WriteLine("static handler"); return 6; }
private:
   
int m_nDayOfWeek;
}
;

int main ()
{
   GetDayOfWeek 
* pGetDayOfWeek;  // declare delegate type
   int nDayOfWeek;
   
   
// bind delegate to static method
   pGetDayOfWeek = new GetDayOfWeek(0&MyCalendar::MyStaticGetDayOfWeek);
   nDayOfWeek 
= pGetDayOfWeek->Invoke();
   Console::WriteLine(nDayOfWeek);

   
// bind delegate to instance method
   MyCalendar * pcal = new MyCalendar();
   pGetDayOfWeek 
= static_cast<GetDayOfWeek*>(Delegate::Combine(pGetDayOfWeek,
      
new GetDayOfWeek(pcal, &MyCalendar::MyGetDayOfWeek)));
   nDayOfWeek 
= pGetDayOfWeek->Invoke();
   Console::WriteLine(nDayOfWeek);

   
// delegate now bound to two methods; remove instance method
   pGetDayOfWeek = static_cast<GetDayOfWeek*>(Delegate::Remove(pGetDayOfWeek,
      
new GetDayOfWeek(pcal, &MyCalendar::MyGetDayOfWeek)));
   
return 0;
}


4)在C++/CLI中使用Event,Delegate (VS2005 IDE 中使用/CLR)

// mcppv2_events.cpp
// compile with: /clr
using namespace System;

// declare delegates
delegate void ClickEventHandler(intdouble);
delegate void DblClickEventHandler(String^);

// class that defines events
ref class EventSource {
public:
   
event ClickEventHandler^ OnClick;   // declare the event OnClick
   event DblClickEventHandler^ OnDblClick;   // declare OnDblClick

   
void FireEvents() {
      
// raises events
      OnClick(73.14159);
      OnDblClick(
"Hello");
   }

}
;

// class that defines methods that will called when event occurs
ref class EventReceiver {
public:
   
void OnMyClick(int i, double d) {
      Console::WriteLine(
"OnClick: {0}, {1}", i, d);
   }


   
void OnMyDblClick(String^ str) {
      Console::WriteLine(
"OnDblClick: {0}", str);
   }

}
;

int main() {
   EventSource 
^ MyEventSource = gcnew EventSource();
   EventReceiver
^ MyEventReceiver = gcnew EventReceiver();

   
// hook handler to event
   MyEventSource->OnClick += gcnew ClickEventHandler(MyEventReceiver, &EventReceiver::OnMyClick);
   MyEventSource
->OnDblClick += gcnew DblClickEventHandler(MyEventReceiver, &EventReceiver::OnMyDblClick);

   
// invoke events
   MyEventSource->FireEvents();

   
// unhook handler to event
   MyEventSource->OnClick -= gcnew ClickEventHandler(MyEventReceiver, &EventReceiver::OnMyClick);
   MyEventSource
->OnDblClick -= gcnew DblClickEventHandler(MyEventReceiver, &EventReceiver::OnMyDblClick);
}


三 在VS2002,VS2003中我们可以使用托管C++(Managed C++),但是最新的VS2005中,我们可以直接在C++中使用.NET FrameWork ,这个就是最新的C++标准C++/CLI,已经通过了相关组织的标准化。

posted on 2006-11-25 17:38 梦在天涯 阅读(5292) 评论(3)  编辑 收藏 引用 所属分类: CPlusPlusMFC/QT

评论

# re: 微软C++标准(事件实例) 2006-11-28 08:50 erran

托管C++怎么看怎么不顺眼.....  回复  更多评论   

# re: 微软C++标准(事件实例) 2006-11-30 17:10 yimudi

这是一亩地网站(yimudi.cn)给您的留言!
祝贺您荣登一亩地中文Blog排行榜。在我们收录的700多万博客中目前您的排名是330名。您可以访问一亩地网站查看有关您博客的详细信息,通过搜索博客(输入您的博客名称、用户名或者直接输入您博客的网址URL)就可以快速找到您自己的博客信息主页。
一亩地中文Blog排行榜是目前中文博客中最权威的博客综合排行指标,注册一亩地,您将得到更多贴心服务,一亩地随时欢迎您的光临。
博客中间只有一亩地!
  回复  更多评论   

# re: 微软C++标准(事件实例) 2006-12-07 14:52 gql

我对微软唯一的微词是他企图另立C++标准~  回复  更多评论   


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


公告

EMail:itech001#126.com

导航

统计

  • 随笔 - 461
  • 文章 - 4
  • 评论 - 746
  • 引用 - 0

常用链接

随笔分类

随笔档案

收藏夹

Blogs

c#(csharp)

C++(cpp)

Enlish

Forums(bbs)

My self

Often go

Useful Webs

Xml/Uml/html

搜索

  •  

积分与排名

  • 积分 - 1625690
  • 排名 - 5

最新评论

阅读排行榜