Kerry 发表于 2010-6-12 08:43:01

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 *****

Bryco 发表于 2010-6-12 10:56:13

你会讨厌这个的。
将int64更改为long
adsName为9179526903997960920
error status为OK
api acdbEntUpd_Return为4294962295
系统变量ERRNO为5

Kerry 发表于 2010-6-12 17:49:23


谢谢你找布莱斯

Kerry 发表于 2010-6-12 18:16:36

注ERRNO的可能值及其含义可能会发生变化。
联机程序错误代码


含义

0
无错误

1
无效的符号表名称

2
无效的实体或选择集名称

3
超过了选择集的最大数量

4
无效的选择集

5
块定义使用不当
6
外部参照使用不当

Kerry 发表于 2010-6-12 18:46:42

Bryce,
一个 long 和一个 Int64 是一回事,64 位有符号整数
'long' 只是 Int64 的别名。
事实上,如果我们右键单击“long”并选择“GoToDefinition”,则定义ig是
// 摘要:
// 表示一个 64 位有符号整数。
   [可序列化]

公共结构Int64 : IComparable, IFormattable, IConvertible, IComparable
, IEquatable
{ //................
//--------------------------------------------------

一个线索:acdbEntUpd 生成 ERRNO 为 5
当例程返回到 AutoCAD 时,命令Line 中的 ERRNO 命令将报告 2。

Kerry 发表于 2010-6-12 19:12:19


acdbGetAdsName的'扰频'名称在acdb17.dll32位和acdb18.dll32位中是相同的...

jgr 发表于 2010-6-12 19:30:27

对不起,我不明白,但是试试:
acdbEntUpd(ObjectId adsName)
我认为adsname=对象

Kerry 发表于 2010-6-12 19:52:02

感谢您的查看
也许它应该。
我首先尝试了一下,得到了同样的错误,所以尝试了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,因为它应该是

LE3 发表于 2010-6-12 19:54:21

看看这是否有效(从大师那里学到的)。

Kerry 发表于 2010-6-12 20:08:53


谢谢Luis,我很快会看一下
你知道为什么用long数组作为参数吗??
页: [1] 2
查看完整版本: PInvoke acdbEntUpd