http://wiki.9ria.com/PureMVC
posted @ 2013-01-23 13:55 sheng 阅读(455) | 评论 (0)编辑 收藏
 
本文转自:二叉树博客 http://www.erchashu.com/wiki/doxygen-chm-chinese-hlep-doc

2010年曾经使用Doxygen生成全中文的chm文档。由于Doxygen生成的chm目录文件(index.hhc)本身是使用UTF-8编码的,而古老的chm编译器(HTML Help Workshop)对于CHM控制文件(index.hhc、index.hhk、index.hhp),却只支持ANSI编码(即本地编码,如中文系统为GBK),所以最终编译出来的chm文件,左边的目录导航栏全是乱码。为了解决这个问题,可费了一番工夫,得先使用编码转换工具转换后再用chm编译器编译(见:使用doxygen为C/C++程序生成中文文档)。

今天重新拿起Doxygen,惊喜地发现,它已经支持生成ANSI编码的chm目录文件(index.hhc)了,所以能省好多工夫,现在终于可以一步搞定。现在想来,Doxygen早就应该支持这个功能的,做起来也很简单——当然我没有详细去翻查Doxygen是从哪个版本开始支持的,反正Doxygen 1.8.0是支持的,想必之后的版本都支持。

下载和安装 Doxygen

Doxygen 官网 下载最新的Doxygen安装程序,然后安装。这个软件包包括了一个GUI界面的前端工具,可以帮助我们方便创建Doxygen配置文件和生成目标文档。

下面以 Doxygen 1.8.0 为例进行讲解。

下载和安装 chm 编译器

我们使用微软古老的 HTML Help Workshop 1.3,这个软件N久没更新了。

下载地址: 微软官网

下载后根据提示安装。

项目一般设置

首先在“Wizard”标签的Project项进行如下设置:

  • 项目名称:将在最新的文档首页中显示
  • 源码列表:选择要生成文档的源代码或目录,可以有多个文件或目录形成一个列表。建议使用相对路径,相对于当前目录(也即当前配置文件所在的目录)
  • 递归扫描:如果需要对整个源码目录下的所有子目录及文件生成文档,请勾选本项
  • 输出目录:设置最终生成的帮助文档的存储路径,建议使用相对路径

下一步,Mode项,根据需要设置文档生成模式。

下一步,Output项,设置输出格式,勾选HTML和“prepare for compressed HTML(.chm)”

然后切换到“Expert”标签的“HTML”项,设置HTML和CHM相关的选项:

  • GENERATE_HTMLHELP:确保已经勾选了
  • CHM_FILE:最终生成的.chm的文件名,如“HkcProjectHelp.chm”。默认为“index.chm”。可以使用路径,也可以使用相对路径,相对于上面设置的输出目录的html目录(建设使用上一级目录,如“..\MyDoc.chm”)
  • HHC_LOCATION:chm 编译器(hhc.exe)的全路径。请指到 HTML Help Workshop 的安装目录的 hhc.exe 程序
  • CHM_INDEX_ENCODING:chm索引文件编码,下面会讲到,这里填“GBK”

编码设置

编码设置很重要,如果设置不当,生成的文档会出现乱码。因为 Doxygen 汲及的东西多,有好几项编码设置,所以需要认真对待,根据项目的实情情况设置。

所有高级设置(包括编码设置)都在“Expert”标签,重要的设置项如下:

  • Project/DOXYFILE_ENCODING:当前 Doxygen 配置文件本身的字符编码,默认为UTF-8,一般不需要修改
  • Project/OUTPUT_LANGUAGE:输出语言。这里是指Doxygen自己生成的导航、提示、帮助等文本的文字采用的语言。我们希望帮助文档是全中文的,所以选择Chinese
  • Input/INPUT_ENCODING:输入文件的编码。这里是指我们的源代码文件本身的编码。在Windows平台一般是系统编码(GBK),而Linux平台一般是UTF-8。请用文本编辑器查看源文件的编码。这里如果设置的不一致,源码文件的注释中所有非ASCII字符将在生成的文档中变成乱码。
  • HTMP/CHM_INDEX_ENCODING:这里设置Doxygen生成的CHM索引文件的编码,以前是不能设置的,默认为UTF-8,而微软的编译器不能识别UTF-8编码的索引文件,所以最终造成左边目录导航栏乱码。我们设置它为GBK,这样Doxygen将为我们生成GBK编码的索引文件(.hhc、.hhk、.hhp)

