工具VC6中文版运行vc6 新建=>工程
选择win32 Console application
工程名称demo1
新建文件=>新建文本 保存到demo1目录下,命名为 demo1.cpp
在 Source files右键添加文件到目录, 选择demo1.cpp 复制代码
//iostream 库的基础是两种命名为 istream 和 ostream 的类型,分别表示输入流和输出流。流是指要从某种 IO 设备上读入或写出的字符序列
#include <iostream>
//主函数必有
int main()
{
// cin输入
// cout输出
// endl 是一个特殊值,称为操纵符,将它写入输出流时,具有输出换行的效果,并刷新与设备相关联的缓冲区。通过刷新缓冲区,用户可立即看到写入到流中的输出。
std::cout << "Enter two numbers:" << std::endl;
int v1, v2;
std::cin >> v1 >> v2;
std::cout << "The sum of " << v1 << " and " << v2
<< " is " << v1 + v2 << std::endl;
//如果不写这个,窗口直接关闭
std::cin >> v1 >> v2;
return 0;
}
按F7 运行, 生成demo1.exe 哈哈
选择win32 Console application
工程名称demo1
新建文件=>新建文本 保存到demo1目录下,命名为 demo1.cpp
在 Source files右键添加文件到目录, 选择demo1.cpp 复制代码
//iostream 库的基础是两种命名为 istream 和 ostream 的类型,分别表示输入流和输出流。流是指要从某种 IO 设备上读入或写出的字符序列
#include <iostream>
//主函数必有
int main()
{
// cin输入
// cout输出
// endl 是一个特殊值,称为操纵符,将它写入输出流时,具有输出换行的效果,并刷新与设备相关联的缓冲区。通过刷新缓冲区,用户可立即看到写入到流中的输出。
std::cout << "Enter two numbers:" << std::endl;
int v1, v2;
std::cin >> v1 >> v2;
std::cout << "The sum of " << v1 << " and " << v2
<< " is " << v1 + v2 << std::endl;
//如果不写这个,窗口直接关闭
std::cin >> v1 >> v2;
return 0;
}
按F7 运行, 生成demo1.exe 哈哈
<?php
/**
* demo
*/
$doc = array (
array ("哈哈", "测试哦", "12313123"),
array ("Marlene", "Lucy", "Lina"),
array ("哈哈", "测试哦", "12313123"),
array ("Marlene", "Lucy", "Lina"),
);
$m = excel::get_xml('测试下载',$doc);
/**
* excel下载
*
*/
class excel
{
/**
* Header of excel document (prepended to the rows)
*
* Copied from the excel xml-specs.
*
* @access private
* @var string
*/
static private $header = "<?xml version=\"1.0\" encoding=\"UTF-8\"?\>
<Workbook xmlns=\"urn:schemas-microsoft-com:office:spreadsheet\"
xmlns:x=\"urn:schemas-microsoft-com:office:excel\"
xmlns:ss=\"urn:schemas-microsoft-com:office:spreadsheet\"
xmlns:html=\"http://www.w3.org/TR/REC-html40\">";
/**
* Footer of excel document (appended to the rows)
*
* Copied from the excel xml-specs.
*
* @access private
* @var string
*/
static private $footer = "</Workbook>";
/**
* Document lines (rows in an array)
*
* @access private
* @var array
*/
static private $lines = array ();
/**
* Worksheet title
*
* Contains the title of a single worksheet
*
* @access private
* @var string
*/
static private $worksheet_title = "Table1";
/**
* Add a single row to the $document string
*
* @access private
* @param array 1-dimensional array
* @todo Row-creation should be done by $this->addArray
*/
static private function addRow ($array)
{
$cells = "";
foreach ($array as $k => $v):
$cells .= "<Cell><Data ss:Type=\"String\">" . $v. "</Data></Cell>\n";
endforeach;
self::$lines[] = "<Row>\n" . $cells . "</Row>\n";
}
/**
* Add an array to the document
*
* This should be the only method needed to generate an excel
* document.
*
* @access public
* @param array 2-dimensional array
* @todo Can be transfered to __construct() later on
*/
static function addArray ($array)
{
// run through the array and add them into rows
foreach ($array as $k => $v):
self::addRow ($v);
endforeach;
}
/**
* Set the worksheet title
*
* Checks the string for not allowed characters (:\/?*),
* cuts it to maximum 31 characters and set the title. Damn
* why are not-allowed chars nowhere to be found? Windows
* help's no help...
*
* @access public
* @param string $title Designed title
*/
static function setWorksheetTitle ($title)
{
// strip out special chars first
$title = preg_replace ("/[\\\|:|\/|\?|\*|\[|\]]/", "", $title);
// now cut it to the allowed length
$title = substr ($title, 0, 31);
// set title
self::$worksheet_title = $title;
}
/**
* Generate the excel file
*
* Finally generates the excel file and uses the header() function
* to deliver it to the browser.
*
* @access public
* @param string $filename Name of excel file to generate (...xls)
*/
static function generateXML ($filename)
{
// deliver header (as recommended in php manual)
header("Content-Type: application/vnd.ms-excel; charset=UTF-8");
header("Content-Disposition: inline; filename=\"" . $filename . ".xls\"");
// print out document to the browser
// need to use stripslashes for the damn ">"
echo stripslashes ( self::$header);
echo "\n<Worksheet ss:Name=\"" . self::$worksheet_title . "\">\n<Table>\n";
echo "<Column ss:Index=\"1\" ss:AutoFitWidth=\"0\" ss:Width=\"110\"/>\n";
echo implode ("\n", self::$lines);
echo "</Table>\n</Worksheet>\n";
echo self::$footer;
}
static function get_xml($name,$array)
{
self::addArray ( $array );
self::generateXML ($name);
}
}
?>
环境:win7 + vs2008 + cygwin + webserver环境(php5.2.13) php5.2.15源码包
生成过程如下:
1、环境配置,安装cygwin,这个在生成PHP扩展的框架时有用到,我的安装目录为e:\cygwin
下载地址http://www.cygwin.com/setup.exe
2、安装webserver 下载地址 http://blog.lrenwang.com/down/other/webserver.rar
3、下载php5.2.15源码包,下载地址:http://www.php.net/get/php-5.2.15.tar.gz/from/this/mirror (我的是在D:\webserver\c\php)
D:\webserver\c\php\ext_skel_win32.php中的$cygwin_path变量设置成了MSYS的BIN目录
$cygwin_path = 'e:\cygwin\bin';
4、安装vs2008,这个时间会久一些
5、如果以上的一切都安装好了,那么转第6步,我们开始开发扩展test
6、在命令行中,cd进入D:\webserver\c\php\ext\目录,输入D:\webserver\php\php.exe ext_skel_win32.php --extname=test,
此时在ext目录下会生成test文件夹及在此文件夹下与扩展相关的文件,包括php_test.h,test.c文件等。
如果php.exe所在目录没有加到PATH中,请在php.exe前面加程序的完整路径
7、打开vs2008,新建基于已有文件的项目,选择VC++,选择文件所在目录,输入项目名称 php_test , 下一步,在项目类型:中选择 动态链接库,next直到完成。
8、修改源码,
打开php_test.h文件,找到PHP_FUNCTION(confirm_test_compiled);在其下面增加一个扩展函数声明:PHP_FUNCTION(test_echo);
打开test.c文件,找到zend_function_entry test_functions[],在其元素中添加 PHP_FE(test_echo, NULL)
在test.c文件中添加如下代码
PHP_FUNCTION(test_echo)
{
char *arg = NULL;
int arg_len, len;
char *strg;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &arg, &arg_len) == FAILURE) {
return;
}
len = spprintf(&strg, 0, "This is %s's extension.the input string is %s.", "test", arg);
RETURN_STRINGL(strg, len, 0);
}
9、按F7 build此项目,此时会有文件找不到报错,此乃php部分源码没有包含的原因,右键项目属性,
选择【属性配置】-> 【C/C++】-> 【常规】-> 【附加包含目录】,
将源码根目录,main目录,TSRM目录,Zend目录添加到此处我的是
(”D:\webserver\c\php;D:\webserver\c\php\main;D:\webserver\c\php\TSRM;D:\webserver\c\php\Zend”)
10、继续build,此时可能会显示zend_config.h文件找不到,此时为部分宏没有定义,解决方案:
选择项目属性,选择【属性配置】-> 【C/C++】-> 【预定义】-> 【预定义处理器】,在此处理添加
ZEND_DEBUG=0;COMPILE_DL_test;ZTS;ZEND_WIN32;PHP_WIN32;HAVE_test=1;
对于不同的扩展可以将COMPILE_DL_test和HAVE_test中的test替换成你的扩展名
12、继续build,此时可能会显示fatal error LNK1120,
解决方案:打开项目属性,选择【属性配置】-> 【连接器】->【输入】->【Additional Dependencies】,在此处添加php5ts.lib,
D:\webserver\c\php\dev\php5ts.lib
另外需要在【工具】->【选项】->【项目和解决方案】->【VC++ 目录】,在【显示以下内容目录:】下拉中,选择库文件,将php5ts.lib所在的路径添加进来,此文件存在于 二进制版本的dev/lib目录下。
13、右键solution属性,将Configuration选择为Release
14、build,在ext\test\Release下会有生成你一个以你的项目名为名称的dll文件(我的为php_test.dll)
15、将php_test.dll文件拷贝到机器中运行的php所在的ext目录,修改php.ini文件,添加一行:extension=php_test.dll,重启apache,
16,运行一个包含了 echo test_echo(”phppan.com”);语句的php文件,可以看到有输出This is test’s extension.the input string is phppan.com.
如果你在启动apache中有报错为:
PHP Warning: PHP Startup: test: Unable to initialize module\nModule compiled with build ID=API20090626,TS\nPHP compiled with build ID=API20090626,TS,VC6\nThese options need to match\n in Unknown on line 0
Warning: PHP Startup: test: Unable to initialize module
Module compiled with build ID=API20090626,TS
PHP compiled with build ID=API20090626,TS,VC6
These options need to match
in Unknown on line 0
你需要在main/config.w32.h中添加如下语句
#define PHP_COMPILER_ID “VC6″
生成过程如下:
1、环境配置,安装cygwin,这个在生成PHP扩展的框架时有用到,我的安装目录为e:\cygwin
下载地址http://www.cygwin.com/setup.exe
2、安装webserver 下载地址 http://blog.lrenwang.com/down/other/webserver.rar
3、下载php5.2.15源码包,下载地址:http://www.php.net/get/php-5.2.15.tar.gz/from/this/mirror (我的是在D:\webserver\c\php)
D:\webserver\c\php\ext_skel_win32.php中的$cygwin_path变量设置成了MSYS的BIN目录
$cygwin_path = 'e:\cygwin\bin';
4、安装vs2008,这个时间会久一些
5、如果以上的一切都安装好了,那么转第6步,我们开始开发扩展test
6、在命令行中,cd进入D:\webserver\c\php\ext\目录,输入D:\webserver\php\php.exe ext_skel_win32.php --extname=test,
此时在ext目录下会生成test文件夹及在此文件夹下与扩展相关的文件,包括php_test.h,test.c文件等。
如果php.exe所在目录没有加到PATH中,请在php.exe前面加程序的完整路径
7、打开vs2008,新建基于已有文件的项目,选择VC++,选择文件所在目录,输入项目名称 php_test , 下一步,在项目类型:中选择 动态链接库,next直到完成。
8、修改源码,
打开php_test.h文件,找到PHP_FUNCTION(confirm_test_compiled);在其下面增加一个扩展函数声明:PHP_FUNCTION(test_echo);
打开test.c文件,找到zend_function_entry test_functions[],在其元素中添加 PHP_FE(test_echo, NULL)
在test.c文件中添加如下代码
PHP_FUNCTION(test_echo)
{
char *arg = NULL;
int arg_len, len;
char *strg;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &arg, &arg_len) == FAILURE) {
return;
}
len = spprintf(&strg, 0, "This is %s's extension.the input string is %s.", "test", arg);
RETURN_STRINGL(strg, len, 0);
}
9、按F7 build此项目,此时会有文件找不到报错,此乃php部分源码没有包含的原因,右键项目属性,
选择【属性配置】-> 【C/C++】-> 【常规】-> 【附加包含目录】,
将源码根目录,main目录,TSRM目录,Zend目录添加到此处我的是
(”D:\webserver\c\php;D:\webserver\c\php\main;D:\webserver\c\php\TSRM;D:\webserver\c\php\Zend”)
10、继续build,此时可能会显示zend_config.h文件找不到,此时为部分宏没有定义,解决方案:
选择项目属性,选择【属性配置】-> 【C/C++】-> 【预定义】-> 【预定义处理器】,在此处理添加
ZEND_DEBUG=0;COMPILE_DL_test;ZTS;ZEND_WIN32;PHP_WIN32;HAVE_test=1;
对于不同的扩展可以将COMPILE_DL_test和HAVE_test中的test替换成你的扩展名
12、继续build,此时可能会显示fatal error LNK1120,
解决方案:打开项目属性,选择【属性配置】-> 【连接器】->【输入】->【Additional Dependencies】,在此处添加php5ts.lib,
D:\webserver\c\php\dev\php5ts.lib
另外需要在【工具】->【选项】->【项目和解决方案】->【VC++ 目录】,在【显示以下内容目录:】下拉中,选择库文件,将php5ts.lib所在的路径添加进来,此文件存在于 二进制版本的dev/lib目录下。
13、右键solution属性,将Configuration选择为Release
14、build,在ext\test\Release下会有生成你一个以你的项目名为名称的dll文件(我的为php_test.dll)
15、将php_test.dll文件拷贝到机器中运行的php所在的ext目录,修改php.ini文件,添加一行:extension=php_test.dll,重启apache,
16,运行一个包含了 echo test_echo(”phppan.com”);语句的php文件,可以看到有输出This is test’s extension.the input string is phppan.com.
如果你在启动apache中有报错为:
PHP Warning: PHP Startup: test: Unable to initialize module\nModule compiled with build ID=API20090626,TS\nPHP compiled with build ID=API20090626,TS,VC6\nThese options need to match\n in Unknown on line 0
Warning: PHP Startup: test: Unable to initialize module
Module compiled with build ID=API20090626,TS
PHP compiled with build ID=API20090626,TS,VC6
These options need to match
in Unknown on line 0
你需要在main/config.w32.h中添加如下语句
#define PHP_COMPILER_ID “VC6″
在使用其它MS-DOS命令时打印正文文件。
如果输出设备连接到系统的串行口或并行口,则该命令可以在后台打印。
语法 :
PRINT [/D:device] [/B:size] [/U:ticks1] [/M:ticks2] [/S:ticks3]
[/Q:qsize] [/T] [[drive:][path]filename[ ...]] [/C] [/P]
使用下列语法按默认参数安装PRINT或不影响打印队列显示打印队列的内容:
PRINT
参数 :
[drive:][path]filename
指定要打印的一个或多个文件位置和文件名。可在一行上包括多个文件(一般最多为10个)。
开关 :
/D:device
指定打印设备名。并行口的合法值为LPT1、LPT2、LPT3。串行口的合法值为COM1、COM2、COM3和COM4。默认值为LPT1,它也称为PRN。/D开关必须位于文件名前。
/B:size
设置内部缓冲区的大小(单位为字节),缓冲区用于在把数据送给打印机前存储数据。缓冲区大小的最小和默认值为512;最大值为16384。增大该值会减少系统的可用内存,但会加快打印速度。
/U:ticks1
指定PRINT等待打印机可用的最大时钟数(每秒有18个时钟)。如果在指定的时间片内打印机不可用,则不打印。ticks1的值必须在1到255之间。其默认值为1。
/M:ticks2
指定PRINT打印一个字符可花费的最大时钟数。ticks2的值在1到255之间,其默认值为2。如果打印字符速度太慢,MS-DOS会显示一条错误消息。
/S:ticks3
指定MS-DOS调度程序分配给后台打印的时钟数。ticks3的值在1到255之间。其默认值为8。增大该值可加快打印,但会降低其它程序的运行速度。
/Q:qsize
指定打印队列中的最大文件数。qsize的值必须在4至32之间。默认值为10。
/T
从打印队列中删除所有文件。
/C
从打印队列中删除文件。可在命令行上同时使用/C和/P开关。
当/C开关位于文件名列表之前时,它适用于/C开关之后的所有文件,直到碰到/P开关,在这种情况,/P开关适用于它前面的文件。
当/C开关在文件名之后,它适用于/C开关前的文件及/C开关后的所有文件,直到碰到/P开关,在这种情况,/P开关适用于它前面的文件。
/P
在打印队列中加入文件。可在命令行上同时使用/C和/P开关。
当/P开关位于文件名列表之前时,它适用于/P开关后的所有文件,直到碰到/C开关。在这种情况,/C开关适用于它之前的文件。
当/P开关位于文件名之后时,它适用于/P开关前和/P开关之后的所有文件,直到碰到/C开关为止。在这种情况,/C开关适用于它之前的文件。
相关命令:
关于配置连接到并行口的打印机的信息,请参阅命令。
关于显示打印机状态的信息,请参阅命令。
关于配置连接到串行口的打印机的信息,请参阅命令。
关于准备打印机字符集切换的信息,请参阅命令。
--------------------------------------------------------------------------------
PRINT─注解
打印队列项的长度
每个打印队列项最多64个字符.每个打印队列项包括驱动器字母,目录和子目录。
开关限制
启动MS-DOS后第一次使用PRINT命令时,才能使用/D、/B、/U、/M、/S和/Q开关。在使用PRINT后要再次使用这些开关时,必须重新启动计算机。
尽可能地使用应用程序自身的打印命令
许多应用程序自身具有打印命令.应使用应用程序自身的打印命令去打印该应用程序创建的文件。
--------------------------------------------------------------------------------
PRINT─例子
要查看打印队列的状态,可键入以下命令:
print
MS-DOS会显示正在打印的文件名(如果有的话)、队列中的文件名,如果有错误,还会显示错误信息。
以下命令从打印队列中删除PENCIL.TST文件:
print a:pencil.tst /c
以下命令从打印队列中删除PENCIL.TST文件,并加入PEN.TST文件:
print pincil.tst /c pen.tst /p
下列命令中使用的开关为启动计算机后第一次使用PRINT命令时才能使用的开关。
以下命令为LPT1设置打印队列:
print /d:lpt1
要指定PRINT命令为打印机可用等待60个时钟数,并为后台打印分配25个时钟数(而非默认的8个时间片),可使用如下命令:
print /u:60 /s:25
下例指定PRINT打印每个字符最多花费4个时钟数(而非默认的2个时间片):
print /m:4
要改变打印队列中的最大文件数,可使用如下带/Q开关的PRINT命令:
print /q:32
如果输出设备连接到系统的串行口或并行口,则该命令可以在后台打印。
语法 :
PRINT [/D:device] [/B:size] [/U:ticks1] [/M:ticks2] [/S:ticks3]
[/Q:qsize] [/T] [[drive:][path]filename[ ...]] [/C] [/P]
使用下列语法按默认参数安装PRINT或不影响打印队列显示打印队列的内容:
参数 :
[drive:][path]filename
指定要打印的一个或多个文件位置和文件名。可在一行上包括多个文件(一般最多为10个)。
开关 :
/D:device
指定打印设备名。并行口的合法值为LPT1、LPT2、LPT3。串行口的合法值为COM1、COM2、COM3和COM4。默认值为LPT1,它也称为PRN。/D开关必须位于文件名前。
/B:size
设置内部缓冲区的大小(单位为字节),缓冲区用于在把数据送给打印机前存储数据。缓冲区大小的最小和默认值为512;最大值为16384。增大该值会减少系统的可用内存,但会加快打印速度。
/U:ticks1
指定PRINT等待打印机可用的最大时钟数(每秒有18个时钟)。如果在指定的时间片内打印机不可用,则不打印。ticks1的值必须在1到255之间。其默认值为1。
/M:ticks2
指定PRINT打印一个字符可花费的最大时钟数。ticks2的值在1到255之间,其默认值为2。如果打印字符速度太慢,MS-DOS会显示一条错误消息。
/S:ticks3
指定MS-DOS调度程序分配给后台打印的时钟数。ticks3的值在1到255之间。其默认值为8。增大该值可加快打印,但会降低其它程序的运行速度。
/Q:qsize
指定打印队列中的最大文件数。qsize的值必须在4至32之间。默认值为10。
/T
从打印队列中删除所有文件。
/C
从打印队列中删除文件。可在命令行上同时使用/C和/P开关。
当/C开关位于文件名列表之前时,它适用于/C开关之后的所有文件,直到碰到/P开关,在这种情况,/P开关适用于它前面的文件。
当/C开关在文件名之后,它适用于/C开关前的文件及/C开关后的所有文件,直到碰到/P开关,在这种情况,/P开关适用于它前面的文件。
/P
在打印队列中加入文件。可在命令行上同时使用/C和/P开关。
当/P开关位于文件名列表之前时,它适用于/P开关后的所有文件,直到碰到/C开关。在这种情况,/C开关适用于它之前的文件。
当/P开关位于文件名之后时,它适用于/P开关前和/P开关之后的所有文件,直到碰到/C开关为止。在这种情况,/C开关适用于它之前的文件。
相关命令:
关于配置连接到并行口的打印机的信息,请参阅命令。
关于显示打印机状态的信息,请参阅命令。
关于配置连接到串行口的打印机的信息,请参阅命令。
关于准备打印机字符集切换的信息,请参阅命令。
--------------------------------------------------------------------------------
PRINT─注解
打印队列项的长度
每个打印队列项最多64个字符.每个打印队列项包括驱动器字母,目录和子目录。
开关限制
启动MS-DOS后第一次使用PRINT命令时,才能使用/D、/B、/U、/M、/S和/Q开关。在使用PRINT后要再次使用这些开关时,必须重新启动计算机。
尽可能地使用应用程序自身的打印命令
许多应用程序自身具有打印命令.应使用应用程序自身的打印命令去打印该应用程序创建的文件。
--------------------------------------------------------------------------------
PRINT─例子
要查看打印队列的状态,可键入以下命令:
MS-DOS会显示正在打印的文件名(如果有的话)、队列中的文件名,如果有错误,还会显示错误信息。
以下命令从打印队列中删除PENCIL.TST文件:
print a:pencil.tst /c
以下命令从打印队列中删除PENCIL.TST文件,并加入PEN.TST文件:
print pincil.tst /c pen.tst /p
下列命令中使用的开关为启动计算机后第一次使用PRINT命令时才能使用的开关。
以下命令为LPT1设置打印队列:
print /d:lpt1
要指定PRINT命令为打印机可用等待60个时钟数,并为后台打印分配25个时钟数(而非默认的8个时间片),可使用如下命令:
print /u:60 /s:25
下例指定PRINT打印每个字符最多花费4个时钟数(而非默认的2个时间片):
print /m:4
要改变打印队列中的最大文件数,可使用如下带/Q开关的PRINT命令:
print /q:32
mkdir /bat
vi /bat/sqlbak
#!/bin/sh
/usr/local/webserver/mysql/bin/mysqldump -uroot -p123456 test> /data/bak/sql/test_$(date -d "day" +"%Y%m%d").sql
chmod +x vi /bat/sqlbak
加入定时计划 crontab -e
每天晚上5点备份数据库
操作系统 centos5
vi /bat/sqlbak
#!/bin/sh
/usr/local/webserver/mysql/bin/mysqldump -uroot -p123456 test> /data/bak/sql/test_$(date -d "day" +"%Y%m%d").sql
chmod +x vi /bat/sqlbak
加入定时计划 crontab -e
每天晚上5点备份数据库
00 17 * * * /bat/sqlbak
操作系统 centos5






