Error

C++博客 首页 新随笔 联系 聚合 管理
  217 Posts :: 61 Stories :: 32 Comments :: 0 Trackbacks

#

If you define NOMINMAX, because you prefer the STL version, then you may get problems while including gdiplus.h, which uses the min/max macro. As solution you need to include the STL headers and use "using namespace std" before you include the gdiplus.h.

In example:

#define NOMINMAX 
// Include C++ headers
#include <algorithm>
using namespace std;

// Include Windows headers
#include <windows.h>
#include <gdiplus.h>

不能直接在工程中添加NOMINMAX,必须这么处理才能OK
posted @ 2015-05-18 11:55 Enic 阅读(643) | 评论 (0)编辑 收藏

把WriteMiniDump的多线程保护去掉就正常了,太奇葩了把
posted @ 2015-05-15 04:55 Enic 阅读(3017) | 评论 (2)编辑 收藏

// 本质上来说就是自己设置了UnhandleExceptionFilter后,C运行库或者其他什么别的函数也调用了,所以自己设置的就无效了,解决方案就是HOOK SET函数,让别人无法取代自己

很多 C/C++ 程序会设置自己的 Unhandled Exception Filter 用于捕获 Unhandled exceptions 并输出一些信息(例如,创建 mini-dump 或者输出调用栈到日志文件中)。

从 VC++2005 开始出于安全因素微软改变了 CRT 的行为。在以下情况下 CRT 不会通知被注册的 Unhandled Exception Filter:

  1. 调用了 abort() 并且设置 abort 的行为为 _CALL_REPORTFAULT(Release 版本默认使用此设置)
  2. Security Checks 失败时,具体来说就是检查到一些会引发安全问题的堆栈溢出时不会通知被注册的 Unhandled Exception Filter,会引发安全问题的堆栈溢出包括:覆盖了函数的返回值,覆盖了 Exception handler 的地址,覆盖了某些类型的参数。关于编译器的 Security Checks 的内容,详细参考:http://msdn.microsoft.com/en-us/library/Aa290051(注意,此文章谈到的是 Visual Studio .NET 2003,其中 _set_security_error_handler 函数在 VC++2005 以及以上版本已经无法使用)
  3. 如果没有调用 _set_invalid_parameter_handler 设置 Invalid parameter handler 时,检查到了非法的参数

CRT 是通过何种方式使得我们注册的 Unhandled Exception Filter 不被调用的?答案在 CRT 的代码中:

  1. /* 代码来源于 gs_report.c */
  2. /* Make sure any filter already in place is deleted. */
  3. SetUnhandledExceptionFilter(NULL);
  4. UnhandledExceptionFilter(&ExceptionPointers);

