附文 委托代码生成器

原创 2004年04月07日 16:32:00

附文

                                       委托代码生成器

                                                                                                  刘强

                                                                                        cambest@sohu.com

                                                                        200442

 

为了解决在定制委托时的不灵活性,我特意编写了这个小工具,它能够方便地将委托声明转化为如上面所述的代码。下面是其基本用法。

       在你的某个头文件中,如test.h,以__delegate 关键字声明一个委托:

       __delegate void WinHandler ( HWND hwnd ,UINT message ,WPARAM wParam,LPARAM lParam);

然后转到命令行模式,进入test.h的目录,键如如下命令:

       delegate.exe test.h /out test.hxx

它将生成test.hxx文件。你可以向你的源程序中包含这个文件,以使用你所定义的委托。如,可以是这样:#include “test.hxx”

       你可以在一个文件里定义多个委托,也可以在多个文件里定义多个委托.但是你只能指定一个的输出文件.如果你没有用/out 选项指定输出文件,则默认输出为delegate.h。如:

       delegate.exe test.h test1.h test2.h /out test.hxx

使用/help选项得到帮助信息,使用/version选项得到版本信息.

       在由委托生成的代码当中,Add/RemoveFunction接受的参数类型默认为'void *',这样不利于编译器为我们做函数匹配检查./ptm选项强制参数类型为我们定义的委托类型.

使用 delegate.exe /help可以查到详细信息:

 

Delegate generator version 1.1.0

Copyright Cambest(Tcliuqiang,Liuqiang,Lewis Liu).

2004--3--31, All rights reserved.

  /out </o>[output file]  Specify the output file.

  /ptm   Force the Add/RemoveFunction parameter type match. Default is 'void *'.

  /keyword   Specify the keyword. Default is '__delegate'.

  /include      Remove delegate declaration from source file,and include the generated file to your source file.

  /help </h /?>       Print this messages.

  /version </v>      Print version of delegate.exe

Please feedback bugs to Cambest@sohu.com

 

下面是具体的示例:

[示例1]

//test.h:

#include <string>

#include <list>

using namespace std;

enum STATUS

{

       FINDING,

       FOUND,

       PROCESS

};

__delegate void HandleWnd(HWND hwnd,DWORD lParam,WROD wParam,UINT type);

enum TYPE

{

       NORMAL,

       SEPARATOR

};

__delegate void WINAPI CALLBACK  WinProc(HWND hwnd,DWORD lParam);

bool IsSeparator(char ch);

void Process(string t);

void Parse(istream in,ostream out);

 

//test1.h:

#define WINAPI 0

 

/*下面是委托定义*/

__delegate void WinHandler ( HWND hwnd ,UINT message ,WPARAM wParam,LPARAM lParam);

/*不要在定义之中注释*/

 

下面是由delegate.exe test.h test1.h /out test.hxx生成的代码:

//test.hxx

#include <list>

 

using namespace std;

 

/*

       Generated by delegate.exe.

       Please don't modify this file.

       If you encountered any problems,please feedback to cambest@sohu.com.

*/

 

typedef unsigned int __NativePtr;

 

typedef void  (* __Handle_WinHandler)(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);

 

class WinHandler

{

private:

 

       list<__NativePtr> ftns;

 

public:

 

       void AddFunction(void *)

       {

              __NativePtr np=(__NativePtr)ftn;

              ftns.push_back(np);

       }

 

       void RemoveFunction(void *ftn)

       {

              __NativePtr np=(__NativePtr)ftn;

              ftns.remove(np);

       }

 

       void operator += (void *ftn)

       {

              this->AddFunction(ftn);

       }

 

       void operator -= (void *ftn)

       {

              this->RemoveFunction(ftn);

       }

 

       int Invoke(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)

       {

              __Handle_WinHandler handle;

              list<__NativePtr>::iterator itr=ftns.begin();

              try

              {

                     for(;itr!=ftns.end();itr++)

                     {

                            handle=(__Handle_WinHandler)*itr;

                            handle(hwnd,message,wParam,lParam);

                     }

              }

              catch(int *_e)

              {

                     return 0;

              }

              return 1;

       }

 

       int operator() (HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)

       {

              return Invoke(hwnd,message,wParam,lParam);

       }

};

 

/*

       Generated by delegate.exe.

       Please don't modify this file.

       If you encountered any problems,please feedback to cambest@sohu.com.

*/

 

typedef void  (* __Handle_HandleWnd)(HWND hwnd,DWORD lParam,WROD wParam,UINT type);

 

