信息发布软件,b2b软件,广告发布软件

标题: VB.NET动态连接库使用四点总结和实例教程 [打印本页]

作者: 信息发布软件    时间: 2017-3-11 16:26
标题: VB.NET动态连接库使用四点总结和实例教程

 VB.NET动态连接库还是比较常用的,于是我研究了一下,在这里拿出来和大家分享一下,希望对大家有用。Windows动态连接库是包含数据和函数的模块,可以被其它可执行文件(EXE、DLL、OCX 等)调用。动态连接库包含两种函数:输出(exported)函数和内部(internal)函数。输出函数可以被其它模块调用,而内部函数则只能在动态连接库内部使用。

  尽管VB.NET动态连接库也能输出 数据,但实际上它的数据通常是只在内部使用的。使用动态连接库的优点是显而易见的。将应用程序的一部分功能提取出来做成动态连接库,不但减小了主应用程序的大小,提高了程序 运行效率,还使它更加易于升级。多个应用程序共享一个动态连接库还能有效地节省系统资源。正因为如此,在Windows系统中,动态连接库得到了大量的使用。

  一般来说,动态连接库都是以DLL为扩展名的文件,如Kernel32.dll、commdlg.dll等。但也有例外,如16位Windows的核心部件之一GDI.exe其实也是一个动态库。编写动态连接库的工具很多,如VisualC++、BorlandC++、Delphi等,具体方法可以参见相关文档。下面只以Visual C++6.0为例,介绍一下开发应用于VisualBasic6.0的动态连接库时应注意的问题(本文中所有涉及C/C++语言或编译环境的地方,都以VC为例;所有涉及Visual Basic的地方都以VB 为例)。

  作为一种32位Windows应用程序的开发工具,VB生成的exe文件自然也都是32位的,通常情况下也只能调用32位的动态连接库。但是,并不是所有的32位动态库都能被VB生成的exe 文件正确地识别。一般来说,自己编写用于VB.NET动态连接库时,应注意以下几个方面的

  问题:

  1、生成动态库时要使用__stdcall调用约定,而不能使用缺省的__cdecl调用约定;__stdcall 约定通常用于32位API函数的调用。

  2、在VC中的定义文件(.def)中,必须列出输出函数的函数名,以强制VC系统将输出函数的装饰名(decoratedname)改成普通函数名;所谓装饰名是VC的编译器在编译过程中生成的输出函数名,它包含了用户定义的函数名、函数参数及函数所在的类等多方面的信息。由于在VC中定义文件不是必需的,因此工程不包含定义文件时VC就按自己的约定将用户定义的输出函数名修改成装饰名后放到输出函数列表中,这样的输出函数在VB生成的应用程序中是不能正确调用的(除非声明时使用Alias子句)。因此需要增加一个.def文件,其中列出用户需要的函数名,以强制VC不按装饰名进行输出。

  3、VC中的编译选项"结构成员对齐方式(structure member alignment)" 应设成4字节,其原因将在后文详细介绍。

  4、由于在C中整型变量是4个字节,而VB中的整型变量依然只有2个字节,因此在C中声 明的整型(int)变量在VB中调用时要声明为长整型(long),而C中的短整型(short)在VB中则 要声明成整型(integer);下表针对最常用的C语言数据类型列出了与之等价的Visual Basic 类型(用于32位版本的Windows)。



作者: aluoting    时间: 2017-3-11 16:26
意,做了好几个店铺了,服务真心的不错,客服真的很热情,装修以后就是你家了!
作者: 信息发布软件    时间: 2017-3-11 16:32
实例二

作为一种简单易用的Windows开发环境,Visual Basic从一推出就受到了广大编程人员的欢迎。它使程序员不必再直接面对纷繁复杂的Windows消息,而可以将精力主要集中在程序功能的实现上,大大提高了编程效率。但凡事有利必有弊。VB中高度的封装和模块化减轻了编程者的负担,同时也使开发人员失去了许多访问低层API函数和直接与Windows 交互的机会。因此,相比而言,VB应用程序的执行效率和功能比C/C++或Delphi生成的程序要差。为了解决这个问题,在一个大型的VB开发应用中,直接调用Windows API函数几乎是不可避免的;同时,还有可能需要程序员自己用C/C++等开发一些动态连接库,用于在VB调用动态连接库。本文主要讨论在32位开发环 境Visual Basic 5.0中直接调用Windows 95 API函数或用户生成的32位动态连接库的方法与规则。