CRT 通过调用 SetUnhandledExceptionFilter 并传递参数 NULL 来清除用户注册的 Unhandled Exception Filter。如果期望用户注册的 Unhandled Exception Filter 总是被调用那么应该避免 CRT 中相关的清理代码。做法之一就是修改 CRT 代码并且编译为静态库(微软的 VC++ Libraries 开发 Lead Martyn Lovell 在 https://connect.microsoft.com/feedback/ViewFeedback.aspx?FeedbackID=101337&SiteID=210 谈到过有关的问题),这里并不建议使用此做法。另外一种做法则是改变 SetUnhandledExceptionFilter 的行为,使得 CRT 对 SetUnhandledExceptionFilter 的调用不起任何作用(更加详细的论述可以参考《Windows 核心编程》相关章节)。

  1. // 无法得知此代码来源于
  2. #ifndef _M_IX86
  3. #error "The following code only works for x86!"
  4. #endif
  5.  
  6. // 此函数一旦成功调用,之后对 SetUnhandledExceptionFilter 的调用将无效
  7. void DisableSetUnhandledExceptionFilter()
  8. {
  9. void* addr = (void*)GetProcAddress(LoadLibrary("kernel32.dll"),
  10. "SetUnhandledExceptionFilter");
  11.  
  12. if (addr)
  13. {
  14. unsigned char code[16];
  15. int size = 0;
  16.  
  17. code[size++] = 0x33;
  18. code[size++] = 0xC0;
  19. code[size++] = 0xC2;
  20. code[size++] = 0x04;
  21. code[size++] = 0x00;
  22.  
  23. DWORD dwOldFlag, dwTempFlag;
  24. VirtualProtect(addr, size, PAGE_READWRITE, &dwOldFlag);
  25. WriteProcessMemory(GetCurrentProcess(), addr, code, size, NULL);
  26. VirtualProtect(addr, size, dwOldFlag, &dwTempFlag);
  27. }
  28. }

只需要在注册 Unhandled Exception Filter 之后调用 DisableSetUnhandledExceptionFilter() 函数,那么之后所有对 SetUnhandledExceptionFilter 的调用都将无效,自然 CRT 也无法通过调用 SetUnhandledExceptionFilter 来清除用户注册的 Unhandled Exception Filter。

posted @ 2015-05-15 02:17 Enic 阅读(2404) | 评论 (0)编辑 收藏

之前自己设计Ref类型遇到new出来的地址,和Ref的this指针一致的情况,soui的这套做法一定程度避免了
如果有普通的单根继承直接使用: public 
TObjRefImpl<IRef>
如果是多根继承可以指定析构类型 :public TObjRefImpl2<TDeleteType>
但是多重继承两个Ref类还是没有解决,原则上应该劲量不再非接口是上使用多重继承


  1
 template<class T>
  2 class TObjRefImpl :  public T
  3 {
  4 public:
  5     TObjRefImpl():m_cRef(1)
  6     {
  7     }
  8 
  9     virtual ~TObjRefImpl(){
 10     }
 11 
 12     //!添加引用
 13     /*!
 14     */
 15     virtual long AddRef()
 16     {
 17         return InterlockedIncrement(&m_cRef);
 18     }
 19 
 20     //!释放引用
 21     /*!
 22     */
 23     virtual long Release()
 24     {
 25         long lRet = InterlockedDecrement(&m_cRef);
 26         if(lRet==0)
 27         {
 28             OnFinalRelease();
 29         }
 30         return lRet;
 31     }
 32 
 33     //!释放对象
 34     /*!
 35     */
 36     virtual void OnFinalRelease()
 37     {
 38         delete this;
 39     }
 40 protected:
 41     volatile LONG m_cRef;
 42 };
 43 
 44 template<class T,class T2>
 45 class TObjRefImpl2 :  public TObjRefImpl<T>
 46 {
 47 public:
 48     virtual void OnFinalRelease()
 49     {
 50         delete static_cast<T2*>(this);
 51     }
 52 };
 53 
 54 //CAutoRefPtr provides the basis for all other smart pointers
 55 template <class T>
 56 class CAutoRefPtr
 57 {
 58 public:
 59     CAutoRefPtr() throw()
 60     {
 61         p = NULL;
 62     }
 63     CAutoRefPtr(_In_ int nNull) throw()
 64     {
 65         (void)nNull;
 66         p = NULL;
 67     }
 68     CAutoRefPtr(_In_opt_ T* lp) throw()
 69     {
 70         p = lp;
 71         if (p != NULL)
 72         {
 73             p->AddRef();
 74         }
 75     }
 76 
 77     CAutoRefPtr(const CAutoRefPtr & src) throw()
 78     {
 79         p=src.p;
 80         if(p)
 81         {
 82             p->AddRef();
 83         }
 84     }
 85 
 86     ~CAutoRefPtr() throw()
 87     {
 88         if (p)
 89         {
 90             p->Release();
 91         }
 92     }
 93 
 94     T* operator->() const throw()
 95     {
 96         return p;
 97     }
 98 
 99     operator T*() const throw()
100     {
101         return p;
102     }
103     T& operator*() const
104     {
105         return *p;
106     }
107     //The assert on operator& usually indicates a bug.  If this is really
108     //what is needed, however, take the address of the p member explicitly.
109     T** operator&() throw()
110     {
111         SASSERT(p==NULL);
112         return &p;
113     }
114     bool operator!() const throw()
115     {
116         return (p == NULL);
117     }
118     bool operator<(_In_opt_ T* pT) const throw()
119     {
120         return p < pT;
121     }
122     bool operator!=(_In_opt_ T* pT) const
123     {
124         return !operator==(pT);
125     }
126     bool operator==(_In_opt_ T* pT) const throw()
127     {
128         return p == pT;
129     }
130 
131     T* operator=(_In_opt_ T* lp) throw()
132     {
133         if(*this!=lp)
134         {
135             if(p)
136             {
137                 p->Release();
138             }
139             p=lp;
140             if(p)
141             {
142                 p->AddRef();
143             }
144         }
145         return *this;
146     }
147 
148     T* operator=(_In_ const CAutoRefPtr<T>& lp) throw()
149     {
150         if(*this!=lp)
151         {
152             if(p)
153             {
154                 p->Release();
155             }
156             p=lp;
157             if(p)
158             {
159                 p->AddRef();
160             }
161         }
162         return *this;    
163     }
164 
165     // Release the interface and set to NULL
166     void Release() throw()
167     {
168         T* pTemp = p;
169         if (pTemp)
170         {
171             p = NULL;
172             pTemp->Release();
173         }
174     }
175 
176     // Attach to an existing interface (does not AddRef)
177     void Attach(_In_opt_ T* p2) throw()
178     {
179         if (p)
180         {
181             p->Release();
182         }
183         p = p2;
184     }
185     // Detach the interface (does not Release)
186     T* Detach() throw()
187     {
188         T* pt = p;
189         p = NULL;
190         return pt;
191     }
192     HRESULT CopyTo(_Deref_out_opt_ T** ppT) throw()
193     {
194         if (ppT == NULL)
195             return E_POINTER;
196         *ppT = p;
197         if (p)
198         {
199             p->AddRef();
200         }
201         return S_OK;
202     }
203 
204 protected:
205     T* p;
206 };
struct IObjRef
{
    virtual long AddRef() = 0;

    virtual long Release() = 0;
    
    virtual void OnFinalRelease() =0;
};


posted @ 2015-05-14 10:07 Enic 阅读(309) | 评论 (0)编辑 收藏

使用ThinkPHP开发的过程中应该尽量遵循下列命名规范:

  • 类文件都是以.class.php为后缀(这里是指的ThinkPHP内部使用的类库文件,不代表外部加载的类库文件),使用驼峰法命名,并且首字母大写,例如 DbMysql.class.php
  • 类的命名空间地址和所在的路径地址一致,例如 Home\Controller\UserController类所在的路径应该是 Application/Home/Controller/UserController.class.php
  • 确保文件的命名和调用大小写一致,是由于在类Unix系统上面,对大小写是敏感的(而ThinkPHP在调试模式下面,即使在Windows平台也会严格检查大小写);
  • 类名和文件名一致(包括上面说的大小写一致),例如 UserController类的文件命名是UserController.class.php, InfoModel类的文件名是InfoModel.class.php, 并且不同的类库的类命名有一定的规范;
  • 函数、配置文件等其他类库文件之外的一般是以.php为后缀(第三方引入的不做要求);
  • 函数的命名使用小写字母和下划线的方式,例如 get_client_ip
  • 方法的命名使用驼峰法,并且首字母小写或者使用下划线“_”,例如 getUserName_parseType,通常下划线开头的方法属于私有方法;
  • 属性的命名使用驼峰法,并且首字母小写或者使用下划线“_”,例如 tableName_instance,通常下划线开头的属性属于私有属性;
  • 以双下划线“__”打头的函数或方法作为魔法方法,例如 __call 和 __autoload
  • 常量以大写字母和下划线命名,例如 HAS_ONE和 MANY_TO_MANY
  • 配置参数以大写字母和下划线命名,例如HTML_CACHE_ON
  • 语言变量以大写字母和下划线命名,例如MY_LANG,以下划线打头的语言变量通常用于系统语言变量,例如 _CLASS_NOT_EXIST_
  • 对变量的命名没有强制的规范,可以根据团队规范来进行;
  • ThinkPHP的模板文件默认是以.html 为后缀(可以通过配置修改);
  • 数据表和字段采用小写加下划线方式命名,并注意字段名不要以下划线开头,例如 think_user 表和 user_name字段是正确写法,类似 _username 这样的数据表字段可能会被过滤。

特例:在ThinkPHP里面,有一个函数命名的特例,就是单字母大写函数,这类函数通常是某些操作的快捷定义,或者有特殊的作用。例如:A、D、S、L 方法等等,他们有着特殊的含义,后面会有所了解。

由于ThinkPHP默认全部使用UTF-8编码,所以请确保你的程序文件采用UTF-8编码格式保存,并且去掉BOM信息头(去掉BOM头信息有很多方式,不同的编辑器都有设置方法,也可以用工具进行统一检测和处理),否则可能导致很多意想不到的问题。

开发建议

在使用ThinkPHP进行开发的过程中,我们给出如下建议,会让你的开发变得更轻松:

  • 遵循框架的命名规范和目录规范;
  • 开发过程中尽量开启调试模式,及早发现问题;
  • 多看看日志文件,查找隐患问题;
  • 养成使用I函数获取输入变量的好习惯;
  • 更新或者环境改变后遇到问题首要问题是清空Runtime目录;
posted @ 2015-04-25 18:59 Enic 阅读(197) | 评论 (0)编辑 收藏

所有路径常量都必须以“/”结尾
THINK_PATH 框架目录
APP_PATH 应用目录
RUNTIME_PATH 应用运行时目录(可写)
APP_DEBUG 应用调试模式 (默认为false)
STORAGE_TYPE 存储类型(默认为File)
APP_MODE 应用模式(默认为common)
一般部署目录如下:
www  WEB部署目录(或者子目录)
├─index.php       应用入口文件
├─Apps            应用目录
├─Public          资源文件目录
├─Runtime         运行时目录
└─Think           框架目录
Application
├─Common         应用公共模块
│  ├─Common      应用公共函数目录
│  └─Conf        应用公共配置文件目录
├─Home           默认生成的Home模块
│  ├─Conf        模块配置文件目录
│  ├─Common      模块函数公共目录
│  ├─Controller  模块控制器目录
│  ├─Model       模块模型目录
│  └─View        模块视图文件目录
├─Runtime        运行时目录
│  ├─Cache       模版缓存目录
│  ├─Data        数据目录
│  ├─Logs        日志目录
│  └─Temp        缓存目录
├─Module         模块目录
│  ├─Conf        配置文件目录
│  ├─Common      公共函数目录
│  ├─Controller  控制器目录
│  ├─Model       模型目录
│  ├─Logic       逻辑目录(可选)
│  ├─Service     Service目录(可选)
│  ... 更多分层目录可选
│  └─View        视图目录
控制器类的命名方式是:控制器名(驼峰法,首字母大写)+Controller
控制器文件的命名方式是:类名+class.php(类文件后缀)
默认的欢迎页面其实就是访问的Home模块下面的Index控制器类的index操作方法 我们修改默认的index操作方法如下:
posted @ 2015-04-25 18:57 Enic 阅读(103) | 评论 (0)编辑 收藏

httpd.cfg末尾添加这样一行:
# Virtual hosts
Include conf/extra/httpd-vhosts.conf
然后在这个文件中配置vhosts信息:
监听端口:
Listen 81
文件权限:
<Directory "E:/PHP/LeanThinkPHP/">
Options Indexes FollowSymLinks Includes ExecCGI
AllowOverride All
Require all granted
</Directory>
服务器文档地址:
DocumentRoot "E:/PHP/LeanThinkPHP/"
这样可以跑起来了,其他的东西以后再去具体看文档
http://httpd.apache.org/docs/2.4/vhosts/


目前理解添加一个新的网站需要的事情:
1.打开监听端口
2.使用<Directory/>设置目录权限
3.使用<VirtualHost/>设置网站相关信息
posted @ 2015-04-25 18:34 Enic 阅读(304) | 评论 (0)编辑 收藏

Apache服务器的安装与配置

文档:http://httpd.apache.org/docs/2.4/

指令:http://httpd.apache.org/docs/2.4/mod/core.html

一、配置文件

语法

* 主配置文件httpd.conf,更改只有重启服务才会生效
* 配置中一行一个命令,如果要多行一个命令,则最后以\结束,且与该行最后个字符无其它字符或者空白
* 每行注释以#开头,会被忽略,一行命令符后不能再接注释
* 空行空白字符在配置文件中被忽略
* 配置文件错误检测可以通过 Test Configuration来完成(httpd.exe -w -t -f "D:\Software\GreenSoft\Apache\conf\httpd.conf" -d "D:\Software\GreenSoft\Apache\.")


模块

Related Modules Related Directives
--------------------------------------------
mod_so <IfModule>
LoadModule

* httpd基于模块化,编译配置时,默认会把基本的功能模块加载到服务器内核。
* 对于动态加载的模块可以通过LoadModule指令在任何时候完成。
* <IfModule>可用于条件加载
* Dos命令 httpd.exe -l 可以查看已经加载的模块

* httpd.exe支持的参数指令

-D name : define a name for use in <IfDefine name> directives
-d directory : specify an alternate initial ServerRoot
-f file : specify an alternate ServerConfigFile
-C "directive" : process directive before reading config files
-c "directive" : process directive after reading config files
-n name : set service name and use its ServerConfigFile
-k start : tell Apache to start
-k restart : tell running Apache to do a graceful restart
-k stop|shutdown : tell running Apache to shutdown
-k install : install an Apache service
-k config : change startup Options of an Apache service
-k uninstall : uninstall an Apache service
-w : hold open the console window on error
-e level : show startup errors of level (see LogLevel)
-E file : log startup errors to file
-v : show version number
-V : show compile settings
-h : list available command line options (this page)
-l : list compiled in modules
-L : list available configuration directives
-t -D DUMP_VHOSTS : show parsed settings (currently only vhost settings)
-S : a synonym for -t -D DUMP_VHOSTS
-t -D DUMP_MODULES : show all loaded modules
-M : a synonym for -t -D DUMP_MODULES
-t : run syntax check for config files
-T : start without DocumentRoot(s) check

 

指令作用范围


Related Modules Related Directives
-----------------------------------------
<Directory>
<DirectoryMatch>
<Files>
<FilesMatch>
<Location>
<LocationMatch>
<VirtualHost>

* 指令范围标签可以指定指令生效的范围,其可以嵌套
* 可以通过在<VirtualHost>标签中放置多个指令以同时支持多个虚拟主机站点
* 节点配置参见:http://httpd.apache.org/docs/2.4/sections.html

 

.htaccess文件

* httpd通过在站点目录里面放置.htaccess文件允许配置分散
* .htaccess的语法与主配置文件一致,对于该配置文件的变更只要请求过来会立即生效
* 可以在.htaccess中放置的指令见:http://httpd.apache.org/docs/2.4/mod/directive-dict.html#Context
* 如果有权限配置主配置,则应避免使用.htaccess文件方式来配置,这种方式影响服务器性能
1)配置.htaccess文件后,httpd会查找每个目录的.htaccess文件,不管你实际有没有使用
2)文档被请求的时候,.htaccess文件每次都会被加载

