*pVal = VARIANT_FALSE;
SAFE_BSTR_CS2C(sName)
if( (stmFile.vt^VT_ARRAY) <1 || (stmFile.vt^VT_ARRAY)>73)//用户传入数组类型不正确直接返回
return S_OK;
if( lcl_JudgeStreamIsNull(stmFile) )
return S_OK;
CString strPath;
HRESULT hr = lcl_TranslateStreamToTempFile(stmFile,strPath);
if(FAILED(hr)) return S_OK;
CString newPath = strPath.Left(strPath.GetLength() - 36) + CString(sName) + ".sot";
int len1 = WideCharToMultiByte( CP_ACP , 0 , strPath , strPath.GetLength() , NULL , 0 , NULL , NULL );
char* pAscii1 =new char[len1+1];
len1 = WideCharToMultiByte( CP_ACP , 0 , strPath , strPath.GetLength() , pAscii1 , len1 +1 , NULL ,NULL );
pAscii1[len1] = 0;
const char* p1 = (const char*)pAscii1;
delete [] pAscii1;//消除内存泄露
int len2 = WideCharToMultiByte( CP_ACP , 0 , newPath , newPath.GetLength() , NULL , 0 , NULL , NULL );
char* pAscii2 =new char[len2+1];
len2 = WideCharToMultiByte( CP_ACP , 0 , newPath , newPath.GetLength() , pAscii2 , len2 +1 , NULL ,NULL );
pAscii2[len2] = 0;
const char* p2 = (const char*)pAscii2;
delete [] pAscii2;//消除内存泄露
rename(p1,p2);//重命名辞典文件,命名为用户传入的名称,方便用户查询
//delete [] pAscii1;//消除内存泄露
//delete [] pAscii2;//消除内存泄露
CComPtr r_Model;
hr = lcl_GetModel(mpDispFrame,r_Model);
if(FAILED(hr)) return S_OK;
hr = ExecuteFunc(r_Model, L"ImportUsingDict", &CComVariant(newPath),1,NULL);//病历通专有方法
if( FAILED(hr)) return S_OK;
*pVal = VARIANT_TRUE;
return S_OK;
这段代码问题出在delete 字符指针的时候,由于两个指针指向同一块内存区域 const char* p1 = (const char*)pAscii1;当调用rename库函数的时候,其实p1,p2都指向一个不明的内存区域,里面内容都是烫烫烫,大家可能会比较熟悉这种错误,只要将释放资源的代码放在合适的位置即可,放到rename之后一起delete,这种错误只有调试后才可以发现,故写代码的时候一定要注意了。
另外今天解决一个始终用不了XElement的问题,因为要引入System.Xml.Linq,但是由于这个解决方案是由vs2005新建的,而现在用的是vs2008,于是项目属性中,编译,高级便宜选项采用的是.NET framework 2.0,这个不包含System.Xml.Linq,于是修改这个选项然后重新add refrence ,最后Imports System.Xml.Linq即可