Kerry 发表于 2010-1-27 18:49:43

NET P/INVOKE例程

鼓励 AutoCAD P/INVOKE 的库线程

.NET 中发布有关AutoCAD P/INVOKE 的任何函数、方法、截图:C# 、VB、F# 、Python 等
请随时包含注释、描述性注释、限制和图像来记录您的帖子。
请在常规线程中发布问题。
添加注意:
请注意,
由于名称修改

依赖于 x32 或 x64 平台的不同入口点签名,p/invoke 方法有时在不同的 ACAD 版本中具有不同的入口点。
**** Hidden Message *****

MickD 发表于 2010-1-27 19:40:27

这里有几个例子,其中一些或全部可能已经过时,但它们可能仅供参考。

      [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();

fixo 发表于 2010-1-27 20:50:15

由于p/调用方法有时由于名称修改而具有不同的入口点,因此指定Acad版本可能是个好主意。

LE3 发表于 2010-1-28 04:06:56

看看用法的例子也会很有趣...
~J'~

LE3 发表于 2010-4-13 12:52:43

只是碰巧...
有人为std:map做过PInvoke吗?
来自非托管的Like:

extern "C" __declspec(dllexport)
void steelMEPcollisions (map pipeDiamMap) { ... }
我希望以上内容能够简单易懂:

public static extern void CollisionsSteelMEP ( Dictionary pipeDiamMap );
谢谢。

LE3 发表于 2010-4-13 13:50:03

与此同时,我们将采用这种方法:
>
对id和doubles使用不同的参数,并确保在它们的数组中保持相同的位置——我们已经对这些类型做了一些工作,所以猜测会容易得多。

jgr 发表于 2010-4-13 20:45:18


如果有人最终砸在同一面墙上:

入场券(或者对我来说更容易的路线)是使用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);

Kerry 发表于 2010-5-25 20:16:17

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)

gile 发表于 2010-5-28 17:41:38

我一直在玩这个使用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

LE3 发表于 2010-5-28 18:27:58


彼得,
这不是在其他地方为你发布的代码吗?
问候
页: [1] 2
查看完整版本: NET P/INVOKE例程