3)httpd会在多层目录中查找.htaccess文件,以应用完整的指令。
4).htaccess中地址重写指令中的正则表达式在每次请求的时候重新编译。
5)安全问题,用户在修改.htaccess使管理员对配置的管理失控。只有设置AllowOverride指令才可以使用户使用指定的指令。

 


* 在.htaccess中配置指令与在主配置中配置Dirctory块可以达到相同效果,但是后者有更好的性能。

Contents of .htaccess file in /www/htdocs/example
AddType text/example .exm

等价于:

Section from your httpd.conf file

<Directory /www/htdocs/example>
AddType text/example .exm
</Directory>


* 禁用.htaccess可以用指令 AllowOverride None

 

二、Apache目录结构

根目录
|-- bin 程序命令目录
|-- build
|-- cgi-bin
|-- conf 配置文件目录
|-- error
|-- htdocs 编译安装时站点目录
|-- icons
|-- include
|-- lib 
|-- logs 默认日志文件存放包括错误日志(error_log)和访问日志(access_log) tail -f access_log可以随时看访问记录, 里面httpd.pid还会记录主进程号
|-- man
|-- manual
|-- modules 模块目录 例如PHP MEMCACHE编译后的模块在这里面

 

Bin目录
|-- ab apache http服务器性能压力测试工具,类似的jmeter loadrunner webbench
|-- apachectl apache的启动命令
|-- apr-1-config
|-- apu-1-config
|-- apxs apache服务器编译和安装扩展的工具,在进行DSO方式模块编译时会用到例如编译PHP时就用到:--with-apxs2=/usr/local/apache/bin/apxs
|-- checkgid
|-- dbmmanage
|-- envvars
|-- envvars-std
|-- htcacheclean 清理磁盘缓存区的命令,一般少用
|-- htdbm
|-- htdigest
|-- htpasswd 建立更新基本认证文件 例如配置nagio监控时候会用到
|-- httpd 为apache的控制命令程序,apachectl执行的时候会调用到httpd
|-- httxt2dbm
|-- logresolve


