Browse Source

注意:_variant_t构建的字符串默认是bstr,而bstr是宽字符,所以在转入给Python时,使用"u"而非"s"格式。

sat23 5 years ago
parent
commit
b424505a80
1 changed files with 34 additions and 10 deletions
  1. 34 10
      CallPython/CallPython/CallPython.cpp

+ 34 - 10
CallPython/CallPython/CallPython.cpp

@@ -29,7 +29,8 @@ void PySetItem(PyObject* args, _variant_t var, int nIndex)
 	{
 	case VT_BSTR:
 		{
-			PyTuple_SetItem(args, nIndex, Py_BuildValue("s", var.bstrVal));
+			//PyTuple_SetItem(args, nIndex, Py_BuildValue("s", var.bstrVal));
+			PyTuple_SetItem(args, nIndex, Py_BuildValue("u", var.bstrVal)); // 这里是按宽字节传入python中;
 			break;
 		}
 	case VT_LPSTR: //null terminated string
@@ -151,23 +152,25 @@ PyObject *CallPython(std::string strPyPath, std::string strPyFuncName, int argc,
 	PyRun_SimpleString("import sys");
 	PyRun_SimpleString(szExecuteDir);
 
+	PyObject *args = NULL;
+	PyObject *pFunc = NULL;
+	PyObject *pRet = NULL;
 	// 2、导入模块;
 	PyObject *pModule = PyImport_ImportModule(szFilename);
 	if ( !pModule )
-		return NULL;
+		goto over;
 
 	// 3、调用函数;
-	PyObject *pFunc = PyObject_GetAttrString(pModule, strPyFuncName.c_str());
+	pFunc = PyObject_GetAttrString(pModule, strPyFuncName.c_str());
 	if (!pFunc || !PyCallable_Check(pFunc))
-		return NULL;
+		goto over;
 
 	// 4、导入函数参数;
-	PyObject *pRet = NULL;
 	if ( argc != 0 ) {		
 #if 0
-		PyObject *args = PyTuple_New(argc--);
+		args = PyTuple_New(argc--);
 		if ( !args )
-			return NULL;
+			goto over;
 		PySetItem(args, var, 0);
 		// 收集所有变参;
 		va_list ap;
@@ -178,9 +181,9 @@ PyObject *CallPython(std::string strPyPath, std::string strPyFuncName, int argc,
 		}
 		va_end(ap);
 #else
-		PyObject *args = PyTuple_New(argc);
+		args = PyTuple_New(argc);
 		if ( !args )
-			return NULL;
+			goto over;
 		// 收集所有变参;
 		va_list ap;
 		va_start(ap, argc); 
@@ -195,6 +198,16 @@ PyObject *CallPython(std::string strPyPath, std::string strPyFuncName, int argc,
 	}
 	else
 		pRet = PyEval_CallObject(pFunc, NULL);
+
+over:
+	if ( pModule)
+		Py_DECREF(pModule);
+
+	if ( argc)
+		Py_DECREF(argc);
+
+	if ( pFunc)
+		Py_DECREF(pFunc);
 	
 	return pRet;
 }
@@ -284,16 +297,27 @@ int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
 #else
 		Py_Initialize();
 		
+		// C:\Users\scbc.sat23\bin\SATHelper\scripts
 		//PyObject *pRet = CallPython("F:\\SAT\\SAT_API\\ssat_sdk\\device_manage\\testWizardClient.py", "API_UsbSwitch", 4,
-		PyObject *pRet = CallPython("test.py", "_print", 4,
+		
+		/*PyObject *pRet = CallPython("test.py", "_print", 4,
 			// 变参一定要强转;
 			_variant_t(1),
 			_variant_t(2), 
 			_variant_t("aaa"),
 			_variant_t("bbb"));
+*/
+
+		PyObject *pRet = CallPython("C:\\Users\\scbc.sat23\\bin\\SATHelper\\scripts\\TVUpgrade.py",_T("API_TVUpgrade"), 3,
+			_variant_t(1),
+			_variant_t(2),
+			_variant_t(2));
 
 		pRet = CallPython("test.py", "Hello", 0);
 
+		if ( pRet)
+			Py_DECREF(pRet);
+
 		Py_Finalize();
 #endif
 		system("pause");