2012年3月4日星期日

如何用VC2008编写PHP5的扩展


安装IIS7
以Windows 7为例,在光驱中放入和系统匹配的Windows安装光盘,依次打开“控制面板->程序->打开或关闭Windows功能”,选中“Internet信息服务”。为了让IIS支持PHP,记得勾选中“Internet信息服务->万维网服务->应用程序开发功能->CGI”。
测试
打开浏览器输入http://localhost或http://127.0.0.1。

安装PHP5
下载PHP5的同时,一并把源代码取下来,分别解压缩到C:\PHP-5.2.6 和 C:\PHP-5.2.6-src。把C:\PHP-5.2.6\php.ini-dist 并另存为 php.ini。
打开“IIS管理器->处理程序映射->添加模块映射”对话框,依次
a) 在请求路径中填写*.php;
b) 从模块的下拉列表中选择FastCgiModule;(1)
c) 在可执行文件中填写php-cgi.exe文件的完整路径,例如:C:\PHP-5.2.6\php-cgi.exe;
d) 在名称中随便填写,例如PHPCGI。
测试
添加c:\inetpub\wwwroot\index.php,内容为
打开浏览器输入http://localhost/index.php或http://127.0.0.1/index.php。

安装Cygwin
只要安装sh即可。(2)

生成扩展到源码框架
使用PHP源代码目录下的 ext/ext_skel_win32.php来生成扩展的骨架类。
配置环境变量
需要用到c:\php-5.2.6\php.ini和Cygwin,所以把C:\PHP-5.2.6和C:\Cygwin\bin添加到环境变量PATH中。
生成框架
执行cmd打开一个终端,进入php源代码的ext目录
C:\>cd \php-5.2.6-src\ext
执行php脚本,生产一个名为mytest的扩展到框架
C:\php-5.2.6-src\ext>php ext_skel_win32.php –extname=mytest
编译扩展
用VC2008打开c:\php-5.2.6-src\ext\mytest\mytest.dsp,确认转换工程,选择编译目标为Release_TS,这个时候编译会报一个找不到.lib的错误,在C:\PHP-5.2.6\dev中找到php5ts.lib并添加到项目的依赖中即可。重新正确地编译后,生成的目标库文件会自动保存在c:\php-5.2.6-src\Release_TS\php_mytest.dll。
测试
1) 把php_mytest.dll复制到C:\php-5.2.6\
2) 修改c:\php-5.2.6\php.ini,找到extension_dir = "./" (3)
添加一行extension=php_mytest.dll
3) 编辑c:\inetpub\wwwroot\index.php的内容,改成
4) 重启IIS服务
5) 打开浏览器输入http://localhost/index.php或http://127.0.0.1/index.php。
执行正确时会显示一条Congratulations!的话。

