2013-01-13 121 views
0

我需要使用拉撒路/ FreePascal的解析PHP扩展的参数,但我不知道如何在拉撒路的定义C函数zend_parse_parameters如何将zend_parse_parameters从C++转换为pascal?

int zend_parse_parameters (int num_args TSRMLS_DC, char* type_spec, ...) 

任何人可以帮助我吗?

+0

什么是TSRMLS_DC?看起来像一些非标准C修饰符 –

+0

它是一个PHP宏,PHP示例代码如下:PHP_FUNCTION(exif_t​​agname) { \t long tag; \t char * szTemp; (zend_parse_parameters(ZEND_NUM_ARGS()TSRMLS_CC,“l”,&tag)== FAILURE){ \t \t \t return; \t} \t szTemp = exif_get_tagname(tag,NULL,0,tag_table_IFD TSRMLS_CC); \t if(tag <0 ||!szTemp ||!szTemp [0]){ \t \t RETURN_FALSE; \t} \t RETURN_STRING(szTemp,1) } – profh

回答

0

大概就像

uses ctypes; 
function zend_parse_parameters(num_args:cint;type_spec:pchar):cint;cdecl; varargs; 

,但我不知道做什么用宏做的(我认为这仅仅是一个辅助宏变量部分和num_args连接在一起)。

+0

是的,它差不多。我之前使用过这个定义,但它没有工作,错误消息是“PHP警告:encryptext()期望完全为0参数,1在/var/www/html/a.php在第2行给出”。也许是因为宏缺失。 – profh

+0

这听起来像是PHP方面的一个问题。 PHP无法知道pascal端如何声明参数 –

+0

,所以问题是如何将参数从pascal端发送到PHP,PHP宏“TSRMLS_CC”的第二个参数缺失。 – profh

0
here is my test code of lazarus under CENTOS6.3: 

procedure encryptext (ht : integer; return_value : pzval; this_ptr : pzval; 
    return_value_used : integer; TSRMLS_DC : pointer); cdecl; 
var 
    getmyparameters: function(argu_num:integer; 
        type_apec:pansichar;Args : Array of const):integer;cdecl; 
    a:integer; 
    rtnstr:string; 
begin 
    if (PHPLib < 1) then exit; 
    getmyparameters := GetProcAddress(PHPLib, 'zend_parse_parameters'); 
    if (@getmyparameters = nil) then 
    begin 
    raise EPHP4DelphiException.Create('zend_parse_parameters'); 
    exit; 
    end; 

    if ht < 1 then 
    begin 
    zend_wrong_param_count(TSRMLS_DC); 
    Exit; 
    end; 

    a := 1; 
    if (getmyparameters(ht,pansichar('s'),[pansichar(rtnstr),@a]) <> SUCCESS) then exit; 

    ZVAL_STRING(return_value,pansichar(rtnstr),true); 
end; 

php code of /var/www/html/a.php: 
<?php 
    echo encryptext('hello'); 
?> 

the error message is: 
PHP Warning: encryptext() expects exactly 0 parameters, 1 given in /var/www/html/a.php on line 2