
作者:微信公开课+
作品:微信公开课
地区:全国小程序
标签:教育,工具,微信公开课,资讯
描述:微信公开课是微信官方与小程序行业合作伙伴沟通交流的微信小程序社区,为线下微信小程序公开课的免费授课提供线上的相关服务,包括查阅小程序活动议程、参与小程序活动互动以及回顾小程序课程内容等。
声明:作者对小程序服务信息内容及运营行为等真实性/合法性及有效性承担全部责任
订阅微信公开课小程序
-
c#中怎样运行调用的dll文件
2019-03-12 17:01:43微信公开课小程序热门讨论「c#中怎样运行调用的dll文件」最新回复-动态链接库函数的声明动态链接库函数使用前必须声明,相对于VB,C#函数声明显得更加罗嗦,前者通过ApiViewer粘贴以后,可以直接使用,而后者则需要对参数作些额外的变化工作。动态链接库函数声明部分一般由下列两部分组成,一是函数名或索引号,二是动态链接库的文件名。譬如,你想调用User32.DLL中的MessageBox函数,我们必须指明函数的名字MessageBoxA或MessageBoxW,以及库名字User32.dll,我们知道Win32API对每一个涉及字符串和字符的函数一般都存在两个版本,单字节字符的ANSI版本和双字节字符的UNICODE版本。下面是一个调用API函数的例子:[DllImport(KERNEL32.DLL,EntryPoint=MoveFileW,SetLastError=true,CharSet=CharSet.Unicode,ExactSpelling=true,CallingConvention=CallingConvention.StdCall)]publicstaticexternboolMoveFile(Stringsrc,Stringdst);其中入口点EntryPoint标识函数在动态链接库的入口位置,在一个受管辖的工程中,目标函数的原始名字和序号入口点不仅标识一个跨越互操作界限的函数。而且,你还可以把这个入口点映射为一个不同的名字,也就是对函数进行重命名。重命名可以给调用函数带来种种便利,通过重命名,一方面我们不用为函数的大小写伤透脑筋,同时它也可以保证与已有的命名规则保持一致,允许带有不同参数类型的函数共存,更重要的是它简化了对ANSI和Unicode版本的调用。CharSet用于标识函数调用所采用的是Unicode或是ANSI版本,ExactSpelling=false将告诉编译器,让编译器决定使用Unicode或者是Ansi版本。其它的参数请参考MSDN在线帮助.在C#中,你可以在EntryPoint域通过名字和序号声明一个动态链接库函数,如果在方法定义中使用的函数名与DLL入口点相同,你不需要在EntryPoint域显示声明函数。否则,你必须使用下列属性格式指示一个名字和序号。[DllImport(dllname,EntryPoint=Functionname)][DllImport(dllname,EntryPoint=#123)]值得注意的是,你必须在数字序号前加“#”下面是一个用MsgBox替换MessageBox名字的例子:[C#]usingSystem.Runtime.InteropServices;publicclassWin32{[DllImport(user32.dll,EntryPoint=MessageBox)]publicstaticexternintMsgBox(inthWnd,Stringtext,Stringcaption,uinttype);}许多受管辖的动态链接库函数期望你能够传递一个复杂的参数类型给函数,譬如一个用户定义的结构类型成员或者受管辖代码定义的一个类成员,这时你必须提供额外的信息格式化这个类型,以保持参数原有的布局和对齐。C#提供了一个StructLayoutAttribute类,通过它你可以定义自己的格式化类型,在受管辖代码中,格式化类型是一个用StructLayoutAttribute说明的结构或类成员,通过它能够保证其内部成员预期的布局信息。布局的选项共有三种:布局选项描述LayoutKind.Automatic为了提高效率允许运行态对类型成员重新排序。注意:永远不要使用这个选项来调用不受管辖的动态链接库函数。LayoutKind.Explicit对每个域按照FieldOffset属性对类型成员排序LayoutKind.Sequential对出现在受管辖类型定义地方的不受管辖内存中的类型成员进行排序。传递结构成员下面的例子说明如何在受管辖代码中定义一个点和矩形类型,并作为一个参数传递给User32.dll库中的PtInRect函数,函数的不受管辖原型声明如下:BOOLPtInRect(constRECT*lprc,POINTpt);注意你必须通过引用传递Rect结构参数,因为函数需要一个Rect的结构指针。[C#]usingSystem.Runtime.InteropServices;[StructLayout(LayoutKind.Sequential)]publicstructPoint{publicintx;publicinty;}[StructLayout(LayoutKind.Explicit]publicstructRect{[FieldOffset(0)]publicintleft;[FieldOffset(4)]publicinttop;[FieldOffset(8)]publicintright;[FieldOffset(12)]publicintbottom;}classWin32API{[DllImport(User32.dll)]publicstaticexternBoolPtInRect(refRectr,Pointp);}类似你可以调用GetSystemInfo函数获得系统信息:?usingSystem.Runtime.InteropServices;[StructLayout(LayoutKind.Sequential)]publicstructSYSTEM_INFO{publicuintdwOemId;publicuintdwPageSize;publicuintlpMinimumApplicationAddress;publicuintlpMaximumApplicationAddress;publicuintdwActiveProcessorMask;publicuintdwNumberOfProcessors;publicuintdwProcessorType;publicuintdwAllocationGranularity;publicuintdwProcessorLevel;publicuintdwProcessorRevision;}[DllImport(kernel32)]staticexternvoidGetSystemInfo(refSYSTEM_INFOpSI);SYSTEM_INFOpSI=newSYSTEM_INFO();GetSystemInfo(refpSI);类成员的传递同样只要类具有一个固定的类成员布局,你也可以传递一个类成员给一个不受管辖的动态链接库函数,下面的例子主要说明如何传递一个sequential顺序定义的MySystemTime类给User32.dll的GetSystemTime函数,函数用C/C++调用规范如下:voidGetSystemTime(SYSTEMTIME*SystemTime);不像传值类型,类总是通过引用传递参数.[C#][StructLayout(LayoutKind.Sequential)]publicclassMySystemTime{publicushortwYear;publicushortwMonth;publicushortwDayOfWeek;publicushortwDay;publicushortwHour;publicushortwMinute;publicushortwSecond;publicushortwMilliseconds;}classWin32API{[DllImport(User32.dll)]publicstaticexternvoidGetSystemTime(MySystemTimest);}回调函数的传递:从受管辖的代码中调用大多数动态链接库函数,你只需创建一个受管辖的函数定义,然后调用它即可,这个过程非常直接。如果一个动态链接库函数需要一个函数指针作为参数,你还需要做以下几步:首先,你必须参考有关这个函数的文档,确定这个函数是否需要一个回调;第二,你必须在受管辖代码中创建一个回调函数;最后,你可以把指向这个函数的指针作为一个参数创递给DLL函数,.回调函数及其实现:回调函数经常用在任务需要重复执行的场合,譬如用于枚举函数,譬如Win32API中的EnumFontFamilies(字体枚举),EnumPrinters(打印机),EnumWindows(窗口枚举)函数.下面以窗口枚举为例,谈谈如何通过调用EnumWindow函数遍历系统中存在的所有窗口分下面几个步骤:1.在实现调用前先参考函数的声明BOOLEnumWindows(WNDENUMPROClpEnumFunc,LPARMAMIParam)显然这个函数需要一个回调函数地址作为参数.2.创建一个受管辖的回调函数,这个例子声明为代表类型(delegate),也就是我们所说的回调,它带有两个参数hwnd和lparam,第一个参数是一个窗口句柄,第二个参数由应用程序定义,两个参数均为整形。当这个回调函数返回一个非零值时,标示执行成功,零则暗示失败,这个例子总是返回True值,以便持续枚举。3.最后创建以代表对象(delegate),并把它作为一个参数传递给EnumWindows函数,平台会自动地把代表转化成函数能够识别的回调格式。[C#]usingSystem;usingSystem.Runtime.InteropServices;publicdelegateboolCallBack(inthwnd,intlParam);publicclassEnumReportApp{[DllImport(user32)]publicstaticexternintEnumWindows(CallBackx,inty);publicstaticvoidMain(){CallBackmyCallBack=newCallBack(EnumReportApp.Report);EnumWindows(myCallBack,0);}publicstaticboolReport(inthwnd,intlParam){Console.Write(窗口句柄为);Console.WriteLine(hwnd);returntrue;}}指针类型参数传递:在WindowsAPI函数调用时,大部分函数采用指针传递参数,对一个结构变量指针,我们除了使用上面的类和结构方法传递参数之外,我们有时还可以采用数组传递参数。下面这个函数通过调用GetUserName获得用户名BOOLGetUserName(LPTSTRlpBuffer,//用户名缓冲区LPDWORDnSize//存放缓冲区大小的地址指针);[DllImport(Advapi32.dll,EntryPoint=GetComputerName,ExactSpelling=false,SetLastError=true)]staticexternboolGetComputerName([MarshalAs(UnmanagedType.LPArray)]byte[]lpBuffer,[MarshalAs(UnmanagedType.LPArray)]Int32[]nSize);这个函数接受两个参数,char*和int*,因为你必须分配一个字符串缓冲区以接受字符串指针,你可以使用String类代替这个参数类型,当然你还可以声明一个字节数组传递ANSI字符串,同样你也可以声明一个只有一个元素的长整型数组,使用数组名作为第二个参数。上面的函数可以调用如下:byte[]str=newbyte[20];Int32[]len=newInt32[1];len[0]=20;GetComputerName(str,len);MessageBox.Show(System.Text.Encoding.ASCII.GetString(str));最后需要提醒的是,每一种方法使用前必须在文件头加上:usingSystem.Runtime.InteropServices;
你想表达什么?运行dll文件?还是调用里面的方法? 更多有关「c#中怎样运行调用的dll文件」的疑问请扫码关注微信公开课+小程序! -
C#的三元运算符是( )
2019-03-12 17:01:43微信公开课小程序热门讨论「C#的三元运算符是( )」最新回复-三元运算符?:例如:i=23?0:12大于3嘛,如果是,就得到i=0;否则i=1.另外,虚机团上产品团购,超级便宜
该操作首先求出条件表达式的值(bool类型),为true时调用表达式1,为flase时调用表达式2。其逻辑为:“如果为真执行第一个,否则执行第二个。”例如:a=34?3:4;输出为4。a=34?3:4;输出为3。1、运算符用于执行程序代码运算,会针对一个以上操作数项目来进行运算。例如:2+3,其操作数是2和3,而运算符则是+。在vb2005中运算符大致可以分为5种类型:算术运算符、连接运算符、关系运算符、赋值运算符和逻辑运算符。2、C语言是一种计算机程序设计语言,它既具有高级语言的特点,又具有汇编语言的特点。它由美国贝尔研究所的D.M.Ritchie于1972年推出,1978年后,C语言已先后被移植到大、中、小及微型机上,它可以作为工作系统设计语言,编写系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序。它的应用范围广泛,具备很强的数据处理能力,不仅仅是在软件开发上,而且各类科研都需要用到C语言,适于编写系统软件,三维,二维图形和动画,具体应用比如单片机以及嵌入式系统开发。3、C语言把除了控制语句和输入输出以外的几乎所有的基本操作都作为运算符处理,可见其范围的宽(如:将赋值符=作为赋值运算符、方括号作为下标运算符) 更多有关「C#的三元运算符是( )」的疑问请扫码关注微信公开课+小程序! -
c++ 一个小程序不好用
2019-03-12 17:01:43微信公开课小程序热门讨论「c++ 一个小程序不好用」最新回复-你的问题是数组定义越界问题,charsex[2];charage[2];只需改成charsex[4];charage[4];即可。只是我在vs2008上测试的完整代码,运行结果是你想要的那种#includeiostream#includestring.husingnamespacestd;classstudent{public:virtualvoidsname()=0;virtualvoidssex()=0;virtualvoidsage()=0;};classL_student:publicstudent{public:charname[10];charsex[4];charage[4];voiddispname(){coutnameendl;}voidsname(){dispname();}voiddispsex(){coutsexendl;}voidssex(){dispsex();}voiddispage(){coutageendl;}voidsage(){dispage();}L_student(charp[10],chary[2]){strcpy(name,p);strcpy(sex,y);strcpy(age,20);}~L_student(){coutnameendlsexendlageendl;}};voidmain(){L_studentL(张三,男);student*p;p=&L;psname();pssex();psage();}楼主的函数写的挺好的,而且调用也很好,还用到了指针,想和你交个朋友一块学习C++,希望楼主加我的百度空间号。谢谢!
strcpy(age,20);这个来的还有你程序运行最后的时候要运行析构函数~L_student(){ coutnameendlsexendlageendl;}就这个输出了age 更多有关「c++ 一个小程序不好用」的疑问请扫码关注微信公开课+小程序! -
c++中c_str()用法,越详细越好。
2019-03-12 17:01:43微信公开课小程序热门讨论「c++中c_str()用法,越详细越好。」最新回复-应该这样用:charc[20];strings=1234;strcpy(c,s.c_str());这样才不会出错,c_str()返回的是一个临时指针,不能对其进行操作。语法:constchar*c_str();c_str()函数返回一个指向正规C字符串的指针,内容与本string串相同.,这是为了与c语言兼容,在c语言中没有string类型,故必须通过string类对象的成员函数c_str()把string对象转换成c中的字符串样式。注意:一定要使用strcpy()函数等来操作方法c_str()返回的指针。扩展资料:关于上述用法种最好不要这样用constchar*c;std::strings=1234;c=s.c_str();std::coutcstd::endl;//输出:1234s=abcd;std::coutcstd::endl;//输出:abcd上面如果继续用c指针的话,导致的错误将是不可想象的,就如:1234变为abcd。
语法:constchar*c_str();c_str()函数返回一个指向正规C字符串的指针,内容与本string串相同.这是为了与c语言兼容,在c语言中没有string类型,故必须通过string类对象的成员函数c_str()把string对象转换成c中的字符串样式。注意:一定要使用strcpy()函数等来操作方法c_str()返回的指针比如:最好不要这样:char*c;strings=1234;c=s.c_str();//c最后指向的内容是垃圾,因为s对象被析构,其内容被处理应该这样用:charc[20];strings=1234;strcpy(c,s.c_str());这样才不会出错,c_str()返回的是一个临时指针,不能对其进行操作再举个例子c_str()以char*形式传回string内含字符串如果一个函数要求char*参数,可以使用c_str()方法:strings=HelloWorld!;printf(%s,s.c_str());//输出HelloWorld!本回答被提问者采纳 更多有关「c++中c_str()用法,越详细越好。」的疑问请扫码关注微信公开课+小程序! -
C++写了一个小程序语法通过,运行时貌似有内存上的错误,谁帮我看看吧
2019-03-12 17:01:43微信公开课小程序热门讨论「C++写了一个小程序语法通过,运行时貌似有内存上的错误,谁帮我看看吧」最新回复-fp=fopen(D:\\a.txt,r);fscanf(fp,%s,temp);fscanf是c的接口,而你的temp又是string,c++的类,如此混用不出错才怪呢,string默认情况下只有很少的空间,直接用c语言接口fscanf将字符串写到string中,必然会导致内存越界而运行异常,你要嘛全用c,要嘛就都用C++(读文件用ifstream)
修改了,fscanf需要用一个char数组来读取。#includeiostream#includestring#includevectorusingnamespacestd;voidmain(){FILE*fp,*fr;vectorcharv;stringtemp;charbuf[1024];fp=fopen(.\1.txt,r);fscanf(fp,%s,buf);temp=buf;for(inti=0;itemp.size();i++){if(temp[i]== ||temp[i]==)continue;v.push_back(temp[i]);}fr=fopen(.\2.txt,a);for(intj=0;jv.size();j++){fputc(v[j],fr);}fclose(fp);fclose(fr);} 更多有关「C++写了一个小程序语法通过,运行时貌似有内存上的错误,谁帮我看看吧」的疑问请扫码关注微信公开课+小程序! -
C++里的面向对象是什么意思?
2019-03-12 17:01:43微信公开课小程序热门讨论「C++里的面向对象是什么意思?」最新回复-对象就像是我们生活中的每个实体(如人、钢笔等等)对象的抽象叫做类,打个比方说,人是一个类,你我是这个类的实体对象。对象有数据,就像我们的身高、体重,就是类里的各种变量。对象有动作,比如我们可以吃饭、行走,就是类里的成员函数。对象的数据多是private(私有)的,通过成员函数(多为public)来访问他。这就是类对数据的封装性。人还分为男人和女人,然后再根据年龄分为老人、小孩等。但他们都具有“人”的特性、这就叫做继承。对同一件事情,不同的人有不同的反映,这就叫做多态。比如一个学校要开学了,不同的部门会做不同的事。多态还体现在重用性上,比如函数、运算符的重载,实现“一物多用”。面向对象的作用很大,在以后的实践中会慢慢感受到。因为他来自我们的现实生活中,所以比较自然、顺手。像C语言如果用来开发大型软件的话就会很手足无措,因为各种函数能够把你烦死。面向对象的好处使用面向对象思想进行开发有以下优点:1、易维护采用面向对象思想设计的结构,可读性高,由于继承的存在,即使改变需求,那么维护也只是在局部模块,所以维护起来是非常方便和较低成本的。2、质量高在设计时,可重用现有的,在以前的项目的领域中已被测试过的类使系统满足业务需求并具有较高的质量。3、效率高在软件开发时,根据设计的需要对现实世界的事物进行抽象,产生类。使用这样的方法解决问题,接近于日常生活和自然的思考方式,势必提高软件开发的效率和质量。4、易扩展由于继承、封装、多态的特性,自然设计出高内聚、低耦合的系统结构,使得系统更灵活、更容易扩展,而且成本较低。面向对象设计的原则SRP单一职责原则就一个类而言,应该仅有一个引起它变化的原因。OCP开放————封闭原则软件实体(类、模块、函数等)应该是可以开展的,但是不可修改。LSPLiskov替换原则子类型必须能够替换掉它们的父类型。DIP依赖倒置原则抽象不应该依赖于细节。细节应该依赖于抽象。ISP接口隔离原则不应该强迫客户依赖于它们不用的方法。接口属于客户,不属于它所在的类层次结构。REP重用发布等价原则重用的粒度就是发布的粒度CCP共同封闭原则包中的所有类对于同一类性质的变化应该是共同封闭的。一个变化若对一个包产生影响,则将对该包中的所有类产生影响,而对于其他的包不造成任何影响。CRP共同重用原则一个包中的所有类应该是共同重用的。如果重用了包中的一个类,那么就要重用包中的所有类。ADP无环依赖原则在包的依赖关系图中不允许存在环。SDP稳定依赖原则朝着稳定的方向进行依赖SAP稳定抽象原则包的抽象程度应该和其稳定程度一致。某些问题和解决方法,必须使用面向对象技术。使用面对对象技术可以大大简化开发。另一些则不用。比如:开发操作系统内核就可以不用面对对象,所以,无论Windows,Linux,Uinx,MAC大部分都是使用C开发的,而不用C++.但是开发一个客户交互并能够组件化易扩充的软件(比如一个CAD软件),就必须使用面对对象。所以这方面的软件都是采用C++开发。再举个例子,Windows系统的API函数有几千个,发出的消息也有几千个.如果使用过程语言比如C开发,难度和代码量都很惊人,比如要在一个大函数里循环处理消息。如果用面向对象的方法,就可以封装这些函数和消息。大大减少代码量和开发难度。再有,基本上各种快速构建系统的RAD工具,VB,Delphi,都是采用面向对象的方法实现的。(注:VB不算面向对象,只能算基于对象,因为他没有继承)使用这些工具,你就在应用面向对象。但是,在编写小程序时,面向对象就显得太烦碎了;如:classa{public:inta=20;intb=10;}aa1,a2;intc=a1.aa2.b;。。。所以要“量体裁衣”,选择适合的方式。另外面向对象(oop)是一种方法,思想,而不是技术。
推荐两本书给你《C++Primer》《C++programmingidea》 更多有关「C++里的面向对象是什么意思?」的疑问请扫码关注微信公开课+小程序! -
C++高手进,帮忙修改一个四则运算的小程序.
2019-03-12 17:01:43微信公开课小程序热门讨论「C++高手进,帮忙修改一个四则运算的小程序.#」最新回复-includeiostreamusingnamespacestd;intA(intx,inty){returnx+y;}intB(intx,inty){returnxy;}intC(intx,inty){returnx*y;}doubleD(doublex,doubley){returnx/y;///是除号\是反斜杠,与某些字母连用时构成转义字符}intmain(){inta,b;cout请输入两个数endl;cina;cinb;couta+b等于A(a,b)endl;coutab等于B(a,b)endl;couta*b等于C(a,b)endl;couta/b等于D(a,b)endl;system(pause);return0;}
#includeiostreamusingnamespacestd;intA(intx,inty)//加法实现{returnx+y;} intB(intx,inty)//减法实现 { returnx-y; } intC(intx,inty)//乘法实现 { returnx*y; } doubleD(intx,inty)//除法实现 { return(double)x/y; } intmain() { inta,b,c; doubled; cout 更多有关「C++高手进,帮忙修改一个四则运算的小程序.#」的疑问请扫码关注微信公开课+小程序! -
cad 自动批量提取所有点坐标
2019-03-12 17:01:43微信公开课小程序热门讨论「cad 自动批量提取所有点坐标」最新回复-给你一个工具,可以批量标注,我自己亲自测试过,可用。快捷命令zbbz
CAD点坐标生成数据文件这个程序是在d盘根目录下生成一个node.txt文件,的确是可以用的。小程序,但很实用,不错。无法添加附件,杯具。 更多有关「cad 自动批量提取所有点坐标」的疑问请扫码关注微信公开课+小程序!