参考文献
在Win32下用VS2008编译PHP扩展 (http://jz123.cn/text/3033828.html)
Windows7 IIS7下以FastCgi和ISAPI方法安装配置PHP5教程(http://www.leapsoul.cn/?p=753)

备注
(1) 如果下拉列表中没有FastCgiModule,请参考章节 安装IIS7 重新确认已安装了“Internet信息服务->万维网服务->应用程序开发功能->CGI”。
(2) ext_skel_win32.php中说要使用Cygwin,实际上只使用到了sh,所以可以用其它sh替代,入MSYS。
(3) extension_dir = "./" 指定了PHP-5.2.6为扩展存放的路径。

2012年1月16日星期一

美女记者那愤怒小鸟般的尖叫则被网友们竟相模仿

 
 

Sent to you by Luss Joy via Google Reader:

 
 

via 我烧网-热文 by 一剑 on 1/13/12

一名女记者在采访台北圆山饭店时,亲自示范地下通道内的滑梯,谁知滑梯又长又陡,吓得女记者尖叫连连!该视频登陆YouTube一日就有超过60万的播放率!而她那愤怒小鸟般的尖叫则被网友们竟相模仿!


 
 

Things you can do from here:

 
 

2011年4月15日星期五

特殊符号de代码

網站: CopyPasteCharacter.com

這個站裡面就把一些常用符號都列出來, 只要點選後, 會自動複製起來(Flash copy), 就可以貼上了.

網站裡面的符號, 還可以做切換, 直接切成 HTML, 也可以直接使用, 下述把常用的先紀錄起來.

  • ← ←
  • → →
  • ↑ ↑
  • ↓ ↓
  • ✔ ✔
  • √ √
  • ★ ★
  • ☆ ☆
  • ☺ ☺
  • ♀ ♀
  • ♂ ♂
  • ✎ ✎
  • « «
  • » »
  • ⌘ ⌘
  • ✿ ✿
  • ♥ ♥
  • ⌥ ⌥
  •  
  • ⌃ ⌃
  • ⇧ ⇧
  • ÷ ÷
  • × ×
  • ™ ™

2011年1月29日星期六

BestFreeVPN无需注册无需下载免费美国VPN

BestFreeVPN是一个2010年新成立的VPN代理网站,该网站提供真正免费VPN代理服务,不需要注册,也不需要下载和安装任何客户端,你只需要每过12小时或者24小时登录官方网站获取新的密码就可以继续使用了。

BestFreeVPN网址:http://www.bestfreevpn.com/

BestFreeVPN在国内已经有很多人在推荐和使用,大家去百度搜索可以看到一堆信息。

BestFreeVPN提供的服务器和用户名都不会变,但是它会每隔12或24小时更改密码。官方介绍说BestFreeVPN提供上至 800Kbit/s下载和512Kbit/s上传带宽免费使用,实际上网速并没有那么快,打开视频网站比较卡。不过,作为 一个免费的VPN服务,它还是很稳定的。

BestFreeVPN提供的是PPTP的连接类型,大家可以自己创建VPN连接来连接这个VPN,他们的免费VPN服务器是:bestfreevpn.com。

如果不会创建VPN连接的,可以我们网站上面的教程

XP用户可以查看《windows xp 设置pptpd vpn上网步骤》

Windows7用户可以查看《Windows7 VPN连接设置详细图文教程》

使用iPhone的用户可以查看《iPhone的VPN如何设置和使用》

BestFreeVPN的VPN下载速度是242kbps,上传速度173kbps。的确很牵强,但是我测试上了一些网站,速度还是可以忍受的。

BestFreeVPN总结:

BestFreeVPN虽然把免费VPN的速度限制得很严了,总体来说速度不快,但是也没到忍受不了的地步。而且,因为有强制的速度限制,BestFreeVPN的稳定性还是很不错的,有需求的人值得一用。

BestFreeVPN网址:http://www.bestfreevpn.com/

GreenVPN - real green

官方网址:http://www.greenvpn.net/index.php

Windows Vista和Windows 7的客户端下载是一个纯文本文件,后缀是.pbk,Google了一下没找到相关资料。anyway,在Windows 7底下这个文件是有个网络连接的图标的,双击后打开了一个类似拨号的程序,应该是操作系统内置支持的一种拨号方式吧。

用法很简单,去官方网站注册一个帐号,填写帐号名,密码和一个邮箱地址,去邮箱收确认信,点一下信里面的确认链接,注册就算完成了。

双击打开.pbk,填上刚注册的帐号名和密码,点一下连接按钮,稍等几秒钟就登进VPN了。

下文转载自:http://www.free-vpn.net/
其实一直有网友向我推荐GreenVPN,不过一直忙,也没得空写日志。后来测试了两次,不知道什么原因也没得连接上,所以没有来真正推荐。今天试用了一下,感觉很不错,所以特地上来写推荐文章。
GreenVPN的免费帐号每个月有200M的流量,对于一般看网页来说,是足够了。
GreenVPN使用说明
1.GreenVPN帐号注册
GreenVPN注册地址:http://www.greenvpn.net/
输入用户名、邮箱、密码,点击“注册”。
2.GreenVPN帐号激活
登录刚才填写的邮箱,点击激活链接激活帐号,然后帐号就可以使用了。
3.GreenVPN的使用
测试出来的速度还很不错,下载速度974kbps,上传速度是185kbps。

2010年12月22日星期三

用IOCTL_BEEP_SET控制System Buzzer

经测试,Vista SP1 32bits上系统蜂鸣器发出了声音。
此外,Vista 64bits, Windows 7上要么不发声音,要么是声卡发出声音。

// 以下宏定义摘自DDK中的头文件
#define FILE_DEVICE_BEEP                0x00000001

#define METHOD_BUFFERED                 0
#define METHOD_IN_DIRECT                1
#define METHOD_OUT_DIRECT               2
#define METHOD_NEITHER                  3

#define FILE_ANY_ACCESS                 0
#define FILE_READ_ACCESS          ( 0x0001 )    // file & pipe
#define FILE_WRITE_ACCESS         ( 0x0002 )    // file & pipe

#define CTL_CODE( DeviceType, Function, Method, Access ) (                 \
    ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method) \
    )

