acdbEntGet和acdbEntGetX

acdbEntGet和acdbEntGetX

我需要在C#中为acdbEntGet和acdbEntGetX包装。这些功能位于accore.dll(AutoCAD 2014)中,我已经尝试过:

[DllImport("accore.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Auto, EntryPoint = "acdbEntGetX")]
public static extern IntPtr acdbEntGetX(Int64 e, IntPtr app);

[DllImport("accore.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Auto, EntryPoint = "acdbEntGet")]
public static extern IntPtr acdbEntGet(Int64 e);


这两个函数的返回值(IntPtr)始终为0。没有错误或异常。

几乎每个ObjectARX C ++函数都包装在C#托管库中,但是这两个函数却没有。我想知道为什么。

哦,有人可能会问我为什么需要这些功能...答案是我想将一个列表返回给Lisp,可以直接将其提供给(entmake)而无需进行修改。这是使用acdbEntGet和acdbEntGetX完成的。 “手动”创建列表是一个选项,但这不是我想要的(是的,我知道如何在C#ObjectARX中创建列表):)

编辑:这是在C ++中定义这些功能的方式

struct resbuf *acdbEntGetX (const ads_name ent, const struct resbuf *args);
struct resbuf *acdbEntGet (const ads_name ent);


struct resbuf是adsdef.h中定义的链接列表

struct resbuf {
        struct resbuf *rbnext;
        short restype;
        union ads_u_val resval;
};


ads_name是两个64位整数的数组(如果我记得正确的话)

最佳答案

对于entget,应该是这样的:

public struct ads_name
{
    public IntPtr a;
    public IntPtr b;
};

[DllImport("accore.dll", CallingConvention = CallingConvention.Cdecl]
static extern IntPtr acdbEntGet(ads_name objName);


像这样使用它:

IntPtr res = acdbEntGet(name);
if (res != IntPtr.Zero)
  ResultBuffer rb = ResultBuffer.Create(res, true);


要将ObjectId转换为ads_name,必须使用acdbGetAdsName

[DllImport("acdb19.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint="?acdbGetAdsName@@YA?AW4ErrorStatus@Acad@@AEAY01_JVAcDbObjectId@@@Z"]
static extern ErrorStatus acdbGetAdsName64(ads_name objName, ObjectId id);


this post中,您可以在VB.NET中找到完整的代码。

08-16 03:36