认真读懂php.exe是如何启动php4st.dll并向其传递数据的代码就知道该如何做了

解决方案 »

  1.   

    您的意思是直接调用php4ts.dll吗? php.exe并不提供功能性的代码,功能性代码是在php4ts.dll中实现的, 是这样吗? 谢谢!
      

  2.   

    我粗略的看了看源代码,发现只能处理整个php文件,没有单独处理一条php script的功能。 这样子对于我来说,效率依然很低啊。 各位高人有什么好的办法吗?
      

  3.   

    uuq:你有好的方法解决这个问题吗?
      

  4.   

    在C里执行PHP很简单,只需连接php4embed.lib这个库就行了。
      

  5.   

    我用vb 调用过php , 也是和你一样,用通道重定向的方法。
    vb 功能弱,所以才 让php脚本来执行某些功能,  c/c++ 为什么还要用 php 来实现
      

  6.   

    phpteam: 您能说说具体的调用过程吗?(比如需要调用lib里的哪些函数以及调用他们的顺序)。谢谢!
      

  7.   

    alee201:我也不知道为什么,我只是执行任务:)
      

  8.   

    c是静态语言。php是动态语言。
    如果C能执行php程序。那么C的程序可以动态改变执行状态。
      

  9.   

    http://wildphp.free.fr/wiki/doku.php?id=howto:embeding_a_php_source_into_a_windows_executable_file
    楼主,我发现了一个可以解释了。
    把php_win32std.dll复制到c:\php\extensions
    就ok了
      

  10.   

    dos窗口下运行
    embed_php.exe info 将输出phpinfo()所有信息
    embed_php.exe env 将出来环境变量
      

  11.   

    以前见过一个一个程序,可以编译 php 脚本 成 控制台exe 程序,
    那么有没有办法,可以编译成 dll 供其它语言调用,  可以找找看。
    有结果的话 ,即各告诉我一下,
    确实,php 的一些系统函数,要自己来实现的话,很麻烦,而且别的语言里面都没有。
      

  12.   

    #include <php_embed.h>int main(int argc, char **argv)
    {
      char *php_code = "echo \"Hello, phpteam!\\n\";";  PHP_EMBED_START_BLOCK(argc, argv);
      zend_eval_string(php_code, NULL, "My PHP code" TSRMLS_CC);
      PHP_EMBED_END_BLOCK();  return 0;
    }其中变量php_code就是你的PHP代码,"My PHP Code"只是一个标识,可任意更改。
    编译的时候连接php4embed.lib即可。
      

  13.   

    其他的关于一些扩展开发的资料可在我的BLOG上找到!
      

  14.   

    ezdevelop: 我用的是版本为4.3.10的php源码,在zend_config.h中有这样一行代码:#include "../main/php_config.h" ;可是在main目录下并没有这个文件,只有php_config.h.in。所以编译的时候肯定无法通过。 请问这是怎么回事? 谢谢!
      

  15.   

    编译PHP源代码的时候会自动系统环境生成的,建议从官方下载PHP源代码,并从头到尾编译一遍,这一步是会开发环境做基础,以后就很方便了。
      

  16.   

    uup: thanks for your information!
      

  17.   

    谢谢ezdevelop, uup提供的信息。 现在已经可以把php script执行功能嵌入到c/c++的win32应用程序中了。但是执行的结果打印到屏幕上, 实际上我需要将执行的结果保存到我自己的缓冲区中,
    所以现在的问题是,能否将php的dll的输出重定向到我的缓冲区(一块内存)中。不知
    各位有好的方法吗,谢谢!
      

  18.   

    完全可以借助php的输出控制函数来过渡
      

  19.   

    xuzuning: 能详细说下吗? 比如我如何将自己的缓冲区传递给php执行模块并使得其将执行结果
    放入到我的缓冲区中?谢谢。
      

  20.   

    两种方法:
    第一种:可以参考PHP中Output Buffer模块的代码。
    第二种:输出重定向到文件,然后在你的DLL里调用,当然效率不及第一种高!
      

  21.   

    ezdevelop:谢谢你的多次解答。
        起初我使用dup,dup2等函数和临时文件,将标准输出重定向到临时文件中。这种方法
    在Win32 console应用程序下工作的很好。但是我转到GUI(MFC)应用程序下,就无法实现
    重定向。
        我也觉得重定向是一个比较笨的方法,php肯定提供有更好的办法。但是我还是不知道
    该从哪儿入手。您能具体解释一下吗?谢谢。
      

  22.   

    PHP_EMBED_START_BLOCK(argc, argv);
      zend_eval_string(php_code, NULL, "My PHP code" TSRMLS_CC);
      PHP_EMBED_END_BLOCK();
    应该从这里直接取得脚本中的变量。
    zend应该提供了一些api的
      

  23.   

    首先声明:我没有认真研究过这个问题,短期内也不大可能研究。按照正常的思路,你应该先解决这样一个问题:
    在你的c程序中如何取得php函数的返回值?或是说你如何读取一个php变量的值?
    后者应该比前者困难一些你首先应把重点放在ob_get_contents()函数上。只要你能得到这个函数的返回值,那么一切问题都解决了。
    即便可能需要对该函数进行改造,但也就是一个函数而已。况且还可以根据他声明一个新函数,而不改变原代码。
      

  24.   

    我在windows GUI应用程序中调用php script,经常会异常终止,异常窗口标题是:
    Zend Timeout Window:......应用程序错误。 这是什么原因? 调用php的代码如下:
      PHP_EMBED_START_BLOCK(argc, argv);
      zend_eval_string(php_code, NULL, "My PHP code" TSRMLS_CC);
      PHP_EMBED_END_BLOCK();
      

  25.   

    php.ini
    max_execution_time = 0;
      

  26.   

    我用的是php4.3.10的源代码和dll。 源代码目录和dll目录下都有php.ini-dist和
    php.ini-recommended 两个文本文件,但是没有php.ini文件。 我看了一下这两个文件,确实设置都是:max_execution_time = 30; 如果是30秒的话,我的应用程序调用它的过程我觉得
    挺快的,不会超过1秒。 您看是否是这个问题呢?
      

  27.   

    写embed程序应该把zend的timeout禁止掉,可在php.ini里也可在程序里写,如果你的电脑上没有php.ini,则PHP是取默认的值,即30秒,所以请自行将php.ini-dist或php.ini-recommended改为php.ini,并与php4ts.dll放在一起或放在系统目录下。
      

  28.   

    查看一下PHP的main.c文件即可知道。
      

  29.   

    我改过了,还是没用。 我的应用程序是图形界面的,点击一个按钮来执行php script,
    但是经常出现异常终止的情况,异常终止的标题:Zend timetout window. 然后整个
    应用程序异常退出。  
    问题在哪儿呢? 我快疯了 :)