注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

又一个部落格

换过很多备忘录,不知道这本怎么样!

 
 
 

日志

 
 

第一个cpp php 扩展  

2010-03-15 17:59:06|  分类: c++ |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

环境:
windows 7
apache 2.2
php5.3.11
需要下载php的源代码包,编译用.地址:http://cn2.php.net/get/php-5.2.11.tar.bz2/from/a/mirror
编译器:  vs2008


第一步
用vs2008创建项目
文件 - 新建 - 项目 - Visual C++ - Win32 - Win32项目
填写项目名称后 点确定

第一个cpp php 扩展 - happy dog - 又一个部落格
接下来会出现创建项目的向导,
点下一步
然后选择dll,点完成 创建项目就完成了.

第一个cpp php 扩展 - happy dog - 又一个部落格


第二步
设置vs编译扩展的环境
右键单击项目,选择属性
选择 配置属性 - c/c++ - 常规 - 附加包含目录
点击后面的 ... 添加已经下载下来的php5.3.11源代码中的4个文件
D:\php-5.2.11\main
D:\php-5.2.11\regex
D:\php-5.2.11\Zend
D:\php-5.2.11\TSRM
D:\php-5.2.11

第一个cpp php 扩展 - happy dog - 又一个部落格


接下来添加预定头
选择 配置属性 - c/c++ - 预处理器 - 预处理器定义
点击后面的 ... 添加下面几项
PHP_WIN32
ZEND_WIN32
ZTS=1
ZEND_DEBUG=0

第一个cpp php 扩展 - happy dog - 又一个部落格


接下来要告诉编译器,在哪里可以找到php库
这个目录指向非源代码的php文件夹,是已经安装的php文件夹
我现在的目录是 D:\php-5.2.11-Win32\dev
选择 配置属性 - 链接器 - 常规 - 附加库目录
点击后面的 ... 添加D:\php-5.2.11-Win32\dev

第一个cpp php 扩展 - happy dog - 又一个部落格
选择 配置属性 - 链接器 - 输入 - 附加依赖项
点击后面的 ... 添加php5ts.lib

第一个cpp php 扩展 - happy dog - 又一个部落格
选择 配置属性 - 链接器 - 命令行
添加 /FORCE:MULTIPLE
第一个cpp php 扩展 - happy dog - 又一个部落格
最后为输出的dll文件取个名字
选择 配置属性 - 链接器 - 常规 - 输出文件
写入 $(OutDir)\php_talkphp.dll
第一个cpp php 扩展 - happy dog - 又一个部落格
第三步
接下来就开始编写程序了
首先修改头文件 stdafx.h
删除原先所有代码 用下面的这段代码代替

#pragma once

// Include the Zend Win32 header and the general PHP header
#include "zend_config.w32.h"
#include "php.h"

然后,需要对 zend_config.w32.h 这个文件做一点点改动,vs2008才能正常编译. 具体为什么要这样做还不知道
右键单击 #include "zend_config.w32.h" 这一样 然后 选择 打开文档"zend_config.w32.h"
注释掉第 51行

最后修改talkphp_ext.cpp 代码如下

#include "stdafx.h"

//告诉zend,我们要扩展的函数
ZEND_FUNCTION(fetch_talkphp_links);

//这里必须是 {NULL, NULL, NULL} 结尾,用来告诉zend,函数列表到达尾部了
zend_function_entry talkphp_ext_functions[] = {
ZEND_FE(fetch_talkphp_links, NULL)
{NULL, NULL, NULL}
};

//定义 zend_module_entry结构,
zend_module_entry talkphp_ext_module_entry = {
STANDARD_MODULE_HEADER, //这里实际上有四个参数, size, zend_api, zend_debug and zts status,现在用 STANGARD_MODULE_HEADER 宏代替
"TalkPHP Extension", //扩展的描述
talkphp_ext_functions, //指向刚才定义的 zend_function_entry 数组
NULL, NULL, NULL, NULL, NULL, //这里实际是5行, 分别是
//int (*module_startup_func)(INIT_FUNC_ARGS);
//int (*module_shutdown_func)(SHUTDOWN_FUNC_ARGS);
//int (*request_startup_func)(INIT_FUNC_ARGS);
//int (*request_shutdown_func)(SHUTDOWN_FUNC_ARGS);
//void (*info_func)(ZEND_MODULE_INFO_FUNC_ARGS);
//int (*module_shutdown_func)(SHUTDOWN_FUNC_ARGS);
"1.0",
STANDARD_MODULE_PROPERTIES
};

//告诉Zend引擎,我们的扩展是一个动态地加载的模块,而不是作为一个模块内置到PHP.几乎所有的扩展都是这样
ZEND_GET_MODULE(talkphp_ext);

ZEND_FUNCTION(fetch_talkphp_links)
{
bool useHtml = false;
char *link = "";
//下面第二个参数的意思是 ,希望接受到一个 可选的 布尔型参数,比如 "sb|l" 的意思是
// 希望接收到一个字符串,一个布尔型,和一个可选的长整形参数
//第三个参数是表示,要把接受到的值赋值给哪个变量
/* 下面是 字母对应的 变量
b = Boolean
s = String
l = Long
d = Double

(the following are all stored in a zval struct)

a = Array
o = Object of any class type
O = Object of the specified class entry
r = Resource
z = zval

Special identifier:

| = Optional parameter
*/
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|b", &useHtml) == FAILURE)
{
RETURN_STRING("Missing Parameter", true);
}

if (useHtml == true)
{
link = "<a href=\"http://www.talkphp.com\">Visit TalkPHP.com!</a>";
}
else
{
link = "http://www.talkphp.com";
}

RETURN_STRING(link, true);
}


第四步
编译程序 非常简单 按F7
默认会在工程的debug文件夹中生成 一个php_talkphp.dll文件

第五部
测试程序
首先把php_talkphp.dll文件拷贝到 php的 ext文件夹中
编辑php.ini 加入
;extension=php_xmlrpc.dll
;extension=php_xsl.dll
;extension=php_zip.dll
;加入下面这句
extension=php_talkphp.dll
重启 apache

运行phpinfo() 会看到已经加载成功扩展
第一个cpp php 扩展 - happy dog - 又一个部落格
写一个测试页面
<?php
echo fetch_talkphp_links() . "<br />";
echo fetch_talkphp_links(true) . "<br />";


第一个cpp php 扩展 - happy dog - 又一个部落格


  评论这张
 
阅读(640)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017