乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 176|回复: 13

NET P/INVOKE例程

[复制链接]

116

主题

996

帖子

9

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1466
发表于 2010-1-27 18:49:43 | 显示全部楼层 |阅读模式
鼓励 AutoCAD P/INVOKE 的库线程

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

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

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

69

主题

875

帖子

15

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1146
发表于 2010-1-27 19:40:27 | 显示全部楼层
这里有几个例子,其中一些或全部可能已经过时,但它们可能仅供参考。
  1.         [DllImport("acad.exe", CallingConvention = CallingConvention.Cdecl,
  2.              EntryPoint = "?acedSetCurrentView@@YA?AW4ErrorStatus@Acad@@PAVAcDbViewTableRecord@@PAVAcDbViewport@@@Z")]
  3.         private static extern int acedSetCurrentView(IntPtr pVtr, /*IntPtr.Zero*/IntPtr pVP);
  4.         [DllImport("acad.exe", CallingConvention = CallingConvention.Cdecl, EntryPoint = "acedTrans")]
  5.         static extern int acedTrans(double[] point, IntPtr fromRb, IntPtr toRb, int disp, double[] result);
  6.         [DllImport("acad.exe", CallingConvention = CallingConvention.Cdecl,
  7.              EntryPoint = "?acedVports2VportTableRecords@@YA?AW4ErrorStatus@Acad@@XZ")]
  8.         private static extern bool acedVports2VportTableRecords();
  9.         [DllImport("acad.exe", CallingConvention = CallingConvention.Cdecl,
  10.              EntryPoint = "?acedVportTableRecords2Vports@@YA?AW4ErrorStatus@Acad@@XZ")]
  11.         private static extern bool acedVportTableRecords2Vports();

回复

使用道具 举报

1

主题

1069

帖子

1050

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
69
发表于 2010-1-27 20:50:15 | 显示全部楼层
由于p/调用方法有时由于名称修改而具有不同的入口点,因此指定Acad版本可能是个好主意。
回复

使用道具 举报

LE3

10

主题

149

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
189
发表于 2010-1-28 04:06:56 | 显示全部楼层
看看用法的例子也会很有趣...
~J'~
回复

使用道具 举报

LE3

10

主题

149

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
189
发表于 2010-4-13 12:52:43 | 显示全部楼层
只是碰巧...
有人为std:map做过PInvoke吗?
来自非托管的Like:

  1. extern "C" __declspec(dllexport)
  2. void steelMEPcollisions (map pipeDiamMap) { ... }

我希望以上内容能够简单易懂:
  1. [DllImport(STEEL_ARX, CallingConvention = CallingConvention.Cdecl, EntryPoint = "steelMEPcollisions ")]
  2. public static extern void CollisionsSteelMEP ( Dictionary pipeDiamMap );

谢谢。
回复

使用道具 举报

LE3

10

主题

149

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
189
发表于 2010-4-13 13:50:03 | 显示全部楼层
与此同时,我们将采用这种方法:
>
对id和doubles使用不同的参数,并确保在它们的数组中保持相同的位置——我们已经对这些类型做了一些工作,所以猜测会容易得多。

回复

使用道具 举报

jgr

3

主题

22

帖子

3

银币

初来乍到

Rank: 1

铜币
34
发表于 2010-4-13 20:45:18 | 显示全部楼层

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

入场券(或者对我来说更容易的路线)是使用resbuf*和ResultBuffer
  1. // C++ - unmanaged
  2. extern "C" __declspec(dllexport)
  3. void steelMEPcollisions ( resbuf *pArgs ) { ... }
  4. // C# - managed     
  5. public static class SteelFunctions        
  6. {
  7.     [DllImport(STEEL_ARX, CallingConvention = CallingConvention.Cdecl, EntryPoint = "steelMEPcollisions ")]
  8.     public static extern void CollisionsSteelMEP ( IntPtr pArgs );
  9. }
  10.         
  11. public static void CollisionsMEPSteel ( ResultBuffer args )   
  12. {        
  13.     SteelFunction.CollisionsSteelMEP( args.UnmanagedObject );        
  14. }
  15. ResultBuffer args = new ResultBuffer();                        
  16. args.Add(new TypedValue((int)LispDataType.ListBegin, -1));                        
  17. args.Add(new TypedValue((int)LispDataType.ListBegin, -1));                        
  18. args.Add(new TypedValue((int)LispDataType.Int32, oldIdPtr.ToInt32()));                        
  19. args.Add(new TypedValue((int)LispDataType.Double, diam));                       
  20. args.Add(new TypedValue((int)LispDataType.ListEnd, -1));                        
  21. args.Add(new TypedValue((int)LispDataType.ListEnd, -1));
  22. PInvoke.CollisionsMEPSteel(args);