Conf目录
|-- extra 辅助apache配置文件
| |-- httpd-autoindex.conf
| |-- httpd-dav.conf dav支持配置
| |-- httpd-default.conf apache相关服务配置 如超时时间 保持连接时间
| |-- httpd-info.conf
| |-- httpd-languages.conf 语言支持
| |-- httpd-manual.conf
| |-- httpd-mpm.conf 服务器池管理,如apache模式配置 连接等
| |-- httpd-multilang-errordoc.conf
| |-- httpd-ssl.conf 支持SSL加密配置
| |-- httpd-userdir.conf
| |-- httpd-vhosts.conf 虚拟机配置文件
|-- httpd.conf 主配置文件
|-- magic
|-- mime.types
|-- original

 

三、httpd.conf主配置文件常见配置


ServerRoot "/usr/local/apache2.2.22" apache安装目录
Listen 80 apache端口 
<IfModule !mpm_netware_module>
<IfModule !mpm_winnt_module>
User daemon apache运行用户
Group daemon apache运行组
</IfModule>
</IfModule>
ServerAdmin you@example.com 管理员邮箱
DocumentRoot "/usr/local/apache2.2.22/htdocs" 站点目录,注意最后不要加/线

<Directory /> 根目录权限
Options FollowSymLinks 可以使用符号链接
AllowOverride None
Order deny,allow
Deny from all
</Directory>
<Directory "/usr/local/apache2.2.22/htdocs"> 目录权限 注意Indexes的作用是允许浏览目录
Options Indexes FollowSymLinks
AllowOverride None 禁止用户对目录配置文件.htaccess修改,一般为none
Order allow,deny
Allow from all 
</Directory>

