diff --git a/SourceCode/Code2026/CoreLibrary/AecDbEwPipeBase.cpp b/SourceCode/Code2026/CoreLibrary/AecDbEwPipeBase.cpp index e790717..8317b37 100644 --- a/SourceCode/Code2026/CoreLibrary/AecDbEwPipeBase.cpp +++ b/SourceCode/Code2026/CoreLibrary/AecDbEwPipeBase.cpp @@ -1201,10 +1201,25 @@ Acad::ErrorStatus AecDbEwPipeBase::RegionAcisoutDwgOutFields(AcDbDwgFiler* pFile //避免多文档crash:文件名带进程号,同一张图在两个 CAD 实例里同时打开不会互相覆盖 TCHAR szHandleStr[19]; memset(szHandleStr,0,sizeof(szHandleStr) ); - objectId().handle().getIntoAsciiBuffer(szHandleStr); + + CString sTag; + AcDbObjectId idSelf = objectId(); + if (!idSelf.isNull()) + idSelf.handle().getIntoAsciiBuffer(szHandleStr); + + if (szHandleStr[0] != _T('\0')) + { + sTag = szHandleStr; + } + else + { + // 未入库实体(剪贴板、临时序列化)没有句柄,用进程内递增序号保证文件名唯一 + static LONG s_nTempSeq = 0; + sTag.Format(_T("N%ld"),(long)::InterlockedIncrement(&s_nTempSeq)); + } CString sFileName; - sFileName.Format(_T("Region_%lu_%s.dat"),(unsigned long)::GetCurrentProcessId(),szHandleStr); + sFileName.Format(_T("Region_%lu_%s.dat"),(unsigned long)::GetCurrentProcessId(),(LPCTSTR)sTag); CString sFullPath = FilePath::getSystemTemporaryFolder(); sFullPath += _T("\\"); @@ -1216,7 +1231,7 @@ Acad::ErrorStatus AecDbEwPipeBase::RegionAcisoutDwgOutFields(AcDbDwgFiler* pFile Acad::ErrorStatus es = AcDbBody::acisOut(sFullPath, arBodyPtrs); if (Acad::eOk != es) { - acutPrintf(_T("\nAecDbEwPipeBase: 截面 acisOut 失败,handle=%s,err=%d,改用原生写法。"),szHandleStr,es); + acutPrintf(_T("\nAecDbEwPipeBase: 截面 acisOut 失败,tag=%s,err=%d,改用原生写法。"),(LPCTSTR)sTag,es); ::DeleteFile(sFullPath); return WriteRegionNativeFallback(pFiler, m_pRegion); } @@ -1224,7 +1239,7 @@ Acad::ErrorStatus AecDbEwPipeBase::RegionAcisoutDwgOutFields(AcDbDwgFiler* pFile CFile file; if (!file.Open(sFullPath, CFile::modeRead)) { - acutPrintf(_T("\nAecDbEwPipeBase: 截面临时文件打开失败,handle=%s,改用原生写法。"),szHandleStr); + acutPrintf(_T("\nAecDbEwPipeBase: 截面临时文件打开失败,tag=%s,改用原生写法。"),(LPCTSTR)sTag); ::DeleteFile(sFullPath); return WriteRegionNativeFallback(pFiler, m_pRegion); } @@ -1243,8 +1258,8 @@ Acad::ErrorStatus AecDbEwPipeBase::RegionAcisoutDwgOutFields(AcDbDwgFiler* pFile if (nLen == 0 || nRead != nLen) { // 空文件或短读:尾部是未初始化内存,不能写进 DWG - acutPrintf(_T("\nAecDbEwPipeBase: 截面临时文件异常,handle=%s,期望%u字节实读%u字节,改用原生写法。") - ,szHandleStr,nLen,nRead); + acutPrintf(_T("\nAecDbEwPipeBase: 截面临时文件异常,tag=%s,期望%u字节实读%u字节,改用原生写法。") + ,(LPCTSTR)sTag,nLen,nRead); ::DeleteFile(sFullPath); delete[] pszTxt; return WriteRegionNativeFallback(pFiler, m_pRegion);