Windows动态连接库是包含数据和函数的模块,可以被其它可执行文件(EXE、DLL、 OCX 等)调用。动态连接库包含两种函数:输出(exported)函数和内部(internal)函数。输出函数可以被其它模块调用,而内部函数则只能在动态连接库内部使用。尽管动态连接库也能输出 数据,但实际上它的数据通常是只在内部使用的。使用动态连接库的优点是显而易见的。将应用程序的一部分功能提取出来做成动态连接库,不但减小了主应用程序的大小,提高了程序运行效率,还使它更加易于升级。多个应用程序共享一个动态连接库还能有效地节省系统资源。正因为如此,在Windows系统中,动态连接库得到了大量的使用。

一般来说,动态连接库都是以DLL为扩展名的文件,如Kernel32.dll、 commdlg.dll等。但也有例外,如16位Windows的核心部件之一GDI.exe其实也是一个动态库。编写动态连接库的工具很多,如 VisualC++、BorlandC++、Delphi等,具体方法可以参见相关文档。下面只以Visual C++5.0为例,介绍一下开发应用于VisualBasic5.0的动态连接库时应注意的问题(本文中所有涉及C/C++语言或编译环境的地方,都以 VC5为例;所有涉及VisualBasic的地方都以VB5 为例)。

作为一种32位Windows应用程序的开发工具,VB5生成的exe文件自然也都是32位的,通常情况下也只能调用32位的动态连接库。但是,并不是所有的32位动态库都能被VB生成的exe 文件正确地识别。一般来说,自己编写用于VB调用动态连接库时,应注意以下几个方面的问题:

1、生成动态库时要使用__stdcall调用约定,而不能使用缺省的__cdecl调用约定;__stdcall 约定通常用于32位API函数的调用。

2、在VC5中的定义文件(.def)中,必须列出输出函数的函数名,以强制VC5系统将输出函数的装饰名(decoratedname)改成普通函数名;所谓装饰名是VC的编译器在编译过程中生成的输出函数名,它包含了用户定义的函数名、函数参数及函数所在的类等多方面的信息。由于在VC5中定义文件不是必需的,因此工程不包含定义文件时VC5就按自己的约定将用户定义的输出函数名修改成装饰名后放到输出函数列表中,这样的输出函数在VB生成的应用程序中是不能正确调用的(除非声明时使用Alias子句)。因此需要增加一个.def文件,其中列出用户需要的函数名,以强制VC5不按装饰名进行输出。

3、VC5中的编译选项"结构成员对齐方式(structure member alignment)" 应设成4字节,其原因将在后文详细介绍。

4、由于在C中整型变量是4个字节,而VB中的整型变量依然只有2个字节,因此在C中声明的整型(int)变量在VB中调用时要声明为长整型(long),而C中的短整型(short)在VB中则要声明成整型(integer);下表针对最常用的C语言数据类型列出了与之等价的Visual Basic 类型(用于32位版本的Windows)。

C语言数据类型在Visual Basic中声明为调用时使用的表达式
◆ATOM ByVal variable As Integer 结果为Integer 类型的表达式
◆BOOL ByVal variable As Long 结果为 Long 类型的表达式
◆BYTE ByVal variable As Byte 结果为 Byte 类型的表达式
◆CHAR ByVal variable As Byte 结果为 Byte 类型的表达式
◆COLORREF ByVal variable As Long 结果为 Long 类型的表达式
◆DWORD ByVal variable As Long 结果为 Long 类型的表达式
◆HWND, HDC, HMENU ByVal variable As Long 结果为 Long 类型的表达式等Windows 句柄
◆INT, UINT ByVal variable As Long 结果为 Long 类型的表达式
◆LONG ByVal variable As Long 结果为 Long 类型的表达式
◆LPARAM ByVal variable As Long 结果为 Long 类型的表达式
◆LPDWORD variable As Long 结果为 Long 类型的表达式
◆LPINT, LPUINT variable As Long 结果为 Long 类型的表达式
◆LPRECT variable As type 自定义类型的任意变量
◆LPSTR, LPCSTR ByVal variable As String 结果为 String 类型的表达式
◆LPVOID variable As Any 任何变量(在传递字符串的时候使用ByVal)
◆LPWORD variable As Integer 结果为Integer 类型的表达式
◆LRESULT ByVal variable As Long 结果为 Long 类型的表达式
◆NULL As Any 或 ByVal Nothing 或
◆ByVal variable As Long ByVal 0& 或 VBNullString
◆SHORT ByVal variable As Integer 结果为Integer 类型的表达式
◆VOID Sub procedure 不可用
◆WORD ByVal variable As Integer 结果为Integer 类型的表达式
◆WPARAM ByVal variable As Long 结果为 Long 类型的表达式