<IfModule dir_module>
DirectoryIndex index.html 站点目录首页文件多个文件用空格隔开
</IfModule>

<FilesMatch "^\.ht"> 防止WEB用户查看以.ht开头的隐藏文件
Order allow,deny
Deny from all
Satisfy All
</FilesMatch>

ErrorLog "logs/error_log" 错误日志
LogLevel warn 警告级别
<IfModule log_config_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined 复合日志格式
LogFormat "%h %l %u %t \"%r\" %>s %b" common 常规日志格式
<IfModule logio_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio 复合日志格式
</IfModule>
CustomLog "logs/access_log" common 默认访问日志格式
</IfModule>

<IfModule alias_module>
ScriptAlias /cgi-bin/ "/usr/local/apache2.2.22/cgi-bin/" CGI别名配置
</IfModule>
<IfModule cgid_module>
</IfModule>

<Directory "/usr/local/apache2.2.22/cgi-bin"> CGI权限访问路径
AllowOverride None
Options None
Order allow,deny
Allow from all
</Directory>
DefaultType text/plain 定义不能确定MIME类型时候使用默认MIME类型,如果服务主要包含text或HTML ,text/plain是一个好选择

<IfModule mime_module>
TypesConfig conf/mime.types
AddType application/x-compress .Z 允许信息在传输中使用mosaic/x 2.1+解压信息 但不是所有浏览器都支持
AddType application/x-gzip .gz .tgz
</IfModule>

