澳门金莎娱乐手机版 金沙澳门手机版网址 这里安装的是cad2012和objectArx2010,但是很慢开个网页要等很久不是代理慢是我代码有问题澳门金莎娱乐手机版

这里安装的是cad2012和objectArx2010,但是很慢开个网页要等很久不是代理慢是我代码有问题澳门金莎娱乐手机版

lsp安装代码写好了dll也写得大约了当今意识多少个标题一向苦闷自个儿几天了…就是把温馨的dll安装到lsp上现在开火狐浏览器完全能够经过sock5代理转载数量包!但是超慢开个网页要等十分久不是代理慢是自个儿代码有标题!而且安装lsp后谷歌(Google卡塔尔(英语:State of Qatar)浏览器根本打不开!笔者想恐怕是自己hookWSPConnect函数的时候小编改过了套接字梗塞所导致的吧!笔者真心地服气求大神!支持看看啊!

1   景况搭建:安装CAD 和objectArx库,这里设置的是cad二〇一三和objectArx2010,vs是二〇〇九

//连接socks5代理intsocksProxy(SOCKETs,conststructsockaddr*name,intnamelen){charip[]="115.47.40.65";inthost=1085;charuser[]="user";charpassword[]="sock5";intrc=0;//这里应该先保存下socket的阻塞/非阻塞类型,在最后面跟据这里的值将它还原,但是不知道怎样获取此类型//修改socket为阻塞类型unsignedlongnonBlock=0;rc=WSAEventSelect(s,0,NULL);rc=ioctlsocket(s,FIONBIO,nonBlock);//这个真正修改为阻塞类型//连接代理服务器sockaddr_inserveraddr;memset(serveraddr,0,sizeof(serveraddr));serveraddr.sin_family=AF_INET;serveraddr.sin_addr.S_un.S_addr=inet_addr(ip);serveraddr.sin_port=htons(host);//端口号WSABUFDataBuf;charbuffer[4];memset(buffer,0,sizeof(buffer));DataBuf.len=4;DataBuf.buf=buffer;interr=0;if((rc=NextProcTable.lpWSPConnect(s,(structsockaddr*)serveraddr,sizeof(structsockaddr),DataBuf,NULL,NULL,NULL,err))!=0){returnrc;}//发送请求来协商版本和认证方法//VERNMETHODSMETHODS//111to255charverstring[257];verstring[0]=0x05;//VER(1Byte)verstring[1]=0x01;//NMETHODS(1Byte)verstring[2]=0x00;//METHODS(allow1-255bytes,current1byte)if((rc=send(s,verstring,3,0))0){returnrc;}//接收代理服务器返回信息//VERMETHOD//11/*当前定义的方法有:·X’00’不需要认证·X’01’GSSAPI·X’02’用户名/密码·X’03’--X’7F’由IANA分配·X’80’--X’FE’为私人方法所保留的·X’FF’没有可以接受的方法*/charver[2];if(recv(s,ver,2,0)0){returnECONNABORTED;}//代理服务器选择方法//判断我们的方法是否可行if(ver[1]==0xff){returnECONNREFUSED;}//方法0:不需要认证02账号密码认证if(ver[1]==0x00||ver[1]==0x02){//密码认证if(ver[1]==0x02){charBuffer[50];*(int*)(Buffer+0)=(int)1;intui=strlen(user);memcpy(Buffer+1,(char*)ui,1);memcpy(Buffer+2,user,ui);intpi=strlen(password);memcpy(Buffer+2+ui,(char*)pi,1);memcpy(Buffer+2+ui+1,password,pi);if((rc=send(s,Buffer,3+ui+pi,0))0){returnrc;}if((rc=recv(s,Buffer,2,0))0){returnECONNREFUSED;}if(Buffer[1]!=0x00){returnECONNREFUSED;}}//发送SOCKS请求//VERCMDRSVATYPDST.ADDRDST.PROT//11X'00'1Variable2/*VER协议版本:X’05’·CMD·CONNECT:X’01’·BIND:X’02’·UDPASSOCIATE:X’03’·RSV保留·ATYP后面的地址类型·IPV4:X’01’·域名:X’03’·IPV6:X’04’'·DST.ADDR目的地址·DST.PORT以网络字节顺序出现的端口号SOCKS服务器会根据源地址和目的地址来分析请求,然后根据请求类型返回一个或多个应答。*/structsockaddr_insin;sin=*(conststructsockaddr_in*)name;charbuf[10];buf[0]=0x05;//版本SOCKS5buf[1]=0x01;//连接请求buf[2]=0x00;//保留字段buf[3]=0x01;//IPV4memcpy(buf[4],sin.sin_addr.S_un.S_addr,4);memcpy(buf[8],sin.sin_port,2);//发送if((rc=send(s,buf,10,0))0){returnrc;}//应答//VERREPRSVATYPBND.ADDRBND.PORT//11X'00'1Variable2/*VER协议版本:X’05’·REP应答字段:·X’00’成功·X’01’普通的SOCKS服务器请求失败·X’02’现有的规则不允许的连接·X’03’网络不可达·X’04’主机不可达·X’05’连接被拒·X’06’TTL超时·X’07’不支持的命令·X’08’不支持的地址类型·X’09’–X’FF’未定义·RSV保留·ATYP后面的地址类型·IPV4:X’01’·域名:X’03’·IPV6:X’04’·BND.ADDR服务器绑定的地址·BND.PORT以网络字节顺序表示的服务器绑定的段口标识为RSV的字段必须设为X’00’。*/if((rc=recv(s,buf,10,0))0){returnECONNREFUSED;}if(buf[1]!=0x00){switch((int)buf[1]){case1:returnECONNABORTED;case2:returnECONNABORTED;case3:returnENETUNREACH;case4:returnEHOSTUNREACH;case5:returnECONNREFUSED;case6:returnETIMEDOUT;case7:returnECONNABORTED;case8:returnECONNABORTED;default:returnECONNABORTED;}}else{//修改socket为非阻塞类型nonBlock=1;if(rc=ioctlsocket(s,FIONBIO,nonBlock)){returnrc;}return0;}}returnECONNABORTED;}//WSPConnectintWSPAPIWSPConnect(SOCKETs,conststructsockaddr*name,intnamelen,LPWSABUFlpCallerData,LPWSABUFlpCalleeData,LPQOSlpSQOS,LPQOSlpGQOS,LPINTlpErrno){returnsocksProxy(s,name,namelen);}

2  
新建三个类库项目,引用objectArx安装目录下inc文件夹下的AcDbMgd.dll和AcMgd.dll,这里注意X86和X64系统的分别

3
  增添多少个类,三个接续IExtensionApplication接口,那么些是dll的入口,cad会从这么些类加载程序做一些伊始化的操作;别的三个得以写自定义的意气风发部分cad命令

cad的引用:

using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
澳门金莎娱乐手机版,using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Windows;
using Autodesk.AutoCAD.Interop;
using Autodesk.AutoCAD.Interop.Common;

能够增添程序集目录,方便高效加载,在那之中四个类,第三个类标志为进口世袭IExtensionApplication接口,第四个类为自定义的一声令下

[assembly: ExtensionApplication(typeof(cadObjArx.CADExetensionCls))]
[assembly: CommandClass(typeof(cadObjArx.CADCommandS))]

代码:

此间只做多少个简单的事例,更深刻的急需看cad的支动手册。。。。。

namespace cadObjArx
{
    public class CADExetensionCls : IExtensionApplication
    {
        public void Initialize()
        {//加载dll的时候执行相关加载操作

            Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
            ed.WriteMessage("n加载cadObjArxn");
            load();
        }

        public void Terminate()
        {//这个是推出时执行
            Document doc = Application.DocumentManager.MdiActiveDocument;
            doc.LockDocument(DocumentLockMode.NotLocked, "", "", false);
        }
        private void load()
        {   //这里添加一个工具条,添加一个按钮绑定下面的InitT命令
        //这个是通过引用cad的com组件实现的,需要引用cad的Autodesk.AutoCAD.Interop和Autodesk.AutoCAD.Interop.Common两个com组件,
            AcadMenuGroups menugroups = (AcadMenuGroups)Application.MenuGroups;
            AcadToolbar toolbar = menugroups.Item(0).Toolbars.Add("Test");
            AcadToolbarItem item = toolbar.AddToolbarButton(toolbar.Count, "InitT", "测试", "InitTn");
            item.SetBitmaps("设置16x16.bmp", "设置32x32.bmp");
            toolbar.Dock(AcToolbarDockStatus.acToolbarDockTop);
        }
    }
    public class CADCommandS
    {
        [CommandMethod("InitT",CommandFlags.Modal)]//特性标识,标识这个是cad命令
        public void Init()
        {//这里做个测试,命令行中输出一句话,按下上面添加的按钮或者在命令行中输入命令就会被执行
            Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
            ed.WriteMessage("测试initn"); 

        }

        [CommandMethod("ListEntities")]
        public  void ListEntities()
        {//这个是遍历当前cad打开的文档中的对象//在命令行中写命令即可执行
            Document acDoc = Application.DocumentManager.MdiActiveDocument;
            Database acCurDb = acDoc.Database;
            using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
            {
                BlockTable acBlkTbl;
                acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead) as BlockTable;

                BlockTableRecord acBlkTblRec;
                acBlkTblRec = acTrans.GetObject(acBlkTbl[BlockTableRecord.ModelSpace], OpenMode.ForRead) as BlockTableRecord;
                int nCnt = 0;
                acDoc.Editor.WriteMessage("nModel space objects: ");
                foreach (ObjectId acObjId in acBlkTblRec)
                {
                    acDoc.Editor.WriteMessage("n" + acObjId.ObjectClass.DxfName +":"+ acObjId.Handle.Value.ToString());
                    nCnt = nCnt + 1;
                }


                if (nCnt == 0)
                {
                    acDoc.Editor.WriteMessage("nNo objects found.");
                }
                else
                {
                    acDoc.Editor.WriteMessage("nTotal {0} objects.", nCnt);
                }

            }
        }
    }
}

 