5、VB中进行32位动态库的声明时,函数名是大小写敏感的。在获得了需要的动态连接库之后,就可以在VB调用动态连接库了。但是,由于VB不能验证应用程序传递到动态连接库中的参数值是否正确,因此VB程序中大量的API调用可能会降低整个应用程序的稳定性,也会增加以后维护的难度。所以,决定在VB程序中直接调用API函数时要慎重,但适当的使用API调用确实能够有效地提高VB程序的性能。这之间的平衡需要编程人员根据实际情况来掌握。下面就具体介绍一下在VB中调用API函数时需要做的工作。



作者: 信息发布软件    时间: 2017-3-11 16:33
  1. 实例二

  2. 大家知道吗?VB一般可以生成两种特殊的DLL,一个是ActiveX DLL和ActiveX Control(*.ocx)。这两种DLL都是VB支持的标准类型。这里主要就怎样编写VB.NET .DLL动态链接库文件分析讲解。

  3.   NewViewStudio的意见:
  4.   创建VB.NET .DLL只是COM组件,无法作为输出函数的DLL,其实这只是个错误的说法。其实MS非常狡猾,如果你是个VB疯狂发烧友的话,应该早就狂试出这种可以创建输出函数的DLL的方法。 VB 编译文件实际上采取了两次编译的方法,首先是调用C2.exe产生*.OBJ文件,然后调用Link.EXE连接。如果在LINK的时候添加EXPORT 选项,实际上是可以输出函数的。但是,在VB的工程选项中将这些屏蔽了。而且过分的是:VB在Build完成后会将OBJ文件删除,这样就无法手动通过 Link来创建我们需要的DLL了。不过我找到一个比较龌鹾的变通的方法,就是先创建一个Exe工程,在Form_Load事件里面写下面的语句:

  5.   复制内容到剪贴板 VB.NET .DLL程序代码


  6.   
  7.   Sub Main  If MsgBox("哈哈", vbOKCancel) = vbOK Then Shell "link2.exe " & Command$ End If   
  8.   End Sub
  9.   然后编译为LinkTemp.EXE,接下来将LINK.EXE改名为Link2.exe,将LinkTemp.EXE改名为Link.EXE。这样在VB调用Link.EXE时会弹出对话框,处理就会中断。这时就可以有机会将OBJ文件拷贝出来了。  然后我创建了一个ActiveX DLL工程,在这个工程里面添加一个Module并创建一个Public函数mathadd:

  10.   复制内容到剪贴板 程序代码


  11.   
  12.   Public Function mathadd(ByVal a As Long, ByVal b As Long) As Long mathadd = a + b   
  13.   End Function   
  14.   编译这个工程,在Link的时候就会中断。然后把创建的Class1.obj、Module1.obj、Project1.obj备份出来。 然后就可以调用Link2.exe连接OBJ到DLL了,我的连接代码是:


  15.   
  16.   Link2.exe "e:\vbdll\Class1.obj" "e:\vbdll\Module1.obj" "e:\vbdll\Project1.obj"
  17.   "E:\Program Files\Microsoft Visual Studio\VB98\VBAEXE6.LIB" /ENTRY:__vbaS/EXPORT:mathadd/OUT:
  18.   "e:\vbdll\ProjectOK.dll" /BASE:0x11000000 /SUBSYSTEM:WINDOWS,4.0 /VERS   
  19.   注意里面的/ENTRY和/EXPORT开关,/EXPORT开关声明了输出函数mathadd。这样就大功告成了,可以被其他语言引入,例如在VB中,只需要:
