2011-03-30 18 views
1

我想創建C代碼,創建一個Python xmlrpc客戶端,並調用xmlrpc服務器上的方法(我正在考慮使用這個IPC作爲鉤DLL)。C代碼崩潰試圖通過xmlrpc Python遠程過程調用

下面是代碼...我不打算在引用計數層中,直到它工作。

#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 xmlrpc服務器在從另一個Python服務器代理調用時工作正常。當我嘗試運行上述可執行文件時,它在PyObject_CallMethod()上崩潰。爲什麼?

+0

我最初的本能是PyObject_CallObject()或set_server_proxy()中的一個Py *函數正在調用返回NULL。您應該檢查每個Py *函數的返回值,以查看返回NULL的內容,因爲它可能會提供有關錯誤地調用函數的信息。 – Suroot 2011-03-30 22:57:26

回答

1

接近set_server_proxy()的末尾,您致電Py_Finalize()銷燬翻譯器,然後您打電話給say_hi(),假定解釋器仍然存在。當Python解釋器代碼嘗試引發錯誤時,PyErr_Occurred()函數將獲得一個指向當前線程狀態的指針,該狀態爲NULL;它取消引用它,這會產生段錯誤。

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

其次,如果你想使用Python的標準xmlrpclib.ServerProxy您可能需要您輸入更改爲:

移動你的解釋初始化調用的main()函數內部

xmlrpc_client_mod = PyImport_ImportModule("xmlrpclib"); 
+0

有沒有另外一種方法來使用解釋器來創建一個Python對象,在解釋器離開之後繼續存在?鑑於這將在鉤子DLL中實現,我不確定我能否將Py_Initialize移出被調用的函數(除非它可以進入Dllmain,我不確定它可以)。 – MikeRand 2011-03-30 23:29:36

+0

我認爲絕大多數情況下都不可能(可能在某些邊緣情況下)。 'PyObject_CallMethod'內部調用其他直接依賴解釋器狀態的函數。也許你可以將解釋器的生命週期鏈接到DllMain DLL_PROCESS_ATTACH/DLL_PROCESS_DETACH事件? – samplebias 2011-03-30 23:39:18

+0

將Py_Initialize和set_server_proxy()移入DLL_PROCESS_ATTACH並將Py_Finalize移入DLL_PROCESS_DETACH似乎可以工作......現在使用xmlrpc來監視Vista Windows API調用,而無需處理任何UAC。謝謝您的幫助。 – MikeRand 2011-03-31 01:43:12