4
  调节和测量试验,在品种性质中,设置调节和测验->启动外界程序,钦点cad的启航路线,钦定专门的学业目录为近来途序的生成目录,既可调弄整理。

那边每一趟调节和测验后,都要在运行cad后,通过netload命令加载dll,比较麻烦,能够在上头的劳作目录下增添三个lsp脚本文件cad2011.lsp,里面增添一条加载的口舌(command
“netload” “cadObjArx.dll”卡塔尔

诸如此比每便运行调试后,cad为全自动加载目录下的cadObjArx.dll。能够钦赐命令行参数为二个dwg文件的门路,那样每一次cad会间接展开一个定位文件方便调节和测验

还恐怕有三个主题材料,因为上边引用了八个objectArx的库,系统私下认可会把那多个库复制到生成目录下,会招致莫名美妙的加载失败,设置成不出口后,就平常了。

5  计划,能够再建八个可执路程序的类型,通过调用com组件的方法来运转cad和加载dll,也得以用地点十一分格局呢lsp脚本文件和要采用的cad文件放在同样目录下,cad为活动实行脚本

下边通过二个调节台程序运行cad并加载dll

        Console.WriteLine("start..");
            string sProgID = "AutoCAD.Application.18.2";
            try
            {
                if (System.Diagnostics.Process.GetProcessesByName("acad").Count() > 0)//判断当前有没cad在运行
                {
                    Console.WriteLine("获取打开的cad");
                    acApp = (AcadApplication)Marshal.GetActiveObject(sProgID);//获取当前运行的cad对象
                }
                else
                {
                    Console.WriteLine("open cad");
                    acApp = new AcadApplication();//没有直接建一个
                    acApp.Visible = true;
                }
            }
            catch (Exception exc)
            {
                Console.WriteLine(exc.Message);
            }

            if (acApp != null)
            {
                Console.WriteLine("netload begin ");
                try
                {//加载dll
                    string dllPath = @"D:workspacetestcadObjArxbinDebugcadObjArx.dll";
                    string sCommand = "(command "netload" "{0}")n";
                    dllPath = dllPath.Replace("\", "\\");
                    acApp.ActiveDocument.SendCommand(string.Format(sCommand, dllPath));

                }
                catch (Exception exload)
                {
                    Console.WriteLine("netload err:{0}", exload.Message);

                }
            }

 

标签:

发表评论

电子邮件地址不会被公开。 必填项已用*标注

相关文章

网站地图xml地图