我是个VC初学者,遇到关于DLL和添加引用的问题,请高手指教! 情况可能有点复杂,请耐心看完,不胜感激
情况是:我想用VC6编出一个基于对话框的MFC程序,用以控制一个驱动器。驱动器的厂商给了一个开发包,安装完毕后,相应目录下会有一DLL,但没有Lib。(通过查询,我发现,...
情况是:我想用VC6编出一个基于对话框的MFC程序,用以控制一个驱动器。驱动器的厂商给了一个开发包,安装完毕后,相应目录下会有一DLL,但没有Lib。(通过查询,我发现,没有Lib也可以显示加载,但这不是我想问的)
由于没有例程,我便联系卖我驱动器的美国公司,随后,他们发给我一个例程。不过我发现:他们的例程是SLN文件,而且也不是我想要的MFC,基于对话框的程序。于是我便安装了VS08测试该例程。经过研究后,我发现,想运行他们的例程,只需要为其添加新引用(请见图片)即可成功编译,而这个引用即为我之前安装的那个DLL……
我不懂的问题是:
1.据我所知,添加DLL有显式和隐式的方法。那么这种添加引用来装载DLL的方式属于什么呢?VC6有这种功能吗?“引用”到底是什么?它和DLL有什么关系呢?
2.现在我用VS08创建自己的MFC、基于对话框的程序,可是我无法用添加引用的方式来装载该DLL(图片中项目为空,且不能选择),只有他们给的例程可以添加引用。这是为什么呢?(通过试验,我发现,CLR可以添加引用,可我不懂CLR,只会MFC。难道只有CLR可以添加引用?)
3.只要是DLL的文件,就算没有Lib文件,一定可以用VC6来调用吗?(因为我希望,最好用VC6实现编程,但不知道这个能被当成引用的DLL是否能被VC6调用)
这几个问题有关联,也许懂了一个,就都懂了。我初学VC,项目时间也紧,也许走了弯路就来不及了,所以来百度提问。真心地希望高手们能百忙之中抽空帮帮我,给我指明方向,详细些更好,不胜感激!谢谢了。 展开
由于没有例程,我便联系卖我驱动器的美国公司,随后,他们发给我一个例程。不过我发现:他们的例程是SLN文件,而且也不是我想要的MFC,基于对话框的程序。于是我便安装了VS08测试该例程。经过研究后,我发现,想运行他们的例程,只需要为其添加新引用(请见图片)即可成功编译,而这个引用即为我之前安装的那个DLL……
我不懂的问题是:
1.据我所知,添加DLL有显式和隐式的方法。那么这种添加引用来装载DLL的方式属于什么呢?VC6有这种功能吗?“引用”到底是什么?它和DLL有什么关系呢?
2.现在我用VS08创建自己的MFC、基于对话框的程序,可是我无法用添加引用的方式来装载该DLL(图片中项目为空,且不能选择),只有他们给的例程可以添加引用。这是为什么呢?(通过试验,我发现,CLR可以添加引用,可我不懂CLR,只会MFC。难道只有CLR可以添加引用?)
3.只要是DLL的文件,就算没有Lib文件,一定可以用VC6来调用吗?(因为我希望,最好用VC6实现编程,但不知道这个能被当成引用的DLL是否能被VC6调用)
这几个问题有关联,也许懂了一个,就都懂了。我初学VC,项目时间也紧,也许走了弯路就来不及了,所以来百度提问。真心地希望高手们能百忙之中抽空帮帮我,给我指明方向,详细些更好,不胜感激!谢谢了。 展开
6个回答
展开全部
楼主理解是正确的。楼主说自己试初学VC,但居然能够自己研究发现这么多信息,如果我是初学者的话,我肯定没楼主那么能干。一定会一头雾水。从这点上,我非常佩服楼主的才能!我是远远达不到这样的高度的。
至于他们给你的DLL,基本上能断定那个是CLR写的DLL。就我理解,CLR应该和MFC是完全不一样的,无论是语言的语法,或者是从CLR、MFC的基础架构方面,都没有交集!因此可以将CLR理衫稿解为一门全新的语言,它使用的库是.net 库。楼主肯定有 MFC 基础的。如果楼主研究过C#的话,那CLR应该是很容易上手的。从亲缘性方面来讲,CLR项目和C#项目更相似。它们的DLL只需要在使用DLL的项目中,通过楼主所言的“引用”方式添加进来就OK了。没有LIB的区别。它的实现机制是:所有DLL/EXE在文件内部都会有一个清单,该清单记录了DLL/EXE自己实现的类,函数以及它引用别人的类、函数和这些文件名等一系列信息。
至于有人提出是COM的关系,我认为这个问题应该和COM没有一点关系。所以如果要从COM入手,完全是一条死胡同。会浪费时间的!
虽袜裤然VC支持MFC和CLR混编,但如果要混编,我感觉系统不稳定,一方面我担心兼容性的问题导致程序的稳定性问题。另一方面,既告塌简要熟悉MFC,又要熟悉CLR,否则混编很困难。我认为,既然要用别人的CLR DLL,那么最好还是别用MFC,直接做CLR。楼主不熟悉CLR,那么只有学。尽管需要赶工期,但我也想不出好办法。做CLR项目是我认为最好的出路!
至于他们给你的DLL,基本上能断定那个是CLR写的DLL。就我理解,CLR应该和MFC是完全不一样的,无论是语言的语法,或者是从CLR、MFC的基础架构方面,都没有交集!因此可以将CLR理衫稿解为一门全新的语言,它使用的库是.net 库。楼主肯定有 MFC 基础的。如果楼主研究过C#的话,那CLR应该是很容易上手的。从亲缘性方面来讲,CLR项目和C#项目更相似。它们的DLL只需要在使用DLL的项目中,通过楼主所言的“引用”方式添加进来就OK了。没有LIB的区别。它的实现机制是:所有DLL/EXE在文件内部都会有一个清单,该清单记录了DLL/EXE自己实现的类,函数以及它引用别人的类、函数和这些文件名等一系列信息。
至于有人提出是COM的关系,我认为这个问题应该和COM没有一点关系。所以如果要从COM入手,完全是一条死胡同。会浪费时间的!
虽袜裤然VC支持MFC和CLR混编,但如果要混编,我感觉系统不稳定,一方面我担心兼容性的问题导致程序的稳定性问题。另一方面,既告塌简要熟悉MFC,又要熟悉CLR,否则混编很困难。我认为,既然要用别人的CLR DLL,那么最好还是别用MFC,直接做CLR。楼主不熟悉CLR,那么只有学。尽管需要赶工期,但我也想不出好办法。做CLR项目是我认为最好的出路!
追问
谢谢你的回答,那你的意思是不是:这种DLL只能通过这种引用的方式装载,而不能被VC6显式调用呢?另外,这种DLL真的和COM没关系吗?它的确是我在点击“添加新引用”后,从COM选项卡中添加的啊。请再给我些信息,谢谢了。
追答
根据楼主的追问,我的回答也要修正了。
首先,这个 DLL 应该是一个 COM 组件。而例程还是一个 CLR 项目。通过应用方式,将原本非.net 类的COM组件包装成了 .net 组件,方便CLR项目对COM的操纵。就如同“Frank7258 ”所说的那样,通过 tlb 文件,可以让编译器为我们将 COM 组件包装成一个标准的 C++ 类,供MFC对COM的调用。
因此,楼主要用这个 DLL ,最好的办法应该是 #import tlb ,然后由编译器为我们生成C++类,最后使用C++类的过程,就是在使用 DLL 的 COM 组件。关于 tlb ,楼主可以稍微看下我的另外一篇帖子:http://zhidao.baidu.com/question/147420140.html 。
像ie 啦,sql server 啦这种非.net 应用程序,它们都支持 .net 组件,都是以宿主进程来实现的。所以啦,“C/C++不能使用 .net ”这种说法的确有问题。需要了解这方面知识的朋友,我推荐看下 Jeffrey Ritchter 编写的《框架设计 CLR Via C#》。
最后,本来不想说的,但还是表达下自己的观点吧:
无论如何,6.0都是十几年前的东西了。我们不使用现在的VS2010或VS2008,而选择 6.0 的理由是什么?电脑我们不会买10年前的款式,操作系统我们也不会去用98系统,那么6.0现在依旧铺天盖地究竟为何?还会有层出不穷的关于6.0在WIN 7下的兼容问题,语法问题,新技术支持问题。落后的工具有什么可以研究的?
展开全部
楼上说的还是比较合理的,这个dll很明显就是一个CLR编译的dll,他是.Net编译后的程序集,这样的dll是不需要lib库文件支悄旦持的,而漏凳且如果dll没有被混淆软件混淆,那么使用reflector软件可以反编译出源程序代码(可以反编译为C#或C++/CLI代码),在C++下,需要启用CLR托管程序集支持方可在程序中添加引用,然启搜扰后编译的代码为VC Native代码和MSIL元数据代码,当然前提是你要熟悉C++/CLI托管代码编程,也可以使用C#编程,如果和MFC混合使用的话,需要较高的编程技巧,而且很多数据类型的转换也有些问题,建议找有C++/CLI编程经验或C#编程经验的人请教。
由于VC6不支持CLI,所以没有任何办法在VC6中使用这个dll,即使使用LoadLibrary也不行。
由于VC6不支持CLI,所以没有任何办法在VC6中使用这个dll,即使使用LoadLibrary也不行。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
vc6应也可以调用
有槐祥团相关的windows api
LoadLibrary
GetProAddress
FreeLibrary
可以了解一下铅橘宴肆
有槐祥团相关的windows api
LoadLibrary
GetProAddress
FreeLibrary
可以了解一下铅橘宴肆
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
他这个是基于COM技术的DLL,接口信息可以直接从DLL内导出的。比如你要使用微软的MSXML,你圆厅孙不需要有头文件或者lib文件,你只要
#import <msxml6.dll>
这样定义就全都有了。
COM技术不是一两句话说橘链的清的,你可以自己再伏卜去查一查资料。
#import <msxml6.dll>
这样定义就全都有了。
COM技术不是一两句话说橘链的清的,你可以自己再伏卜去查一查资料。
追问
感谢回答,您的意思是:这种DLL也可以被VC6使用是吗?
追答
VC6发布的时候就已经有COM技术了,使用上应当没有问题。.Net所有编译出来的DLL都是COM足见,.Net不能编译普通意义的C/C++动态连接库。COM的一个最大特点就是和使用语言无关,COM组建如果实现了IDispatch接口甚至可以在网页中被脚本语言调用。VC6到底是否支持我说不上来,实在是太老了,你先试试看能否#import,import之后应该会有tlb文件生成,里面是接口的描述。
另外,如果你不熟悉COM,上手要有点时间,特别是VC6的MFC库的CString和COM的类型variant_t/_bstr_t转换起来很烦人,VS2005开始的MFC就可以很好的处理了。
看到下面很多人说CLR或者.Net编写的DLL用C或者C++不能调用这是不对的,微软专门对此有说明:http://msdn.microsoft.com/zh-cn/vstudio/9x0wh2z3.aspx
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我也链派遇到了这个问题,情况和你一样的,现在敏喊有解决办法了么,希望可桥唤野以帮帮忙,怎么去调用这个DLL qq674670630
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你先把孙鑫的深入编程的第19看了,再请教问题,再来回答
追问
请你看了我的问题再发言好吗?第19章我看过不止一遍,孙鑫书是针对VC6的,对VS的添加引用只字未提!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询