Python这语言很强大,但是代码安全性及可视很差,做个界面很费时间,所以想到用MFC来做界面,但是 不能被Python直接调用,所以想出一个方法,通过C++ dll 调用MFC界面,但是主程序是Python,所以要返回的数据要很多,这样在调用时就得要用到实参传递,返回时,在CString 转 char[]时遇到了很大麻烦,传不回去。通过多方测试,发现仅memcpy实现在想要的结果,且要注意dlg.m_nInput.GetLength()+1,GetLength()是不包括‘\0’的。
int DLLTest(char dwgNo[],char pg[])
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
diag dlg;
dlg.m_nOutput=pg;
dlg.m_nInput=dwgNo;
dlg.DoModal();
memcpy(dwgNo,dlg.m_nInput,dlg.m_nInput.GetLength()+1);
memcpy(pg,dlg.m_nOutput,dlg.m_nOutput.GetLength()+1);
}
static PyObject* getpg(PyObject *self, PyObject *args)
{
char* dwgNotemp;
char* pgtemp;
Py_Initialize();
if ( !Py_IsInitialized())
{
return Py_BuildValue("ss", "No","Init Error!");
}
if (!PyArg_ParseTuple(args, "ss",&dwgNotemp,&pgtemp))
return Py_BuildValue("ss", "No","Init Error!");
typedef int(*pMax)(char*,char*);
HMODULE hdll;
pMax Max;
int e;
hdll=LoadLibrary("MyDLL.dll");
<span style="white-space:pre"> </span>if(hdll!=NULL)
<span style="white-space:pre"> </span>{
Max=(pMax)GetProcAddress(hdll,"DLLTest");
if(Max!=NULL)
{
e=Max(dwgNotemp,pgtemp);
if (e==0)
{
return Py_BuildValue("ss", "No","User Cancel!");
}
else
{
return Py_BuildValue("sss", "Yes",dwgNotemp,pgtemp);
}
}
else
{
return Py_BuildValue("ss", "No","DoModal Error!");
}
}
else
{
return Py_BuildValue("ss", "No","Get MFCdll Error!");
}
}