0

C++ dll 用の php 5.2.17 拡張機能を作成しようとしています。Windows XP で Visual Studio 2005 と Sambar Server 7.0 を使用しています。2 つの質問があります。

  1. コードに c++ のもの (文字列または STL マップ) を含めることができませんでした..「PHP は 00CF421B でアクセス違反に遭遇しました」のようなエラーが発生します。dll で文字列と STL マップを使用するにはどうすればよいですか。

  2. 文字列型の 3 つのパラメーターを持つ関数を含む c++ dll を作成しようとしており、それらの 3 つの 2 番目の文字列を返します。

以下はコードです:

PHP_FUNCTION(add){
    char* a;
    char* b;
    char* c;

    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sss", &a,&b,&c) == FAILURE) {
        RETURN_STRING("Bad parameters!", true);
    }

    //string ss=a;
    //ss=ss+b;
    //memset(a,0,30);
    //strcpy(a,ss.c_str());
    //php_printf("a : %s b : %s ",a,b);
    RETURN_STRING(b,1);
}

php ファイルには以下が含まれます。

$a="abc";
$b="def";
$c="ghi";
$result = add($a,$b,$c);
print "Calling add($a,$b,$c) returned $result";

-> ここで、この関数に 2 つのパラメーターが設定されている場合、最初の文字列は正常に返されます。

-> この関数の 2 つのパラメーターを含む 2 番目の文字列を返そうとすると、エラーが発生します: "PHP は 014AE07C でアクセス違反に遭遇しました"

-> 上記のコードのような 3 つのパラメーターを使用して試行すると、サンバー サーバーが自動的に閉じてしまいます。出力が表示される可能性はありません。

なぜこの奇妙な動作なのか、どこが間違っているのでしょうか?

前もって感謝します

アニル

4

2 に答える 2

1
  1. PHP拡張機能は、C ++ではなく、Cで記述されることを目的としています。C ++アプリケーションでPHPを呼び出す必要がある場合は、埋め込みSAPIを使用しますが、拡張機能自体はCになります。

  2. とにかく、への呼び出しは次のようにzend_parse_parameters()なります。

    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sss", &a, &a_len,&b, &b_len,&c, &c_len) == FAILURE) ここで、_len変数は整数です。

参照にはlxr.php.netを使用してください。

于 2012-04-14T11:17:45.413 に答える
0

あなたの最初の問題はmemset(a, 0, 30);. 指定された文字列の長さは (おそらく) わずか 3 文字であり、30 文字をゼロ文字に設定しているため、おそらく文字列のバッファーの末尾を超えています。

次にstrcpy(a,ss.c_str());、同様のバッファ オーバーランが発生する可能性があります。

最後に、b連結の結果ではなく、含まれているもの (上書きされている可能性があります) を返します。

于 2012-04-13T21:38:27.543 に答える