我需要 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);
两个函数的返回值 (a 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 位整数的数组(如果我没记错的话)