回 帖 发 新 帖 刷新版面

主题:[讨论]Automation 问题

REM ------------------------------------------------
REM - 未引入 CorelDRAW 库时这样调用 : Example1
REM -----------------------------------------------

Dim oCdr As Object
Dim oDoc As object

Set oCdr = CreateObject("CorelDRAW.Application.13")
Set oDoc = oCdr.ActiveDocument

oDoc.SaveAs("E:\abcd.cdr")

Set oDoc = Nothing
Set oCdr = Nothing

REM ------------------------------------------------
REM - 引入 CorelDRAW 库后我这样调用 : Example2
REM -----------------------------------------------

Dim oCdr As Object
Dim oDoc As Document

Set oCdr = CreateObject("CorelDRAW.Application.13")
Set oDoc = oCdr.ActiveDocument

oDoc.SaveAs("E:\abcd.cdr")

Set oDoc = Nothing
Set oCdr = Nothing

Example1 可以调用 SaveAs 方法时说类型转换错误!
Example2 却可以通过!

按理说Example1 运行肯定没有问题才对呀!

大家必须来理一理这个问题了!

回复列表 (共15个回复)

沙发

ActiveDocument 返回什么对象?
是第三方控件吧?

板凳

是 CorelDRAW X3 的一个当前处于活动状态的文档呀!

3 楼

未引入 CorelDRAW 库时,Set oCdr = CreateObject("CorelDRAW.Application.13")运行时电脑(或者说VB运行库)根本不知道oCdr对象是什么对象,因为CorelDRAW.Application.13不是VB内置的,属于第三方程序。

说白一点,就是oCdr并没有成功赋值,他也并不是CorelDRAW.Application.13对象,所以他也并没有SaveAs属性

4 楼

不可能的! 像Example1 这样的过程! 就用 VBScript 任何语言!只要在WINDOWS平台下能用COM接口的语言都能成功! 第三方程序如果没有安装! 那么 Set oCdr = CreateObject("CorelDRAW.Application.13") 肯定就会出错了! 而不会在使用 SaveAs 方法时才错误!

而且如果是 SaveAs 方法不存在! 那么肯定不是类型转换的错误! 还是没有方法的错误!

如果 SaveAs 不存在! 那么 Example2 也不可能成功运行!

据我的了解! 在 VB 中的引入库只是提供对写代码的自动完成的方便,没有具体的连接使用,
连接使用是在程序后期运行时建立的!这介COM接口的基本原理所限!

5 楼

看了,但是也白看。
既没有看懂你想干什么
也没有看懂你要讨论什么

6 楼

恩,我也看不懂.
既然都知道了COM了.就加载控件里对象库不就得了!~
'Dim oDoc As Document
这个Document对象,未必是ActiveDocument返回的对象.
既然它已经提示错误了,那就不是了!~

都问你了, ActiveDocument 返回的对象是什么. (CTRL+I)
不用做介绍.看英文就知道意思.

7 楼

我意思就是通用的方法调用 oDoc 对象的 SaveAs 方法不成功!
也就是 oDoc 对象这样声明时 Dim oDoc as Object 当 oDoc 得到了实际的接口时调用还是不成功!

而如果通过引用库后这样声明 Dim oDoc as Document 这样还是没有得到实际接口一样也得通过

Set oDoc = oCdr.ActiveDocument 来把实际的接口指针赋于 oDoc ;

但是引用库之后就可以成功调用 SaveAs 方法了! 

而在我看来! 两种方法也就是引用库和没有引用库调用都应该是能正确调用才对!
不知道这是为什么不成功!因为没有引用库也能得到正确的 ActiveDocument 接口

而且也没有说 SaveAs 方法不存在! 而是存在的!就是参数类型说不正确!但是引用过库后参数类型就正确了! 

而我不管是引用了库还是没有引用库!都是这样调用的 SaveAs(字符串常量值)

所以不解!是不是VB在引用库时才能对 参数是 BYREF 还是 BYVAL 方式传值前期确定?

8 楼

哇!~,更乱了!~更不知道你在说什么咧!~

9 楼

不知道我的理解能力提高了,还是。。。

我知道啊远想问什么,但是觉得问题很不可思议。

自己曾用VB写过一个DLL,在VB中调用,也是没有引入库,只是注册一下然后CreateObject创建对象。但一切正常,没遇到过你所说的里面有些方法不能用!

10 楼

楼上的你理解正确了!

我来回复

您尚未登录,请登录后再回复。点此登录或注册