<IfModule ssl_module>
SSLRandomSeed startup builtin
SSLRandomSeed connect builtin
</IfModule>

 

四、虚拟主机http_vhost.conf配置文件

NameVirtuaHost *:80 表示基于名称的虚拟主机 *:80表示监听本机所有IP的80端口上提供HTTP服务,*可以设置为具体IP
<VirtualHost *:80>
serveradmin 管理员邮箱
servername 域名
serveralias 别名 可以设置多个域名指向同一个站点
errorlog 错误日志
customlog 访问日志
</VirtualHost>


虚拟主机的配置是局部优先原则,也就是http_vhost.conf配置了,那么就不会从主配置文件http.conf中读取了


五、修改Apache默认站点目录

1、文档路径更改 
DocumentRoot "D:/Software/GreenSoft/Apache/htdocs" 
改成
DocumentRoot "E:/wwwroot/Apache"

2、目录更改
<Directory "D:/Software/GreenSoft/Apache/htdocs">
改成
<Directory "E:/wwwroot/Apache">

 


六、配置多站点方式

方式一 拷贝配置文件,安装新服务
1、将httpd.conf复制一个新的文件httpdNew.conf
2、将httpdNew.conf中的侦听端口改成未使用的自定义的端口。 Listen:8111
3、将httpdNew.conf中的网站目录 DocumentRoot "原绝对路径" 改成 DocumentRoot "新绝对路径"
4、将httpdNew.conf中的权限设置 <Directory "原绝对路径" > 改成 <Directory "新绝对路径" >
5、安装新服务。Dos下进到Apache安装目录下的Bin目录,输入命令 httpd.exe -k install -n "服务名" -f "X:\Apache安装目录根目录\conf\httpdNew.conf"
6、启动新服务。输入命令 httpd -k start