#define IOCTL_BEEP_SET \
    CTL_CODE(FILE_DEVICE_BEEP,0,METHOD_BUFFERED,FILE_ANY_ACCESS)


typedef struct _BEEP_SET_PARAMETERS {
    ULONG Frequency;
    ULONG Duration;
} BEEP_SET_PARAMETERS, *PBEEP_SET_PARAMETERS;

BOOL BeepSet (DWORD dwFreq, DWORD dwDuration)
{
    HANDLE hBeep;
    UNICODE_STRING BeepDevice;
    OBJECT_ATTRIBUTES ObjectAttributes;
    IO_STATUS_BLOCK IoStatusBlock;
    BEEP_SET_PARAMETERS BeepSetParameters;
    NTSTATUS Status;

    /* check the parameters */
    if ((dwFreq >= 0x25 && dwFreq <= 0x7FFF) ||
        (dwFreq == 0x0 && dwDuration == 0x0))
    {
        //      print(L"Beep Params OK\n");
        /* open the device */
        RtlInitUnicodeString(&BeepDevice,
            L"\\Device\\Beep");

        InitializeObjectAttributes(&ObjectAttributes,
            &BeepDevice,
            0,
            NULL,
            NULL);

        Status = NtCreateFile(&hBeep,
            FILE_READ_DATA | FILE_WRITE_DATA,
            &ObjectAttributes,
            &IoStatusBlock,
            NULL,
            0,
            FILE_SHARE_READ | FILE_SHARE_WRITE,
            FILE_OPEN_IF,
            0,
            NULL,
            0);
        if (NT_SUCCESS(Status))
        {
            //          print(L"Createfile worked\n");
            /* Set beep data */
            BeepSetParameters.Frequency = dwFreq;
            BeepSetParameters.Duration = dwDuration;

            Status = NtDeviceIoControlFile(hBeep,
                NULL,
                NULL,
                NULL,
                &IoStatusBlock,
                IOCTL_BEEP_SET,
                &BeepSetParameters,
                sizeof(BEEP_SET_PARAMETERS),
                NULL,
                0);

            /* do an alertable wait if necessary */
            if (NT_SUCCESS(Status) &&
                (dwFreq != 0x0 || dwDuration != 0x0) && dwDuration != (DWORD)-1)
            {
                //              print(L"Beep Sleeping\n");
                SleepEx(dwDuration,
                    TRUE);
            }

            NtClose(hBeep);
        }
    }
    else
        Status = STATUS_INVALID_PARAMETER;

    if (!NT_SUCCESS(Status))
    {
        //      SetLastErrorByStatus (Status);
        return FALSE;
    }

    return TRUE;
}