NET P/INVOKE例程
鼓励 AutoCAD P/INVOKE 的库线程在
.NET 中发布有关AutoCAD P/INVOKE 的任何函数、方法、截图:C# 、VB、F# 、Python 等
请随时包含注释、描述性注释、限制和图像来记录您的帖子。
请在常规线程中发布问题。
添加注意:
请注意,
由于名称修改
和
依赖于 x32 或 x64 平台的不同入口点签名,p/invoke 方法有时在不同的 ACAD 版本中具有不同的入口点。
**** Hidden Message ***** 这里有几个例子,其中一些或全部可能已经过时,但它们可能仅供参考。
[DllImport("acad.exe", CallingConvention = CallingConvention.Cdecl,
EntryPoint = "?acedSetCurrentView@@YA?AW4ErrorStatus@Acad@@PAVAcDbViewTableRecord@@PAVAcDbViewport@@@Z")]
private static extern int acedSetCurrentView(IntPtr pVtr, /*IntPtr.Zero*/IntPtr pVP);
static extern int acedTrans(double[] point, IntPtr fromRb, IntPtr toRb, int disp, double[] result);
[DllImport("acad.exe", CallingConvention = CallingConvention.Cdecl,
EntryPoint = "?acedVports2VportTableRecords@@YA?AW4ErrorStatus@Acad@@XZ")]
private static extern bool acedVports2VportTableRecords();
[DllImport("acad.exe", CallingConvention = CallingConvention.Cdecl,
EntryPoint = "?acedVportTableRecords2Vports@@YA?AW4ErrorStatus@Acad@@XZ")]
private static extern bool acedVportTableRecords2Vports();
由于p/调用方法有时由于名称修改而具有不同的入口点,因此指定Acad版本可能是个好主意。 看看用法的例子也会很有趣...
~J'~ 只是碰巧...
有人为std:map做过PInvoke吗?
来自非托管的Like:
extern "C" __declspec(dllexport)
void steelMEPcollisions (map pipeDiamMap) { ... }
我希望以上内容能够简单易懂:
public static extern void CollisionsSteelMEP ( Dictionary pipeDiamMap );
谢谢。 与此同时,我们将采用这种方法:
>
对id和doubles使用不同的参数,并确保在它们的数组中保持相同的位置——我们已经对这些类型做了一些工作,所以猜测会容易得多。
如果有人最终砸在同一面墙上:
入场券(或者对我来说更容易的路线)是使用resbuf*和ResultBuffer
// C++ - unmanaged
extern "C" __declspec(dllexport)
void steelMEPcollisions ( resbuf *pArgs ) { ... }
// C# - managed
public static class SteelFunctions
{
public static extern void CollisionsSteelMEP ( IntPtr pArgs );
}
public static void CollisionsMEPSteel ( ResultBuffer args )
{
SteelFunction.CollisionsSteelMEP( args.UnmanagedObject );
}
ResultBuffer args = new ResultBuffer();
args.Add(new TypedValue((int)LispDataType.ListBegin, -1));
args.Add(new TypedValue((int)LispDataType.ListBegin, -1));
args.Add(new TypedValue((int)LispDataType.Int32, oldIdPtr.ToInt32()));
args.Add(new TypedValue((int)LispDataType.Double, diam));
args.Add(new TypedValue((int)LispDataType.ListEnd, -1));
args.Add(new TypedValue((int)LispDataType.ListEnd, -1));
PInvoke.CollisionsMEPSteel(args);
FindText“API”,带有acad 2007 32位
'#define AC_SRCH_BLOCK 0x01
'#define AC_SRCH_DIM_TEXT 0x02
'#define AC_SRCH_TEXT 0x04
'#define AC_SRCH_LINK_DESC 0x08
'#define AC_SRCH_LINK_URL 0x10
'#define AC_SRCH_MATCH_CASE 0x20
'#define AC_SRCH_WHOLE_WORD 0x40
'#define AC_SRCH_DEFAULT 0x1F
'bool acdbTextFind(AcDbDatabase* pDatabase,
' AcDbObjectIdArray& resultSet,
' const ACHAR* findString,
' const ACHAR* replaceString = NULL,
' Adesk::UInt8 searchOptions = AC_SRCH_DEFAULT,
' const AcDbObjectIdArray& selSet = 0);
Public Const AC_SRCH_BLOCK As Integer = 1
Public Const AC_SRCH_DIM_TEXT As Integer = 2
Public Const AC_SRCH_TEXT As Integer = 4
Public Const AC_SRCH_LINK_DESC As Integer = 8
Public Const AC_SRCH_LINK_URL As Integer = 16
Public Const AC_SRCH_MATCH_CASE As Integer = 32
Public Const AC_SRCH_WHOLE_WORD As Integer = 64
Public Const AC_SRCH_DEFAULT As Integer = 31
_
Private Shared Function acdbTextFind(ByVal pDb As System.IntPtr, _
ByVal resultSet As System.IntPtr, _
ByVal findString As String, _
ByVal replaceString As String, _
ByVal searchOptions As Integer, _
ByVal selSet As System.IntPtr) AsBoolean
End Function
Public Shared Sub ZZ()
Dim oidIn As New ObjectIdCollection
Dim oidOut As New ObjectIdCollection
Dim ret As Boolean
Dim db As Database = Application.DocumentManager.MdiActiveDocument.Database
ret = acdbTextFind(db.UnmanagedObject, oidOut.UnmanagedObject, "hello", Nothing, AC_SRCH_DEFAULT, oidIn.UnmanagedObject)
If ret Then
For Each id As ObjectId In oidOut
'
Next
End If
oidIn.Dispose()
oidOut.Dispose()
End Sub
有人能向我解释为什么不同的入口点签名依赖于x32或x64平台吗?我在第一篇文章中读到了这一点,但我不明白(我来自vba/vb6) 我一直在玩这个使用lisp。
Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.EditorInput
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.ApplicationServices
Imports System.Runtime.InteropServices 'for DllImport()
Imports System.Security
_
Private Shared Function acedInvoke(ByVal rbIn As IntPtr,ByRef rbOut As IntPtr) As Integer
End Function
Public Shared Function InvokeLisp(ByVal resbuf As ResultBuffer) As ResultBuffer
Dim rb As IntPtr = IntPtr.Zero
Class1.acedInvoke(resbuf.UnmanagedObject, rb)
Return DirectCast(DisposableWrapper.Create(GetType(ResultBuffer), rb, True), ResultBuffer)
End Function
彼得,
这不是在其他地方为你发布的代码吗?
问候
页:
[1]
2