- UID
- 540456
- 积分
- 0
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2007-1-18
- 最后登录
- 1970-1-1
|
楼主 |
发表于 2007-1-30 16:45:06
|
显示全部楼层
谢谢各位解答.!
最近为了完成毕业设计,我选用了C++2005 + ObjectARX2007 对AutoCAD2007进行二次开发,而手头的资料也很有限,只有ObjectARX2000和2006两份资料,C++方面用的最高版本也是C++2003,而C++2005又有很多地方都有变化,所以在开发的过程中确实遇到了很多麻烦!后来经过自己的一些摸索和努力,也发现了一些变化,解决了一些问题,现在把它写下来,和有这方面需要的人一起分享!
acutPrintf ("") 要变成 acutPrintf (_T(""))
struct resbuf *head=0,*eb1=0,*eb2=0;
if(rs.GetRecordCount() > 0)
{
haveRsFlag=TRUE;
eb1=new resbuf;
eb1->rbnext=NULL;
eb1->restype = RTLB;
for(int i=0;i<4;i++)
{
if(head==NULL)
{
head=eb2=eb1;
eb2->rbnext=eb1;
eb2=eb1;
}
eb1=new resbuf;
eb1->rbnext=NULL;
strcpy(arrstr[0],V_BSTRT(&(rs.GetFieldValue(i+3))));
eb1->resval.rstring = arrstr[0];
eb1->restype = RTSTR;
eb2->rbnext=eb1;
eb2=eb1;
}
eb1=new resbuf;
eb1->restype = RTLE;
eb1->rbnext=NULL;
eb2->rbnext=eb1;
eb2=eb1;
}
if(haveRsFlag==TRUE)
{
eb2->rbnext=NULL;
acedRetList(head);
delete(eb1);
}
else
acedRetNil();
rs.Close();
db.Close();
MessageBox ("")或MessageBox (S"") 都必须变为 MessageBox ( _T("") )
还有类似要用到 " " 的函数都要用 _T(" ")
char 和 char * 变为 TCHAR 和 TCHAR * 还有 ACHAR 和 WCHAR ,不过一般都用做 TCHAR 就可以了,不需要用ACHAR或WCHAR
strcmp 用做 _tcscmp
strlen 用做 wcslen
strcat 用做 wcscat
strcpy 用作 StrCpy
fopen 用做 _wfopen
fputs 用做 fputws
_itoa 用做 _itow
1、str开头函数在函数尾加"_s"
2、字符串加 ACRX_T("") 如:
//s.Format("%s",..) s.Format(ACRX_T("%s"),..)
字符转换为数据
_wtof
_wtoi
_wtol
3、_tempnam ->_wtempnam
4、_splitpath ->_wsplitpath_s
6、fopen->_wfopen_s//参数及返回已变化
7、fgets->fgetws
8、sscanf->swscanf_s
9、fscanf->fwscanf_s
10、fprintf->fwprintf_s
11、strchr->wcschr
12、strstr-> wcsstr
13、strtok_s->wcstok_s
14、strupr->_wcsupr_s(str,l+1);
建议字符串均改为TCHAR(ACHAR)类型
//char * filepath = "";
const TCHAR* filePath;
acdbCurDwg()->getFilename(filePath);
wsprintf(OutputMessage, "%s", szData);
wsprintf(OutputMessage, _T("%S"), szData);
char OutputMessage[200];
memset(OutputMessage,0,200);
TCHAR szData[60];
ZeroMemory(szData, sizeof(TCHAR)*60);
还有C++2005的一个大变化,就是控件的名称可以用中文的,之前的版本不支持,只能是英文字符,否则会说是无效字符
恩,暂时发现这些,和大家分享,大家要是也发现一些变化的话,也希望能发布出来,一起分享!!!
--------------------------------------------------------------------------------
恩,越来越标准化了!
--------------------------------------------------------------------------------
在调试程序过程中发现,CAD2007中全用UINCODE了。在工程开始时要设置字符集(老程序升级要注意)
我的程序中自已实现一个从CControlBar z派生的DOCKBAR,在C2005 + ARX2007 编译通过了,用UNICODE字符集编译链接就能正常加载运行,用mul-charsetldnd encoding也能编译链接,但加载后运行总提示一个内存读取错误!!后来在一直跟踪到CControlBar :: OnCreate(...)中发现在后一种情况下,m_pDockSite 和m_pDockContext不能正常初始化,据估计CAD2007中的核心部份是用Unicode 编译的!!
抛砖引玉,请多指教!!
--------------------------------------------------------------------------------
谢谢,正需要。
--------------------------------------------------------------------------------
objectarx2007文档清楚写明,ARX API 接口函数的字符(串)参数都使用UNICODE,你自己的程序可使用其他编码,但在传给ARX前必需转换为UNICODE
#import "C:\\Program Files\\Common Files\\Microsoft Shared\\OFFICE12\\mso.dll" rename("RGB", "MSRGB")
#import "C:\\Program Files\\Common Files\\Microsoft Shared\\VBA\VBA6\\VBE6EXT.OLB" raw_interfaces_only, rename("Reference", "ignorethis"), rename("VBE", "testVBE")
#import "C:\\Program Files\\Microsoft Office\\Office12\\EXCEL.EXE" exclude("IFont", "IPicture") rename("RGB", "ignorethis"), rename("DialogBox", "ignorethis"), rename("VBE", "testVBE"), rename("ReplaceText", "EReplaceText"), rename("CopyFile","ECopyFile"), rename("FindText", "EFindText"), rename("NoPrompt", "ENoPrompt")
After migration to ObjectARX 2007 I have troubles retrieving IAcadApplication interface to add menu items. The code looks something like this:
CComPtr< IDispatch > pAcadDisp = NULL;
pAcadDisp = acedGetAcadWinApp()->GetIDispatch(TRUE);
CComPtr< IAcadApplication > pAcad;
hr = pAcadDisp->QueryInterface(IID_IAcadApplication, (void**)&pAcad); // fails here with HRESULT of E_NOINTERFACE
I have checked IID_IAcadApplicatio identifier and it seems that I get one that is specified in ObjectARX 2004.
2007 version:
MIDL_DEFINE_GUID(IID, IID_IAcadApplication,0x8F17437C,0x2EFB,0x4FC4,0x81,0x88,0xEE,0xFA,0x50,0xFE,0x7 1,0x47);
2004 version:
MIDL_DEFINE_GUID(IID, IID_IAcadApplication,0x93bc4e71,0xafe7,0x4aa7,0xbc,0x07,0xf8,0x0a,0xcd,0xb6,0x7 2,0xd5);
I'm not a COM expert and I can't figure out how is it possible that IID_IAcadApplication is from 2004 OARX version. All paths are set to 2007 OARX.
I have tryed manually change this identifier through the VS IDE and everything worked fine.
I have 2005, 2007, 2008 AutoCAD installed on my computer.
Any ideas?
CString sz = _T("Notepad.exe ") + BomName;
char p[501]={0};
strncpy(p,(LPCSTR)_bstr_t(sz),500);
WinExec(p, SW_SHOW); |
|