用vs.net2002(vc7.0)开发ObjectARX2004应该注意的地方
1.CODE:
Q为何用VC7开发ObjectARX2004程序总是出错?
请问哪位高手:
我以前用VC6在ObjectARX2000开发的程序一切正常,现在移植到Microsoft Visual Studio .NET 2003的VC7,使用ObjectARX2004,版本不兼容的地方都修改了,可是在编译连接时始终出错,例如提示:
无法解析的外部符号 "protected: virtual int __thiscall CAdUiBaseDialog::FindContextHelpFullPath(char const *,class ATL::CStringT > > &)" (?FindContextHelpFullPath@CAdUiBaseDialog@@MAEHPBDAAV?$CStringT@DV?$StrTraitMFC_DLL@DV?$ChTraitsCRT@D@ATL@@@@@ATL@@@Z)
请那位大哥指点一二,告诉用Visual Studio .NET 2003开发ObjectARX2004程序应注意的问题。
A:
CODE:
我建议你用ObjectARX/DBX/OMF Application Wizard for AutoCAD 2004,然后移植你原来的代码,需要改的要改。关于docs里的帮助,包括Object ARX2004于前面版本的区别,而使用ObjectARX/DBX/OMF Application Wizard for AutoCAD 2004你可以看ObjectARXLabs,这些都在Objarx的目录下有,而且也写的很具体和简单。然后调试你的程序,用CAD2004调试哦,你就会发现错在哪里了。
2.关于无法在编译环境中无法设置断点的解决方法.
Q:
CODE:
谁会配置vc7,arx for 2004环境?是在vc7中.我安装了ObjectARX DebugAttach Addin。但不能加断点。提示:‘acad.exe’does not
contain debugging information.(No symbols load),Chile OK to debug anyway.如果你知道的话,能不能给我说详细的配置?谢谢
A: CODE:
AUTOCAD2004软件许可证管理中含有防调试代码.(非美国/加拿大)
试一下以下过程:
1.单独启动AutoCAd
2.使用开发环境的"附加到进程"功能.使用"工具"中的"调试过程"来使用该功能.
另:在AutoCAd提供的ARx的 utils/debugAttach文件夹下有实用程序帮助实现.
A:我现在是这样调试的:::在菜单中Debug --> Start Without Debugging...启动AutoCAD2004(这样可以得到最新的ARX,当然,你也可以在外部启动)。然后Debug ---> Processes...打开Processes对话框,在Available Processes表中选中acad.exe Process,然后点击Attach...,弹出Attach to Process对话框,在Choose the program types that you want to debug:中在Native前打钩,点击OK后VC7就好了。最后就是在CAD 2004中运行你的arx程序,而在VC7中就会在你设的断点停下来可以调试了。 /
3.q
CODE:
error C2593: “operator +=”不明确
c:/Program Files/Microsoft Visual Studio .NET 2003/Vc7/atlmfc/include/cstringt.h(1075): 可能是“ATL::CStringT<BaseType,StringTraits> &ATL::CStringT<BaseType,StringTraits>:perator +=(wchar_t)”
with
[
BaseType=char,
StringTraits=StrTraitMFC_DLL<char>
]
c:/Program Files/Microsoft Visual Studio .NET 2003/Vc7/atlmfc/include/cstringt.h(1068): 或 “ATL::CStringT<BaseType,StringTraits> &ATL::CStringT<BaseType,StringTraits>:perator +=(unsigned char)”
with
[
BaseType=char,
StringTraits=StrTraitMFC_DLL<char>
]
c:/Program Files/Microsoft Visual Studio .NET 2003/Vc7/atlmfc/include/cstringt.h(1061): 或 “ATL::CStringT<BaseType,StringTraits> &ATL::CStringT<BaseType,StringTraits>:perator +=(char)”
with
[
BaseType=char,
StringTraits=StrTraitMFC_DLL<char>
]
试图匹配参数列表“(CString, UINT)”时
回答: CODE:
把nChar强制类型转换一下 UINT nData;
//...
CString strData;
strData.Format("%d",nData);<!--/9team-->
4、
CODE:
在VC6下写的程序移植到VC7下,在VC7下编译,对于从CACUIDIALOG派生出来的对话框对下一段代码总提示出错
BEGIN_MESSAGE_MAP(CCreatProjDlg, CAcUiDialog)
//{{AFX_MSG_MAP(CCreatProjDlg) Needed for modeless dialog.
ON_BN_CLICKED(IDC_BROWSE, OnBrowse)
ON_MESSAGE(WM_ACAD_KEEPFOCUS, OnAcadKeepFocus)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
错误提示如下:e:/2004/RutManager/CreatProjDlg.cpp(24): error C2440: “static_cast” : 无法从“LONG (__thiscall CCreatProjDlg::* )(UINT,UINT)”转换为“LRESULT (__thiscall CWnd::* )(WPARAM,LPARAM)”
实际上就是指OnAcadKeepFocus函数的参数和返回值不匹配,
OnAcadKeepFocus函数声明和实现如下
afx_msg LONG OnAcadKeepFocus(UINT, UINT);
LONG CCreatProjDlg::OnAcadKeepFocus(UINT, UINT)
{
return TRUE;
}
上面的代码都是以前在VC6中用ARX工具自动生成的,
有点莫名其妙,不知大家是否碰到过这个问题
回答:
CODE:
在VC++.NET中消息映射 ON_MESSAGE 对应的函数必须申明是LRESULT类型.
在相应的.h文件中修改申明:
将原声明
afx_msg LONG OnAcadKeepFocus(UINT,UINT);
改为
afx_msg LRESULT OnAcadKeepFocus(WPARAM wParam,LPARAM lParam);
而在相应的.cpp文件中修改相应函数:
LONG CCreatProjDlg::OnAcadKeepFocus(UINT, UINT)
{
return TRUE;
}
为
LRESULT CCreatProjDlg::OnAcadKeepFocus(WPARAM wParam,LPARAM lParam)
{
return TRUE;
}
红色的为改变的部分。
5、
CODE:
Q如何使AutoCAD2004自动加载要调试的ARX程序?
你可以在appload中把你的ARX家到自动启动那就可以了,在appload对话框的右下脚看到没有?点击后add就OK了,这你有一篇关于这个的详细讨论的帖子,你找找看,也许对你有帮助!
我要问的是像VC++6.0那样,编译通过后,自动启动AotuCAD2004时,自动加载所编译通过的ARX程序。
这和VC6一样的,在你编译完一个新的ARX后,它会提示你要启动什么程序,你选中autocad2004的acad.exe就可以了,当然,你还要和我上面说的一样,要先加载ARX(Contents ->Add)。
解决了,谢谢楼上的朋友。过去VC6.0能自动生成ACAD.RX文件,利用ACAD.RX文件可以自动加载,而VC++.net无法自动生成ACAD.RX文件。
你必须把你的工程中有个属性就是aucocad的路径设置对,右键点工程点属性,然后在里面找找看。/