我知道(vc ++)ocx是一个ActiveX控件,而(vc ++)dll是函数的集合。我发现从vb.net应用程序调用时,如果从ocx内部或dll中的函数内部抛出异常,捕获一些异常可能会有不同的行为。
所以我的问题是: 从VB.net应用程序的角度来看,使用.ocx文件和使用.dll文件之间的主要区别是什么?
答案 0 :(得分:3)
.ocx包含遵循OLE自动化合同的COM coclass。该合同具有明确的方式将错误返回给客户。每个方法都返回一个HRESULT,一个指示方法是否成功的代码。它是一个简单的整数,错误代码在WinError.h SDK头文件中定义。它还支持通过IErrorInfo接口获取有关错误的上下文信息。 CLR中的COM互操作支持可确保将失败代码转换为可比较的异常。
C / C ++ DLL中的代码不存在此类标准。如果它抛出异常,它几乎总是像AccessViolation一样令人讨厌。 P / Invoke marshaller确保捕获并转换这些异常。除了“它没有用”之外,你总是会从这样的例外中得到很少有用的信息。你应该让这些例外终止你的程序,你无法从中恢复。
答案 1 :(得分:2)
DLL是一个共享库。它是一个操作系统级别的对象 - 任何进程都可以加载DLL并调用其中定义的函数。
ActiveX控件是一个COM对象,它实现特定的接口,允许主机调用其方法并将其嵌入到UI中。 ActiveX控件必须实现哪些接口才能在应用程序的UI中成功嵌入,这些都有一定的最低要求。由于COM对象通常由进程动态加载,因此它们实现为DLL。单个DLL可以实现一个或多个COM类。
关于异常 - 我不确定您观察到的差异,但函数与进程的主.EXE文件中实现的函数没有区别。抛出的异常应该根据编程语言的运行时环境定义的规则正常传播。
ActiveX方法不同。通常,它通过称为IDispatch接口的东西来调用。它不是一个简单的子程序调用,而是通过调用IDispatch接口(IDispatch :: Invoke)中的方法来调用,其参数以特定方式封送(实际上,它们被转换为标准类型并以隐藏的方式打包)主进程的实现语言与ActiveX控件的实现语言之间的调用约定和数据类型的差异。)IDispatch :: Invoke接口然后确定调用者尝试访问ActiveX中的哪个方法,并直接路由它。
异常通常不会通过IDispatch接口传播。您的运行时环境如何处理IDispatch :: Invokeis返回的错误代码,直到实施者来确定。因此,在处理ActiveX控件中引发的运行时错误和异常时,您可以合理地预期不会满足您的期望。
答案 2 :(得分:1)
没有区别。他们都是dll。您可以将dll重命名为任何内容,并仍使用LoadLibrary,GetProcAddress加载和使用它。
答案 3 :(得分:0)
在.net世界中,dll不是函数集合。它是一个程序集,它是 types 的集合 - 类和模块。这些类型可能也包含函数,但这是一个不同的抽象级别。
但是既然你正在和ocx文件一起讨论这个问题,我会批准你可能指的是vb6创建的一个dll,因为.Net与ocx文件或者activex控件没有直接关系。在这种情况下,它们都只是您可以加载的COM对象。