class HandleWnd

{

private:

 

       list<__NativePtr> ftns;

 

public:

 

       void AddFunction(void *)

       {

              __NativePtr np=(__NativePtr)ftn;

              ftns.push_back(np);

       }

 

       void RemoveFunction(void *ftn)

       {

              __NativePtr np=(__NativePtr)ftn;

              ftns.remove(np);

       }

 

       void operator += (void *ftn)

       {

              this->AddFunction(ftn);

       }

 

       void operator -= (void *ftn)

       {

              this->RemoveFunction(ftn);

       }

 

       int Invoke(HWND hwnd,DWORD lParam,WROD wParam,UINT type)

       {

              __Handle_HandleWnd handle;

              list<__NativePtr>::iterator itr=ftns.begin();

              try

              {

                     for(;itr!=ftns.end();itr++)

                     {

                            handle=(__Handle_HandleWnd)*itr;

                            handle(hwnd,lParam,wParam,type);

                     }

              }

              catch(int *_e)

              {

                     return 0;

              }

              return 1;

       }

 

       int operator() (HWND hwnd,DWORD lParam,WROD wParam,UINT type)

       {

              return Invoke(hwnd,lParam,wParam,type);

       }

};

 

/*

       Generated by delegate.exe.

       Please don't modify this file.

       If you encountered any problems,please feedback to cambest@sohu.com.

*/

 

typedef void WINAPI CALLBACK  (* __Handle_WinProc)(HWND hwnd,DWORD lParam);

 

class WinProc

{

private:

 

       list<__NativePtr> ftns;

 

public:

 

       void AddFunction(void *)

       {

              __NativePtr np=(__NativePtr)ftn;

              ftns.push_back(np);

       }

 

       void RemoveFunction(void *ftn)

       {

              __NativePtr np=(__NativePtr)ftn;

              ftns.remove(np);

       }

 

       void operator += (void *ftn)

       {

              this->AddFunction(ftn);

       }

 

       void operator -= (void *ftn)

       {

              this->RemoveFunction(ftn);

       }

 

       int Invoke(HWND hwnd,DWORD lParam)

       {

              __Handle_WinProc handle;

              list<__NativePtr>::iterator itr=ftns.begin();

              try

              {

                     for(;itr!=ftns.end();itr++)

                     {

                            handle=(__Handle_WinProc)*itr;

                            handle(hwnd,lParam);

                     }

              }

              catch(int *_e)

              {

                     return 0;

              }

              return 1;

       }

 

       int operator() (HWND hwnd,DWORD lParam)

       {

              return Invoke(hwnd,lParam);

       }

};

 

注意:最新的Visual C++ .Net 版本已经支持同名关键字 __delegate,这是微软公司为了将Visual C++.net移植而添加的新关键字,只有 Visual C++ .Net 支持,其他如Visual C++ 6.0Borland C++ Builder GNU C++ 等都不支持。但两个完全没有联系.幸运的是,delegate小工具支持/keyword 选项,它可以指定你自己定义的关键字,如__delegate__。这样,delegate工具可以在你的源代码中查找以__delegate__开头的委托定义,而不是默认的__delegate

       另外一点就是/include选项可以将你的源代码中的委托声明删除,并相应的在其中添加包含输出文件的语句。如,test1.h有这样的声明:

       __delegate__ void WinProcHandler(HWND hwnd, LPARAM lParam,WPARA wParam);

执行命令 delegate test1.h /ptm /include /out ptxx.h

test1.h中的这条语句被置换成:

       #include “ptxx.h”

这样做有可以使你做最少的维护.

 

