我需要在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中找到完整的代码。