回复

使用道具 举报

116

主题

996

帖子

9

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1466
发表于 2010-5-25 20:16:17 | 显示全部楼层
FindText“API”,带有acad 2007 32位
  1. '#define AC_SRCH_BLOCK         0x01
  2. '#define AC_SRCH_DIM_TEXT      0x02
  3. '#define AC_SRCH_TEXT          0x04
  4. '#define AC_SRCH_LINK_DESC     0x08
  5. '#define AC_SRCH_LINK_URL      0x10
  6. '#define AC_SRCH_MATCH_CASE    0x20
  7. '#define AC_SRCH_WHOLE_WORD    0x40
  8. '#define AC_SRCH_DEFAULT       0x1F
  9. 'bool acdbTextFind(AcDbDatabase* pDatabase,
  10. '                  AcDbObjectIdArray& resultSet,
  11. '                  const ACHAR* findString,
  12. '                  const ACHAR* replaceString = NULL,
  13. '                  Adesk::UInt8 searchOptions = AC_SRCH_DEFAULT,
  14. '                  const AcDbObjectIdArray& selSet = 0);
  15. Public Const AC_SRCH_BLOCK As Integer = 1
  16. Public Const AC_SRCH_DIM_TEXT As Integer = 2
  17. Public Const AC_SRCH_TEXT As Integer = 4
  18. Public Const AC_SRCH_LINK_DESC As Integer = 8
  19. Public Const AC_SRCH_LINK_URL As Integer = 16
  20. Public Const AC_SRCH_MATCH_CASE As Integer = 32
  21. Public Const AC_SRCH_WHOLE_WORD As Integer = 64
  22. Public Const AC_SRCH_DEFAULT As Integer = 31
  23. _
  24. Private Shared Function acdbTextFind(ByVal pDb As System.IntPtr, _
  25.                                  ByVal resultSet As System.IntPtr, _
  26.                             ByVal findString As String, _
  27.                             ByVal replaceString As String, _
  28.                            ByVal searchOptions As Integer, _
  29.                            ByVal selSet As System.IntPtr) As  Boolean
  30. End Function
  31. Public Shared Sub ZZ()
  32.     Dim oidIn As New ObjectIdCollection
  33.     Dim oidOut As New ObjectIdCollection
  34.     Dim ret As Boolean
  35.     Dim db As Database = Application.DocumentManager.MdiActiveDocument.Database
  36.     ret = acdbTextFind(db.UnmanagedObject, oidOut.UnmanagedObject, "hello", Nothing, AC_SRCH_DEFAULT, oidIn.UnmanagedObject)
  37.     If ret Then
  38.         For Each id As ObjectId In oidOut
  39.             '
  40.         Next
  41.     End If
  42.     oidIn.Dispose()
  43.     oidOut.Dispose()
  44. End Sub

有人能向我解释为什么不同的入口点签名依赖于x32或x64平台吗?我在第一篇文章中读到了这一点,但我不明白(我来自vba/vb6)
回复

使用道具 举报

15

主题

687

帖子

169

银币

中流砥柱

Rank: 25

铜币
582
发表于 2010-5-28 17:41:38 | 显示全部楼层
我一直在玩这个使用lisp。
  1. Imports Autodesk.AutoCAD.Runtime
  2. Imports Autodesk.AutoCAD.EditorInput
  3. Imports Autodesk.AutoCAD.DatabaseServices
  4. Imports Autodesk.AutoCAD.ApplicationServices
  5. Imports System.Runtime.InteropServices 'for DllImport()
  6. Imports System.Security
  7. _
  8.     Private Shared Function acedInvoke(ByVal rbIn As IntPtr,  ByRef rbOut As IntPtr) As Integer
  9.     End Function
  10.     Public Shared Function InvokeLisp(ByVal resbuf As ResultBuffer) As ResultBuffer
  11.         Dim rb As IntPtr = IntPtr.Zero
  12.         Class1.acedInvoke(resbuf.UnmanagedObject, rb)
  13.         Return DirectCast(DisposableWrapper.Create(GetType(ResultBuffer), rb, True), ResultBuffer)
  14.     End Function

回复

使用道具 举报

LE3

10

主题

149

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
189
发表于 2010-5-28 18:27:58 | 显示全部楼层

彼得,
这不是在其他地方为你发布的代码吗?
问候
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-2-5 20:01 , Processed in 0.696225 second(s), 72 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表