1

Python xmlrpcクライアントを作成し、xmlrpcサーバーでメソッドを呼び出すCコードを作成しようとしています(これをフックDLLのIPCとして使用することを考えています)。

これがコードです...それが機能するまで、参照カウントを階層化するつもりはありません。

#include <Python.h>
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>

static PyObject *xmlrpc_server_proxy = NULL;
static PyObject *set_server_proxy(void);
static void say_hi(void);

int main()
{
    xmlrpc_server_proxy = set_server_proxy();
    say_hi();
    return 0;
}

static PyObject *
set_server_proxy()
{
        PyObject *xmlrpc_client_mod, *xmlrpc_server_proxy_class, *location, *args;
        PyObject *result;
        Py_Initialize();
        xmlrpc_client_mod = PyImport_ImportModule("xmlrpc.client");
        xmlrpc_server_proxy_class = PyObject_GetAttrString(xmlrpc_client_mod, "ServerProxy");
        location = PyUnicode_FromString("http://127.0.0.1:8000/");
        args = Py_BuildValue("(O)", location);
        result = PyObject_CallObject(xmlrpc_server_proxy_class, args);
        Py_Finalize();
        return result;
}

static void say_hi()
{
    PyObject_CallMethod(xmlrpc_server_proxy, "say_hi", "()");
}

別のPythonサーバープロキシから呼び出されたときに、Pythonxmlrpcサーバーが正常に機能することを確認しました。上記の実行可能ファイルを実行しようとすると、でクラッシュしますPyObject_CallMethod()。なんで?

4

1 に答える 1

2

set_server_proxy()あなたの終わり近くでPy_Finalize()、インタプリタを破壊する呼び出しを行っており、その後say_hi()、インタプリタがまだ存在していると仮定して呼び出しています。Pythonのinterprerコードがエラーを発生させようとすると、PyErr_Occurred()関数は現在のスレッド状態へのポインターを取得しますNULL。それはそれを逆参照し、これはセグメンテーション違反を生成します。

インタプリタ初期化呼び出しをmain()関数内に移動します。

int main()
{
    Py_Initialize();
    xmlrpc_server_proxy = set_server_proxy();
    say_hi();
    Py_Finalize();
    return 0;
}

次に、Pythonの標準を使用しようとしている場合はxmlrpclib.ServerProxy、インポートを次のように変更する必要があります。

xmlrpc_client_mod = PyImport_ImportModule("xmlrpclib");
于 2011-03-30T23:19:58.023 に答える