生成CHM文档

设置好了后,点击“Run”→“Run doxygen”生成最终的.chm文档,如果设置正确,打开后是全中文的了。

posted @ 2012-11-27 14:19 sheng 阅读(836) | 评论 (0)编辑 收藏
http://fuliang.iteye.com/blog/305158 数据挖掘
http://www.cnblogs.com/ldcsaa/archive/2012/06/13/2546551.html性能 Windows Socket 服务端与客户端组件(源代码及测试用例下载)
posted @ 2012-11-19 16:05 sheng 阅读(177) | 评论 (0)编辑 收藏
先介绍个比较简单的程序,windows下读内存:

#include 
"stdafx.h"
#include 
<windows.h>
#include 
<iostream>
using namespace std;

const char FileMaping[255= "FileMaping";
typedef 
struct file_map_parameter_t
{
    
int i_id;
    
int j_id;
    
char c_id;
}
file_map_parameter_t;

typedef file_map_parameter_t FileMap_t[
100];
file_map_parameter_t 
* m_addr;

bool ReadFileMapping()
{
    size_t len 
= sizeof(FileMaping);
    wchar_t
* wstr_name = (wchar_t*)malloc((len+1)*sizeof(wchar_t));
    HANDLE m_handle 
= ::OpenFileMapping(FILE_MAP_ALL_ACCESS,false,wstr_name);
    
if (NULL == m_handle)
    
{
        m_handle 
= ::CreateFileMapping((HANDLE)INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,
            
sizeof(FileMap_t),wstr_name);
        
if( NULL == m_handle)
        
{
            cout
<<"共享文件生成失败!"<<endl;
            
return false;
        }
 
        
else
        
{
            cout
<<"共享文件生成成功!"<<endl;
        }


    }
 
    m_addr 
= (file_map_parameter_t*)::MapViewOfFile(m_handle,FILE_MAP_WRITE,0,0,sizeof(FileMap_t));

    
for (int i = 0;i<20;i++)
    
{
        file_map_parameter_t 
* m_addrtmp;
        m_addrtmp 
= m_addr + i; 
    }

    
    
return true;
}

int _tmain(int argc, _TCHAR* argv[])
{
    ReadFileMapping();
    
return 0;
}


写共享内存:
#include "stdafx.h"
#include <windows.h>
#include <iostream>
using namespace std;

const char FileMaping[255] = "FileMaping";
typedef struct file_map_parameter_t
{
 int i_id;
 int j_id;
 char c_id;
}file_map_parameter_t;

typedef file_map_parameter_t FileMap_t[100];
file_map_parameter_t * m_addr;

bool WriteFileMapping()
{
 size_t len = sizeof(FileMaping);
 wchar_t* wstr_name = (wchar_t*)malloc((len+1)*sizeof(wchar_t));
 HANDLE m_handle = ::OpenFileMapping(FILE_MAP_ALL_ACCESS,false,wstr_name);
 if (NULL == m_handle)
 {
  m_handle = ::CreateFileMapping((HANDLE)INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,
   sizeof(FileMap_t),wstr_name);
  if( NULL == m_handle)
  {
   cout<<"共享文件生成失败!"<<endl;
   return false;
  }
  else
  {
   cout<<"共享文件生成成功!"<<endl;
  }

 }
 m_addr = (file_map_parameter_t*)::MapViewOfFile(m_handle,FILE_MAP_WRITE,0,0,sizeof(FileMap_t));

 for (int i = 0;i<20;i++)
 {
  (m_addr + i)->c_id = 'i';
  (m_addr + i)->i_id = i;
  (m_addr + i)->j_id = 2*i;
 }
 return true;
}
int _tmain(int argc, _TCHAR* argv[])
{
 WriteFileMapping();
 return 0;
}


这里有一个问题没有解决:
    对共享内存的大小问题,比如说上面写的程序是已知共享内存的大小,比如说有20个struct,但是如果
这个大小不是固定的比如类似于一个vector的话该怎么操作呢?

利用boost::interprocess请看http://blog.csdn.net/great3779/article/details/7226388







posted @ 2012-11-19 10:45 sheng 阅读(621) | 评论 (0)编辑 收藏
1. gtest + protoBuf vs2010 win32 环境搭建(解决lib包冲突问题) http://blog.csdn.net/wonka438/article/details/7724098
2.以小见大——那些基于 protobuf 的五花八门的 RPC(3)    http://blog.csdn.net/lanphaday/article/details/6318432

3.网络通信相关,chenshuo的blog:http://blog.csdn.net/solstice/article/details/6527585
posted @ 2012-11-15 11:33 sheng 阅读(366) | 评论 (0)编辑 收藏

先上代码:

#include 
"stdafx.h"
#include
<iostream>
#include 
"luabind\luabind.hpp"

extern "C"
{
#include 
"lua.h"
#include 
"lualib.h"
#include 
"lauxlib.h"
}


using namespace std;

bool LoadScript(lua_State *L,const string& fname)
{
    
if (luaL_dofile(L,fname.c_str()))
    
{
        cerr
<<lua_tostring(L,-1)<<endl;
        
return false;
    }
 
    
return true;
}


void testFunc(int k)
{
    cout
<<"hello there, i am a cpp fun"<<endl;
    cout
<<"input num:="<<k<<endl;
}


class NumberPrinter {
public:
    NumberPrinter(
int number) :
      m_number(number) 
{}

      
void print() {
          cout 
<< m_number << endl;
      }


private:
    
int m_number;
}
;


int _tmain(int argc, _TCHAR* argv[])
{
    
using namespace luabind;
    lua_State
* L = luaL_newstate();
    module(L, 
"cppapi")
        [
            def(
"testFunc", (void(*)(int))testFunc)
        ];

    
// 使用LuaBind导出NumberPrinter类
    luaopen_base(L);
    luabind::open(L);

    luabind::module(L) 
        [
            luabind::class_
<NumberPrinter>("NumberPrinter")
            .def(luabind::constructor
<int>())
            .def(
"print"&NumberPrinter::print)
        ];
    
    luaL_openlibs(L);
    LoadScript(L,
"test.lua");
    
try{
         
int add_ret = luabind::call_function<int>(L,"add",10,4);
         
int call_global = luabind::object_cast<int>(luabind::globals(L)["nGlobal"]);
         
string strGlobal = luabind::object_cast<string>(luabind::globals(L)["strGlobal"]) ;
         luabind::
object lua_object = luabind::globals(L)["t"];
         
//--2种办法load table
         string strName = luabind::object_cast<string>(lua_object["name"]);
         
int iAge = luabind::object_cast<int>(lua_object["age"]);
         
string strElse = luabind::object_cast<string>(lua_object["desc"]);
    }

    
catch(luabind::error& e)
    
{
        cout
<<e.what()<<endl;
        printf(
"AI throw error: err_msg[%s]", lua_tostring(L, -1));
        
return false;
    }

    
    lua_close(L);
    
return 0;
}

其中test.lua的代码如下:
Print2000 = NumberPrinter(2000)
Print2000:print()

nGlobal = 10 --一个全局的整形变量
strGlobal = "hello i am in lua" --一个全局的字符串变量
--一个返回值为int类型的函数
function add(a, b)
    return a+b
end
--一个返回值为string类型的函数
function strEcho(a)
    print(a)
    return 'haha i h

ave print your input param'
end

cppapi.testFunc(10) --调用c++暴露的一个测试函数
t={name='ettan', age=23, desc='正值花季年龄'}

运行结果为:



这上面luabind调用c++函数的实例:调用testFunc函数;也有c++调用lua的代码,具体的见代码。
此代码在我的vs2010上面调试通过,前提是必须配好环境如:添加依赖库luabind.debug.lib;lua.debug.lib
添加依赖库路径。

特别注意:

首先Lua是“动态编译的脚本语言”,而loadfile只是把源文件加载到内存中,还少了“编译”这一步,可以用“luaL_dofile(L,"test.lua");”来替换,它既加载又编译。替换之后执行应该就没有问题了。

但是还没完,luaL_dofile 实际上是个宏:

 

  1. #define luaL_dofile(L, fn) \ 
  2. (luaL_loadfile(L, fn) || lua_pcall(L, 0, LUA_MULTRET, 0))

 

LUA_MULTRET也是宏定义,值为-1,表示函数有多个返回值(Lua规则,pil 24.2--堆栈)。

扩展开来就是以下两句:

  1. luaL_loadfile(L, fn);
  2. lua_pcall(L, 0, LUA_MULTRET, 0);

pcall以上述参数执行的时候,会把加载到内存中的源程序编译成可以用于执行的2进制代码,并将全局变量压栈(在Lua中,函数也是变量,pil 2.5 -- Functions,毕竟函数名和函数体是不同的2个东西)。就跟PE文件格式里的Section一样(PE文件就是Windows3.1之后的.exe/.dll文件)。当然如果你不知道什么PE文件也没关系--我只是打个比方--就当成VS2005编译代码时生成的.obj文件。

 

 

虽然实际使用中99%的情况都是直接使用dofile,但是我想将该问题提出来说可以更加直观的理解“动态编译”。

参照:
代码和文字大部分出自 1.   http://blog.csdn.net/caoyanting007/article/details/5709820
                             2.   http://mobile.51cto.com/iphone-285654.htm

posted @ 2012-11-13 10:46 sheng 阅读(3635) | 评论 (0)编辑 收藏
     摘要:   阅读全文
posted @ 2012-08-24 09:39 sheng 阅读(3613) | 评论 (0)编辑 收藏
     摘要: 利用boost解析xml  阅读全文
posted @ 2012-08-23 10:08 sheng 阅读(13209) | 评论 (0)编辑 收藏
在最近做的一个项目中需要用到检测进程状态的功能,在网上兜了半圈,普遍介绍的方法有三种:
1. 是利用GetExitCodeProcess(pi.hProcess,&dwExitCode);通过看dwExitCode返回值是不是STILL_ACTIVE,依然活动,说明存在;
2 .waitforsingleobject,通过超时来判断,具体的实现方法可以去网上查,
3. openprocess,通过返回值来判断,如果返回值为NULL则表示进程已经打开,否则没有打开。
上面3个方法别人都说行,也有人说有局限性,就拿openprocess来说吧,自己在测试是发现线程关掉了但是返回值还是NULL,郁闷啊~~,没办法只能用最土的办法来解决这个问题,
4. load系统的进程表,看进程id是不是匹配,匹配则表示正在运行,否则就已经挂了,代码如下:
#include <Tlhelp32.h>

//如果有运行,返回进程的true,没运行返回false
bool ProcessExist(DWORD process_id) 

PROCESSENTRY32 pe; 
DWORD id = 0; 
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); 
pe.dwSize = sizeof(PROCESSENTRY32); 
if( !Process32First(hSnapshot,&pe) ) 
{
  CloseHandle(hSnapshot);
  return false;
}
 