[示例2

//hellocpp

#include <iostream>

using namespace std;

 

__delegate void SHO(char * s);

 

void Print(char *str)

{

       cout<<"It is in Print :"<<str<<endl;

}

void Good(char *str)

{

       cout<<"It is in Good ,say good to you ::"<<str<<endl;

 

}

void main()

{

       SHO s;

       s+=Print;

       s+=Good;

 

       s("I am the best!");

}

//生成委托代码:delegate.exe Hello.cpp /fpm /include /out SHO.h

#include <iostream>

using namespace std;

 

#include "SHO.h"

 

void Print(char *str)

{

       cout<<"It is in Print :"<<str<<endl;

}

void Good(char *str)

{

       cout<<"It is in Good ,say good to you ::"<<str<<endl;

}

void main()

{

       SHO s;

       s+=Print;

       s+=Good;

       s("I am the best!");

       s-=Print;

       s(“jjj kkk lll ttt”);

}

编译:(这里使用Microsoft C++编译器)

cl Hello.cpp /EHsc

由于delegate生成的代码包含异常处理,所以在编译hello.cpp时你需要指定/EHsc选项,否则会给出警告信息,但不妨碍编译成功.

输出:

       It is in Print :I am the best!

It is in Good ,say good to you ::I am the best!

It is in Good ,say good to you ::jjj kkk lll ttt

你可以打开SHO.H文件看看里面是怎样定义的.

       由于只是测试版本,这个小工具的功能还不是很强。比如,你不能在委托声明语句中间有注释,而只能在声明前或声明之后添加注释。另外由于时间关系,我在处理委托返回值没有做到很好的处理。我希望这个问题很快会解决。有什么意见和建议,请将之反馈到我的邮箱:cambest@sohu.com

 

20个代码生成器框架

20个代码生成框架 1.1 CodeSmith 一款人气很旺国外的基于模板的dotnet代码生成器 官方网站:http://www.codesmithtools.com 官方论坛:http...
  • PAPALIAN
  • PAPALIAN
  • 2014年03月26日 19:05
  • 15753

推荐一款Java基于最新Spring 4.3.2 集成Hibernate 5.1.0 基于Bootstrap 3.3.7的全自动代码生成器

软件概述:        该套软件是智能代码自动生产系统,拥有该软件你只需要有一套数据库表结构,就可以生产出一套完整的系统代码出来,你可以选择整库生成,你也可以选择某一张表生成,选择一张表生成时可以...
  • Ryan200909
  • Ryan200909
  • 2017年09月15日 14:38
  • 348

【JAVA实例】代码生成器的原理讲解以及实际使用

原理:利用Freemarker技术,通过java加载Freemarker模板,将前台输入的参数填入模板里面,通过FileZip压缩一个zip包,然后自动下载下来 1.预先定义好模板 ...
  • jxausea
  • jxausea
  • 2016年04月30日 08:09
  • 2071

加快效率 - 最简单的代码生成器实现

加快效率 - 最简单的代码生成器实现为什么需要代码生成器?当工作中需要频繁复制粘贴来写程序的时候,更好的选择可能是写一个代码生成器来生成基础的内容,然后在此基础上进行修改和完善。复制粘贴虽然简单,但是...
  • isea533
  • isea533
  • 2015年08月21日 10:26
  • 6073

代码生成器大全

1.1 CodeSmith 一款人气很旺国外的基于模板的dotnet代码生成器 官方网站:http://www.codesmithtools.com 官方论坛:http://foru...
  • LanSeTianKong12
  • LanSeTianKong12
  • 2017年06月03日 08:54
  • 1572

两款主流代码生成器对比评测

两款主流代码生成器对比评测         作为一名软件开发人员,在平时工作中会遇到大量重复的、机械的增删改查,这时如果选择一套合适的代码辅助工具,比如代码生成器,往往会产生事半功倍的效果,提高...
  • suneboy
  • suneboy
  • 2012年03月05日 09:03
  • 2406

动软.net代码生成器使用视频演示

动软.net代码生成器使用视频演示全屏观看全部视频下载 
  • litp
  • litp
  • 2008年03月20日 23:26
  • 3579

RDIFramework.NET平台代码生成器V3.2版本全新发布(提供下载-免费使用)

RDIFramework.NET代码生成器V3.2版本修改了针对3.0版本的框架部分做了大量的调整,在V3.1版本增加对MySql数据库的支持,支持生成Web部分的UI代码(WebForm,MVC),...
  • chinahuyong
  • chinahuyong
  • 2017年02月27日 16:09
  • 4060

最简单Mybatis代码生成器

最近项目中使用了Mybatis, 顺便整理一下mybatis代码生成器使用经验。网上的好多资料,不能拿来就用,需要费一番功夫,感觉甚是不方便,所以结合自己的经验总结了一个简单入门版本 1,创建一个简单...
  • wangwei86609
  • wangwei86609
  • 2017年07月13日 20:06
  • 446

图解动软代码生成器使用

首先在百度搜索后直接下载; 一 功能概览 常用操作; 代码模版有如下类别; 工具菜单有如下功能; 二 新增数据库服务器 1 连接sql se...
  • bcbobo21cn
  • bcbobo21cn
  • 2016年09月01日 16:05
  • 2369
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:附文 委托代码生成器
举报原因:
原因补充:

(最多只允许输入30个字)