复制代码


作者: 发财猪    时间: 2017-3-11 20:47
家,很有信誉,好评
作者: loverun    时间: 2017-3-13 19:54
。服务不错
作者: mmgg520    时间: 2017-3-13 20:19
很好,服务很好,耐心细致,下次还会来的
作者: nidalma001    时间: 2017-3-13 21:11
力.服务很到位!
作者: ziyang701    时间: 2017-3-14 11:52
根本不按我的意思来修改了一遍又一遍
作者: beiao    时间: 2017-3-15 08:36
谢卖家,以后朋友需要会介绍来亲店里的!赞!
作者: 123    时间: 2017-3-16 01:04
好,速度快,下次碰到问题还来找您!
作者: ufo50200    时间: 2017-3-16 01:58
家!好评
作者: ctbvip    时间: 2017-3-16 12:10
合作了。
作者: jingtai001    时间: 2017-3-17 00:15
卖家,技术过硬,服务过好,就像巴黎欧莱雅,你值得拥有
作者: jzgsjt    时间: 2017-3-17 02:12
很好,东西很好用!
作者: jiandao1    时间: 2017-3-17 23:38
我想要的,希望生意越来越好
作者: jh134724    时间: 2017-3-18 02:40
改改字就可以了
作者: yangjiang1    时间: 2017-3-19 00:09
平台还不错哟,而且技术人员态度很好,很多方面都站在客户的方面着想。非常愉快的合作。
作者: jiandao1    时间: 2017-3-20 06:28
是我第二家店铺也是找他们公司弄的,售后不错非常好的,卖家值得选择的。至少我目前是比较满意的。O(∩_∩)O~,值得推荐!!
作者: 脱颖而出    时间: 2017-3-21 00:08
,世上好人哦
作者: meng00123    时间: 2017-3-22 05:45
,感谢店家的细心指导,谢谢
作者: 小痞子    时间: 2017-3-22 16:10
有耐心,下次还会找这家,都给我改了好几次了,就是时间比较长,等不起啊。总体还是很满意
作者: 万能群发    时间: 2017-3-23 21:23
不错,和卖家描述的一样,值得入手,好评
作者: meilifc001    时间: 2017-3-24 04:46
的不错,功能比较强大,完全超过我的需求,重新改logo要收钱价太高?
作者: w8899    时间: 2017-3-24 21:14
术不错。。。整的巴适。。。
作者: linshihu    时间: 2017-3-25 11:14
我抢、我抢、我抢沙发~
作者: dongwuhua    时间: 2017-3-25 13:19
快,页面设计很满意,而且也很,老板人不错,喜欢
作者: bysqb    时间: 2017-3-26 04:58
看帖回帖是美德!
作者: jiandao1    时间: 2017-3-26 06:27
微信公众号,功能多用途,很快就上手了,卖家技术支持服务很好,完成速度令我满意,以后如果有需要还会再来的~
作者: qingling520    时间: 2017-3-26 10:37
好,速度快,下次碰到问题还来找您!
作者: 脱颖而出    时间: 2017-3-26 14:02
服务一流!效果明显,不错,给爱易设计师点个赞!
作者: ufo50200    时间: 2017-3-26 20:51
模板物超所值!!!!!
作者: java12005    时间: 2017-3-26 22:07
都很实用!!
作者: pxynmi018    时间: 2017-3-27 00:16
工作人员态度特别好最关键的是用起来功能太强大了
作者: yiyi2014    时间: 2017-3-27 06:56
力很强大,必须好评!!!!
作者: 694012770    时间: 2017-3-27 07:14
平可以
作者: wbd902    时间: 2017-3-28 18:55
心,一直回答我。我自己一直弄不懂他很耐心。
作者: ekmci    时间: 2017-3-29 14:23
,服务周到,效率很好,值得推荐~~
作者: q1598188    时间: 2017-3-29 18:37
做完了,接待很热情,技术很耐心,不厌其烦的提供帮助。希望再接再厉,越做越好。
作者: xubaojin    时间: 2017-3-29 19:31
商城系统也非常牛逼
作者: xubaojin    时间: 2017-3-30 15:36
和5号笨蛋
作者: aluoting    时间: 2017-3-30 17:59
,下载好几天才完成.太值了.慢慢研究.
作者: linshihu    时间: 2017-3-30 18:33
这次合作,整个过程很顺利,今后我的店铺还是会请你帮我装修,希望越来越好
作者: ggt567    时间: 2017-3-30 18:36
业,企业店就是严谨有效率,希望以后会成为长期的合作伙伴,好评!!!!
作者: cjagl520    时间: 2017-3-30 19:07
错,虽然教程要自己学,但是技术都很热情,回答的也很及时,问题都给解决了。之前怕一付款技术就不理我了,所以故意延迟付款,但是技术人员一直都很耐心,现在想想是我太多心了,希望卖家生意兴隆!
作者: 武器    时间: 2017-3-31 04:54
评,客服态度也特别好,077号笨蛋棒棒哒???
作者: wangliuh11    时间: 2017-3-31 08:45
错满意吧下次需要还会来
作者: shenyeben    时间: 2017-3-31 09:00
耐心的卖家,好评
作者: mm5216299    时间: 2017-3-31 11:02
底不错,经过沟通后达到了我要求的效果,虽然时间长了一点,但是值得。慢工出细活。满分,态度也很好。
作者: 都敏俊系    时间: 2017-3-31 16:29
这次合作,整个过程很顺利,今后我的店铺还是会请你帮我装修,希望越来越好
作者: meilifc001    时间: 2017-4-1 03:53
欢迎前来参观本店百德家具广场
作者: 枯干枯干    时间: 2017-4-3 02:45
业,必须要好评啊,下次还会来的,么么哒!!!!!
作者: 我爱苏苏    时间: 2017-4-3 08:32
了,质量很不错,和店家描述一样,好评
作者: shenyeben    时间: 2017-4-3 08:40
是仿站仿出来的效果很好出乎大家的预料中间按照我们的要求又改了一些地方增加了技术人员不少工作量077号笨蛋棒棒哒很耐心技术过硬
作者: xiaozhu168    时间: 2017-4-3 13:57
非常精细超值超喜欢哦
作者: anleeycn    时间: 2017-4-4 09:40
好,与卖家描述的完全一致,非常满意
作者: bysqb    时间: 2017-4-4 19:19
态度不错。
作者: chenxue2015    时间: 2017-4-5 16:37
,服務員耐心教授,網站成功完成,多謝大家幫忙
作者: z2340868    时间: 2017-4-5 18:24
的卖家,有什么问题都很耐心回复。模板与官方一模一样,所有教程都有。
作者: xoxo110    时间: 2017-4-5 20:25
强大,使用简单便捷,真心的不错,卖家发货速度快!而且老板人很好,能耐心的指导我,教我如何使用,和客户一起互动,什么都不说了,这个产品真是太值了
作者: 小白    时间: 2017-4-5 21:27
信用,性价比高,值得购买!赞!
作者: xoxo110    时间: 2017-4-6 03:05
收到了,安装上了,特别好用,速度很快,商家的售后做的很到位,耐心的讲解,热情的招待,技术方面很专业.
作者: 阿拉丁    时间: 2017-4-6 12:44
绝对没得说,小笨蛋2号18号35号都非常有耐心,尤其是后来有很多问题和改动,18号都很耐心为我解决。非常感谢。
作者: xbaobeit    时间: 2017-4-6 13:54
沟通问题已经解决,客服晨曦服务态度比较好。就是线上沟通,有些困难。希望可以尽快完善。合作愉快
作者: ggt567    时间: 2017-4-6 16:35
编辑文字和活动都得靠自己想!!小白如我,只能做出这个效果。慢慢的去摸索!!??
作者: jingtai001    时间: 2017-4-6 21:13
服务耐心
作者: a001hao    时间: 2017-4-6 22:44
非常到位,很不错的卖家。帮我远程搞定。非常感谢
作者: nble002    时间: 2017-4-7 15:22
是还没完善,技术人员悉心讲解!赞?




欢迎光临 信息发布软件,b2b软件,广告发布软件 (http://www.postbbs.com/) Powered by Discuz! X3.2