while(1) 

pe.dwSize = sizeof(PROCESSENTRY32); 
if( Process32Next(hSnapshot,&pe)==FALSE ) 
{
  CloseHandle(hSnapshot);
  return false;
}
if(process_id == pe.th32ProcessID) 


  CloseHandle(hSnapshot);
  return true;
 


}

posted @ 2012-08-22 16:55 sheng 阅读(2721) | 评论 (3)编辑 收藏
先直接上方法
1. 准备好boost编译文件;

2.(我放在D:/cpp目录下)解压到当前文件夹

3.打开VS2010->VS TOOLS->VS命令提示

4.CD D:/cpp/boost_1_46_1 

5.输入bootstrap,便生成bjam.exe文件

6.输入bjam toolset=msvc-10.0 variant=debug,release threading=multi link=static,便生成boost库(20多分钟,时间已经算很短了,之前都是1,2个小时应该是跟这个参数有关,编译完成后为1G多一点,之前都是3.7G左右)

7.修改VS2010的参数 在项目的组合显示那找到属性页,打开属性页,选择配置属性,选择VC++目录,设置includepath和libpath,

如我的为D:/cpp/boost_1_46_1;$(IncludePath)

D:/cpp/boost_1_46_1/stage/lib;$(LibraryPath)

 

图解参照http://blog.csdn.net/respawn/article/details/7588396,这个弄的很清楚。
posted @ 2012-06-18 16:46 sheng 阅读(354) | 评论 (0)编辑 收藏
仅列出标题
共3页: 1 2 3 

导航

<2024年4月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

统计

常用链接

留言簿(1)

随笔档案

收藏夹

同行

搜索

最新评论

阅读排行榜

评论排行榜