方式二 添加新端口,新虚拟目录的方式
1、httpd.conf在之前侦听端口的基础上,加上新侦听端口 Listen 8333.这样Apache有多个侦听端口
2、httpd.conf中加入虚拟主机支持。加入指令:NameVirtualHost *
3、找到<VirtualHost> definition注释所在位置。加入指令:
<VirtualHost localhost:8333>
ServerName localhost
DocumentRoot "虚拟站点新绝对路径"
</VirtualHost>

 

方式三 建立虚拟主机方式
1、修改虚拟主机配置文件 X:\Apache安装目录根目录\conf\extra\httpd-vhosts.conf文件.加入配置:
<VirtualHost 127.0.1.1:8222>
DocumentRoot "虚拟站点新绝对路径"
ServerName url.com
ErrorLog "虚拟站点新绝对路径/error.log"
</VirtualHost>

2、修改主配置文件X:\Apache安装目录根目录\conf\httpd.conf。去掉#Include conf/extra/httpd-vhosts.conf前面的#号
3、修改主配置文件X:\Apache安装目录根目录\conf\httpd.conf。加目录权限:
<Directory "虚拟站点新绝对路径">
Options Indexes FollowSymLinks MultiViews ExecCGI
AllowOverride All
Order allow,deny
Allow from all
</Directory>
4、重启对应的Apache服务

 

七、配置Apache支持Url重写

1、加载重写模块。httpd.conf中找到#LoadModule rewrite_module modules/mod_rewrite.so,去掉#号
2、httpd.conf中找到AllowOverride None,改成 AllowOverride All (All表示整台服务器上都支持URL规则重写)
3、httpd.conf加入
<Directory "站点绝对路径">
Options FollowSymLinks
AllowOverride All
</Directory>
4、重启Apache服务器并启动服务
5、在URL重写的网站目录下放一个.htaccess文件,文件名是.htaccess。如无此文件或此文件中没定义任何关于URL重写的规则,则重写不会生效。
6、在.htaccess中通过正则表达式映射需要伪静态的页面。URL正则表达式如下:
RewriteEngine on
RewriteRule index.html index.php
RewriteRule (\d+).htmlinfo\.php\?infoid=1
效果为:www.abc.cn/info/info.php?infoid=100 映射为 www.abc.cn/info/100.html


可用于以下用途:
1、http错误的自定义页。格式 ErrorDocument 错误代码 /目录名/名.扩展名
ErrorDocument 404 /errors/notfound.html
ErrorDocument 401 "你权限访问该页面!"

2、拒绝某IP的访问
order allow,deny 
deny from 210.10.56.32 
deny from 219.5.45. 
deny from www.baidu.com
allow from all

3、保护.htaccess文档
4、Url转向(文档迁移,目录更改,显示友好易记的url)。格式:
Redirect /旧目录/旧文档名 新文档名
Redirect 旧目录 新目录

