PInvoke acdbEntUpd
我是脑死亡,需要一只手。我正在尝试在单个实体上实现更新。
测试平台有点人为的,但你应该明白这个想法(我希望)
我试图编码它以显示回报......
问题是:
选择一个实体后,acdbEntUpd()返回RTERROR(-5001)
和ERRNO为5
,我的头疼,我要睡觉,希望编程仙女能解决这个问题
评论是内联的
namespace KdubTesting
{
// CodeHimBelongaKdub ©Jun 2008
public partial class Kdub_API
{
//====================================================================================
public static extern int acdbEntUpd(Int64 adsName);
//====================================================================================
/*
Acad::ErrorStatus acdbGetAdsName(
ads_name& objName,
AcDbObjectId obj
);
This function fills in objName with the ads_name that corresponds to the objId object ID.
Returns Acad::eOk if successful. If objId is 0, then Acad::eNullObjectId is returned.
*/
[DllImport("acdb18.dll", CallingConvention = CallingConvention.Cdecl,
EntryPoint = "?acdbGetAdsName@@YA?AW4ErrorStatus@Acad@@AAY01JVAcDbObjectId@@@Z")]
public extern static ErrorStatus acdbGetAdsName(out Int64 objName, ObjectId objId );
//====================================================================================
}
// CodeHimBelongaKdub ©Jun 2008
public partial class TestCommands
{
static public void TestacdbEntUpd()
{
Document doc = AcadApp.DocumentManager.MdiActiveDocument;
Editor ed = doc.Editor;
Database db = doc.Database;
PromptEntityResult res = ed.GetEntity("\nSelect an entity to Regen:");
ObjectId id = res.ObjectId;
Int64 adsName;
ErrorStatus es;
using(Transaction tr = db.TransactionManager.StartTransaction())
{
es = Kdub_API.acdbGetAdsName(out adsName, id);
ed.WriteMessage("\n adsName is {0} ", adsName);
ed.WriteMessage("\n ErrorStatus is {0} ", es);
int apiReturn = Kdub_API.acdbEntUpd(adsName);
/*
* If acdbEntUpd() succeeds, it returns RTNORM( 5100 )
* otherwise, it returns RTERROR.(-5001 )
* When acdbEntUpd() fails, it sets the system variable ERRNO
* to a value that indicates the reason for the failure.
*/
ed.WriteMessage("\n api acdbEntUpd_Return is {0} ", apiReturn);
ed.WriteMessage("\n System variable ERRNOis {0} ", AcadApp.GetSystemVariable("ERRNO"));
/*
* Returns
* Command: EntUpd
*Select an entity to Regen:
*
* adsName is 8793785127955584200
* ErrorStatus is OK
* api acdbEntUpd_Return is -5001
* System variable ERRNOis 5
*/
tr.Commit();
}
}
}
}
**** Hidden Message ***** 你会讨厌这个的。
将int64更改为long
adsName为9179526903997960920
error status为OK
api acdbEntUpd_Return为4294962295
系统变量ERRNO为5
谢谢你找布莱斯
注ERRNO的可能值及其含义可能会发生变化。
联机程序错误代码
值
含义
0
无错误
1
无效的符号表名称
2
无效的实体或选择集名称
3
超过了选择集的最大数量
4
无效的选择集
5
块定义使用不当
6
外部参照使用不当 Bryce,
一个 long 和一个 Int64 是一回事,64 位有符号整数
'long' 只是 Int64 的别名。
事实上,如果我们右键单击“long”并选择“GoToDefinition”,则定义ig是
// 摘要:
// 表示一个 64 位有符号整数。
[可序列化]
公共结构Int64 : IComparable, IFormattable, IConvertible, IComparable
, IEquatable
{ //................
//--------------------------------------------------
另
一个线索:acdbEntUpd 生成 ERRNO 为 5
当例程返回到 AutoCAD 时,命令Line 中的 ERRNO 命令将报告 2。
acdbGetAdsName的'扰频'名称在acdb17.dll32位和acdb18.dll32位中是相同的... 对不起,我不明白,但是试试:
acdbEntUpd(ObjectId adsName)
我认为adsname=对象 感谢您的查看
也许它应该。
我首先尝试了一下,得到了同样的错误,所以尝试了acdbGetAdsName()
ie:使用
//public static extern int acdbEntUpd(long adsName);
public static extern int acdbEntUpd(ObjectId objId);
和
int apiReturn = Kdub_API.acdbEntUpd(id);
我得到
命令: entupd
选择一个实体来重新生成:
api acdbEntUpd_Return是 -5001
系统变量 ERRNO 是 5
完成: 系统变量 ERRNO 是 5
[已添加]
但命令行的 errno 现在是 0,因为它应该是 看看这是否有效(从大师那里学到的)。
谢谢Luis,我很快会看一下
你知道为什么用long数组作为参数吗??
页:
[1]
2