强制去教育版源代码
强制去教育版源代码,支持CAD2004~CAD2014,支持32位和64位 需要直接使用的朋友,可以直接下载 常用的两款去教育版插件 //----------------------------------------------------------------------------- //------ StdAfx.cpp : source file that includes just the standard includes //------ StdAfx.pch will be the pre-compiled header //------ StdAfx.obj will contain the pre-compiled type information //----------------------------------------------------------------------------- #include "StdAfx.h" bool RemoveEduPlotStamp_Force(const AcDbDatabase* pDb) { DWORD d1=(DWORD)pDb; #ifdef _WIN64 d1+=0x00000008; #else d1+=0x00000004; #endif void** pVoid=(void**)d1; void* pVoid1=*pVoid;//取到内部的mpImpDb地址 DWORD d2=(DWORD)pVoid1; int i=0x00000600; while(true) { if(!pDb->isEMR()) { return true; } i++; if(i>=0x00000fff) { return false; } DWORD d3=(DWORD)pVoid1; d3+=i; void* pVoid4=(void*)d3; DWORD* pVoid5=(DWORD*)pVoid4;//转化为DWORD,0x00000000:非教育版,0x00000001:教育版 if((*pVoid5)==0x01) { *pVoid5=0x00; if(!pDb->isEMR()) { #if _ARXDEBUG acutPrintf(_T("\r\n指针偏移;0x%x"),i); #endif return true; } else { *pVoid5=0x01; } } } return false; } #if _MSC_VER>=1600 #ifdef _WIN64 bool RemoveEduPlotStamp_13(const AcDbDatabase* pDb) { DWORD d1=(DWORD)pDb; d1+=0x00000008; void** pVoid=(void**)d1; void* pVoid1=*pVoid;//取到内部的mpImpDb地址 DWORD d2=(DWORD)pVoid1; d2+=0x00000ba8;//取得mpImpDb内部的是否是教育版的标志 void* pVoid2=(void*)d2; byte* pVoid3=(byte*)pVoid2;//转化为DWORD,0x00000000:非教育版,0x00000001:教育版 if((*pVoid3)==0x01) { *pVoid3=0x00; return true; } else { return false; } } #else bool RemoveEduPlotStamp_13(const AcDbDatabase* pDb) { DWORD d1=(DWORD)pDb; d1+=0x00000004; void** pVoid=(void**)d1; void* pVoid1=*pVoid;//取到内部的mpImpDb地址 DWORD d2=(DWORD)pVoid1; d2+=0x00000884;//取得mpImpDb内部的是否是教育版的标志 void* pVoid2=(void*)d2; byte* pVoid3=(byte*)pVoid2;//转化为DWORD,0x00000000:非教育版,0x00000001:教育版 if((*pVoid3)==0x01) { *pVoid3=0x00; return true; } else { return false; } } #endif #elif _MSC_VER>=1500 #ifdef _WIN64 bool RemoveEduPlotStamp_10(const AcDbDatabase* pDb) { DWORD d1=(DWORD)pDb; d1+=0x00000008; void** pVoid=(void**)d1; void* pVoid1=*pVoid;//取到内部的mpImpDb地址 DWORD d2=(DWORD)pVoid1; d2+=0x00000b80;//取得mpImpDb内部的是否是教育版的标志 void* pVoid2=(void*)d2; byte* pVoid3=(byte*)pVoid2;//转化为DWORD,0x00000000:非教育版,0x00000001:教育版 if((*pVoid3)==0x01) { *pVoid3=0x00; return true; } else { return false; } } #else bool RemoveEduPlotStamp_10(const AcDbDatabase* pDb) { DWORD d1=(DWORD)pDb; d1+=0x00000004; void** pVoid=(void**)d1; void* pVoid1=*pVoid;//取到内部的mpImpDb地址 DWORD d2=(DWORD)pVoid1; d2+=0x0000086c;//取得mpImpDb内部的是否是教育版的标志 void* pVoid2=(void*)d2; byte* pVoid3=(byte*)pVoid2;//转化为DWORD,0x00000000:非教育版,0x00000001:教育版 if((*pVoid3)==0x01) { *pVoid3=0x00; return true; } else { return false; } } #endif #elif _MSC_VER>=1400 bool RemoveEduPlotStamp_09(const AcDbDatabase* pDb) { return false; } //CAD08去除教育版标记 bool RemoveEduPlotStamp_08(const AcDbDatabase* pDb) { DWORD d1=(DWORD)pDb; d1+=0x00000004; void** pVoid=(void**)d1; void* pVoid1=*pVoid;//取到内部的mpImpDb地址 DWORD d2=(DWORD)pVoid1; d2+=0x00000824;//取得mpImpDb内部的是否是教育版的标志 void* pVoid2=(void*)d2; byte* pVoid3=(byte*)pVoid2;//转化为DWORD,0x00000000:非教育版,0x00000001:教育版 if((*pVoid3)==0x01) { *pVoid3=0x00; return true; } else { return false; } } //CAD08去除教育版标记 bool RemoveEduPlotStamp_07(const AcDbDatabase* pDb) { DWORD d1=(DWORD)pDb; d1+=0x00000004; void** pVoid=(void**)d1; void* pVoid1=*pVoid;//取到内部的mpImpDb地址 DWORD d2=(DWORD)pVoid1; d2+=0x000007dc;//取得mpImpDb内部的是否是教育版的标志 void* pVoid2=(void*)d2; byte* pVoid3=(byte*)pVoid2;//转化为DWORD,0x00000000:非教育版,0x00000001:教育版 if((*pVoid3)==0x01) { *pVoid3=0x00; return true; } else { return false; } } #else //CAD06去除教育版标记 bool RemoveEduPlotStamp_06(const AcDbDatabase* pDb) { DWORD d1=(DWORD)pDb; d1+=0x00000004; void** pVoid=(void**)d1; void* pVoid1=*pVoid;//取到内部的mpImpDb地址 DWORD d2=(DWORD)pVoid1; d2+=0x000006d4;//取得mpImpDb内部的是否是教育版的标志 void* pVoid2=(void*)d2; byte* pVoid3=(byte*)pVoid2;//转化为DWORD,0x00000000:非教育版,0x00000001:教育版 if((*pVoid3)==0x01) { *pVoid3=0x00; return true; } else { return false; } } //CAD05去除教育版标记 bool RemoveEduPlotStamp_05(const AcDbDatabase* pDb) { DWORD d1=(DWORD)pDb; d1+=0x00000004; void** pVoid=(void**)d1; void* pVoid1=*pVoid;//取到内部的mpImpDb地址 DWORD d2=(DWORD)pVoid1; d2+=0x000006d4;//取得mpImpDb内部的是否是教育版的标志 void* pVoid2=(void*)d2; byte* pVoid3=(byte*)pVoid2;//转化为DWORD,0x00000000:非教育版,0x00000001:教育版 if((*pVoid3)==0x01) { *pVoid3=0x00; return true; } else { return false; } } //CAD04去除教育版标记 bool RemoveEduPlotStamp_04(const AcDbDatabase* pDb) { DWORD d1=(DWORD)pDb; d1+=0x00000004; void** pVoid=(void**)d1; void* pVoid1=*pVoid;//取到内部的mpImpDb地址 DWORD d2=(DWORD)pVoid1; d2+=0x000006d4;//取得mpImpDb内部的是否是教育版的标志 void* pVoid2=(void*)d2; byte* pVoid3=(byte*)pVoid2;//转化为DWORD,0x00000000:非教育版,0x00000001:教育版 if((*pVoid3)==0x01) { *pVoid3=0x00; return true; } else { return false; } } #endif bool Split(CString& src, CString token, CStringArray& resultArray,bool ingoreEmptyString=false) { if(src.IsEmpty()) { return true; } int tokenSize = token.GetLength(); CString result; CString srcouceStr = src; while (true) { int index = srcouceStr.Find(token); if (index == 0) { result = ""; } else if (index < 0) { if((!ingoreEmptyString)||(!srcouceStr.IsEmpty())) { resultArray.Add(srcouceStr); } return true; } else { result = srcouceStr.Left(index); } if((!ingoreEmptyString)||(!result.IsEmpty())) { resultArray.Add(result); } int sourceLength = srcouceStr.GetLength(); srcouceStr = srcouceStr.Right(sourceLength - index - tokenSize); } } //功能: 指定的字符串是否是合理的长整数(只能处理十进制的) //参数: value,指定的字符串 // nValue,返回长整数型结果 //返回: 是否是合理的长整数 BOOL IsValidLong(const CString value,long &lValue) { bool bNegative=false;//是否是负数 CString tmpValue=value; try { tmpValue.Trim(); } catch(...) { } int nLen=tmpValue.GetLength(); if(nLen==0) return FALSE; TCHAR c=tmpValue.GetAt(0); if(c=='-') { //负数 bNegative=true; if(nLen==1) { //只有一个负号是不合理的 return FALSE; } tmpValue=tmpValue.Right(nLen-1); nLen--; } long lTmpValue=0L; c=tmpValue.GetAt(0); if(c=='0') { if(nLen==1) { lValue=0L; return TRUE; } else { //第一位是0并且后面还有其它数字认为是不合理的 return FALSE; } } else if(c>='1'&&c<='9') { lTmpValue+=lTmpValue*10+c-'0'; for(int i=1;i<nLen;i++) { c=tmpValue.GetAt(i); if(c>='0'&&c<='9') { lTmpValue=lTmpValue*10+(c-'0'); } else { //出现了非数字认为是不合理的 return FALSE; } } } else { //出现了非数字认为是不合理的 return FALSE; } lValue=bNegative?-lTmpValue:lTmpValue; return TRUE; } int _getHostAppMinorVersion() { #if _MSC_VER>=1400 return acdbHostAppMinorVersion(); #else const TCHAR* lpRootKey=acrxProductKey(); HKEY key = HKEY_LOCAL_MACHINE; DWORD acadNum = 0; if (RegOpenKeyEx(key, lpRootKey,0,KEY_READ, &key) != ERROR_SUCCESS) { return -1; } TCHAR strValue[128+1]={0}; DWORD dwType; DWORD dwCount = sizeof(TCHAR)*128; LONG lResult = RegQueryValueEx(key, _T("Release"), NULL, &dwType, (LPBYTE)strValue, &dwCount); RegCloseKey(key); if(lResult != ERROR_SUCCESS) { return -1; } CString src(strValue); CString token=_T("."); CStringArray resultArray; Split(src,token,resultArray,true); if(resultArray.GetCount()<2) { return -1; } CString strMinorVersion=resultArray.GetAt(1); long nValue=-1; if(!IsValidLong(strMinorVersion,nValue)) { return -1; } if(nValue<0) { return -1; } return nValue; #endif } int Glb_AppMinorVersion=-9999; int getHostAppMinorVersion() { if(Glb_AppMinorVersion==-9999) { Glb_AppMinorVersion=_getHostAppMinorVersion(); } return Glb_AppMinorVersion; } void RemoveEduPlotStamp(const AcDbDatabase* pDb) { if(pDb==NULL) { return; } if(!pDb->isEMR()) { return; } int nMinorVersion=getHostAppMinorVersion(); bool rc=false; #if _MSC_VER>=1600 if(nMinorVersion==0) { rc=RemoveEduPlotStamp_13(pDb); } #elif _MSC_VER>=1500 if(nMinorVersion==0) { rc=RemoveEduPlotStamp_10(pDb); } #elif _MSC_VER>=1400 if(nMinorVersion==0) { rc=RemoveEduPlotStamp_07(pDb); } else if(nMinorVersion==1) { rc=RemoveEduPlotStamp_08(pDb); } else if(nMinorVersion==2) { rc=RemoveEduPlotStamp_09(pDb); } #else if(nMinorVersion==0) { rc=RemoveEduPlotStamp_04(pDb); } else if(nMinorVersion==1) { rc=RemoveEduPlotStamp_05(pDb); } else if(nMinorVersion==2) { rc=RemoveEduPlotStamp_06(pDb); } #endif if(rc) { rc=!pDb->isEMR(); } if(rc) { acutPrintf(_T("\r\n清除教育版标志成功")); } else { acutPrintf(_T("\r\n清除教育版标志失败,尝试强制清除")); rc=RemoveEduPlotStamp_Force(pDb); if(!rc) { acutPrintf(_T("\r\n清除教育版标志失败,请将您的CAD版本,操作系统版本,32位系统/64位系统,32位CAD/64位CAD发送给作者\r\n邮箱:wdzhangsl@126.com,QQ:245804736")); } else { acutPrintf(_T("\r\n强制清除教育版标志成功")); } } }查看完整版本: 强制去教育版源代码
Tags: 去教育版