5、更改默认主页
DirectoryIndex 新的缺省名
DirectoryIndex filename.html index.cgi index.pl default.htm

6、反盗链
RewriteEngine on 
RewriteCond %{ HTTP_REFERER } !^RewriteCond [NC] 
RewriteRule .(gif&line;jpg)- [F]  RewriteRule .(gif&line;jpg) http://www.mydomain.com/替代名 [R,L]

 

八、配置反盗链
1、参见 配置Apache支持Url重写 节,配置Apache支持url重写
2、在站点的.htaccess文件中加入
RewriteEngine on
#允许空“HTTP_REFERER”的访问
RewriteCond %{HTTP_REFERER} !^[NC]RewriteCond http://nobing.cn/no.png [R,NC,L]

说明:
R 就是转向的意思
NC 指的是不区分大小写
L 的作用是指明本次转向到此结束,后续的转向不受先前判断语句的影响

多个扩展名用|分隔

 


九、配置缓存

LoadModule cache_module modules/mod_cache.so 
LoadModule mem_cache_module modules/mod_mem_cache.so 
<IfModule mod_cache.c> 
#默认缓存有效期(秒)
CacheDefaultExpire 3600 
CacheMaxExpire 86400 
CacheLastModifiedFactor 0.1 

#禁止缓存某些特定的URL 
CacheDisable /local_files 
#使用特定的存储类型缓存某些特定的URL 
CacheEnable mem /manual 
CacheEnable fd /images 
CacheEnable disk / 
<IfModule mod_mem_cache.c> 
CacheEnable mem / 
MCacheSize 8192 
MCacheMaxObjectCount 10000 
MCacheMinObjectSize 1 
MCacheMaxObjectSize 51200 
#MCacheRemovalAlgorithm LRU 
</IfModule> 
</IfModule>

 

posted @ 2015-04-25 18:10 Enic 阅读(146) | 评论 (0)编辑 收藏

<iomapi>

o<<setfill('0')<<"sssss"<<setw(4)<<a;
     cerr<<o.str().c_str();
posted @ 2015-04-08 16:35 Enic 阅读(111) | 评论 (0)编辑 收藏

1.定义一个类:
local MyApp = class("MyApp", cc.mvc.AppBase)

2.构造函数:
ctor: 构造方法

3.调用基类构造函数:
MyApp.super.ctor(self)

4.enterScene场景跳转:
1)函数原型在AppBase中: enterScene(sceneName, args, transitionType, time, move)
  函数可以接收四个参数,lua语法允许少写参数,默认为nil
  sceneName是要跳转的场景名
  args是传给该场景的构造参数,args需要是一个table
  transitionType是场景切换的过度动画类型
  time是过度时间
  more是过度效果附加参数
2)实际调用会执行到如下代码:
  // 在Lua中字符串连接操作符是两个点 (`..´)
  // lua的require将会把.转义成路径分割符?转义成模块名
  local scenePackageName = self.packageRoot .. ".scenes." .. sceneName
  local sceneClass = require(scenePackageName)
  local scene = sceneClass.new(unpack(checktable(args)))
3)可以通过enterScene将指定的参数传递到指定场景的构造函数
  self:endterScene("MainScene", {“你好”, “cocos”})
  MainScene:ctor(arg1, arg2)
 
5.不一样的类定义?
local MainScene = class("MainScene", function()    
 return display.newScene("MainScene")
end)
这片代码是定义一个名为MainScene的场景类,并且赋值给local变量
1.display.newScene("MainScene")实际会调用底层代码创建一个没有名字的场景
2.NodeEvent可以控制一组事件是否开启监听
3.MainScene的最后一行是return MainScene,所以需要引用这个场景的时候值需要:
  local MainScene = require("app.scenes.MainScene");

 
 
 
Q1.“类定义”的两种写法具体的意义和区别是什么?

Q2.require会不会让被require的脚本重新执行一次,如果是return了模块中的lcoal变量,是不是每次返回的都将是同一个值?

posted @ 2015-04-06 16:56 Enic 阅读(233) | 评论 (1)编辑 收藏

仅列出标题
共22页: First 2 3 4 5 6 7 8 9 10 Last