From 6896d536fe89afda05616a8f3ddbe5dadfb5e904 Mon Sep 17 00:00:00 2001 From: Pat Thoyts Date: Thu, 29 Jan 2009 22:22:19 +0000 Subject: [PATCH] import: tcom-3.10b9 --- CHANGES | 13 + {samples => demos}/Banking/Banking.idl | 0 {samples => demos}/Banking/client.tcl | 0 {samples => demos}/chart.tcl | 2 +- {samples => demos}/events.tcl | 2 +- {samples => demos}/excel.tcl | 2 +- {samples => demos}/sendkeys.tcl | 2 +- doc/Makefile | 2 +- doc/article2html.xsl | 29 +- doc/refentry2html.xsl | 38 +- doc/server.html | 291 ------------ doc/server.xml | 22 +- doc/tcom.n.html | 598 ------------------------- doc/tcom.n.xml | 231 +++++----- doc/xslt.tcl | 6 +- lib/Banking/Banking.tlb | Bin 2396 -> 0 bytes lib/Banking/pkgIndex.tcl | 2 +- lib/Banking/server.itcl | 2 +- lib/Banking/server.tcl | 2 +- lib/TclScript/TclScript.dll | Bin 32833 -> 32833 bytes lib/TclScript/TclScript.itcl | 2 +- lib/TclScript/TclScript.tlb | Bin 20468 -> 20468 bytes lib/TclScript/pkgIndex.tcl | 2 +- lib/TclScript/register.tcl | 2 +- lib/TclScript/unregister.tcl | 2 +- lib/tcom/pkgIndex.tcl | 2 +- lib/tcom/tcom.dll | Bin 262194 -> 266290 bytes lib/tcom/tcom.tcl | 2 +- lib/tcom/tcominproc.dll | Bin 32834 -> 32834 bytes lib/tcom/tcomlocal.exe | Bin 32833 -> 32833 bytes src/ActiveScriptError.cpp | 2 +- src/ActiveScriptError.h | 2 +- src/Arguments.cpp | 40 +- src/Arguments.h | 7 +- src/ComModule.cpp | 2 +- src/ComModule.h | 2 +- src/ComObject.cpp | 78 ++-- src/ComObject.h | 24 +- src/ComObjectFactory.cpp | 2 +- src/ComObjectFactory.h | 2 +- src/DispatchAdapter.cpp | 84 ++++ src/DispatchAdapter.h | 52 +++ src/DispatchImpl.cpp | 66 +++ src/DispatchImpl.h | 67 +++ src/Extension.cpp | 2 +- src/Extension.h | 2 +- src/HandleSupport.cpp | 2 +- src/HandleSupport.h | 2 +- src/HashTable.h | 2 +- src/InterfaceAdapter.cpp | 58 +-- src/InterfaceAdapter.h | 39 +- src/InterfaceAdapterVtbl.cpp | 10 +- src/Makefile | 2 +- src/NativeValue.cpp | 12 + src/NativeValue.h | 25 ++ src/Reference.cpp | 6 +- src/Reference.h | 22 +- src/RegistryKey.cpp | 2 +- src/RegistryKey.h | 2 +- src/Singleton.h | 2 +- src/SupportErrorInfo.cpp | 2 +- src/SupportErrorInfo.h | 2 +- src/TclInterp.cpp | 2 +- src/TclInterp.h | 2 +- src/TclModule.cpp | 2 +- src/TclModule.h | 2 +- src/TclObject.cpp | 285 ++++++++---- src/TclObject.h | 27 +- src/TclScript.cpp | 2 +- src/TclScriptVersion.rc | 2 +- src/ThreadLocalStorage.h | 2 +- src/TypeInfo.cpp | 4 +- src/TypeInfo.h | 2 +- src/TypeLib.cpp | 4 +- src/TypeLib.h | 2 +- src/Uuid.cpp | 2 +- src/Uuid.h | 2 +- src/bindCmd.cpp | 2 +- src/buildNumber.h | 2 +- src/configureCmd.cpp | 2 +- src/dllmain.cpp | 2 +- src/dllserver.dsp | 4 +- src/dllserverVersion.rc | 2 +- src/exemain.cpp | 2 +- src/exeserverVersion.rc | 2 +- src/foreachCmd.cpp | 2 +- src/importCmd.cpp | 2 +- src/infoCmd.cpp | 2 +- src/main.cpp | 2 +- src/mutex.h | 2 +- src/naCmd.cpp | 2 +- src/nullCmd.cpp | 2 +- src/objectCmd.cpp | 2 +- src/refCmd.cpp | 149 +++--- src/shortPathNameCmd.cpp | 2 +- src/tclRunTime.h | 2 +- src/tcom.dsp | 32 +- src/tcomApi.h | 2 +- src/tcomVersion.rc | 2 +- src/typelibCmd.cpp | 2 +- src/variantCmd.cpp | 2 +- src/version.h | 4 +- tests/all.tcl | 2 +- tests/array.test | 4 +- tests/eval.test | 4 +- tests/foreach.test | 2 +- tests/namedarg.test | 2 +- tests/ref.test | 4 +- 108 files changed, 1051 insertions(+), 1420 deletions(-) rename {samples => demos}/Banking/Banking.idl (100%) rename {samples => demos}/Banking/client.tcl (100%) rename {samples => demos}/chart.tcl (93%) rename {samples => demos}/events.tcl (85%) rename {samples => demos}/excel.tcl (95%) rename {samples => demos}/sendkeys.tcl (86%) delete mode 100644 doc/server.html delete mode 100644 doc/tcom.n.html delete mode 100644 lib/Banking/Banking.tlb create mode 100644 src/DispatchAdapter.cpp create mode 100644 src/DispatchAdapter.h create mode 100644 src/DispatchImpl.cpp create mode 100644 src/DispatchImpl.h create mode 100644 src/NativeValue.cpp create mode 100644 src/NativeValue.h diff --git a/CHANGES b/CHANGES index 6edeffe..99dedce 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,16 @@ +Version 3.10 +- Workaround type mismatch error when passing VT_UINT | VT_BYREF parameters. +- Added support for 64-bit integer arguments. +- On type mismatch errors, the error result now indicates which argument cannot + be converted. +- Added missing conversions from VT_DISPATCH | VT_BYREF, VT_UNKNOWN | VT_BYREF, + VT_VARIANT | VT_BYREF, and VT_ARRAY | VT_BYREF arguments. +- Load type library using neutral language argument. +- Replace -method option with -call option. +- Fixed invalid pointer error when returned EXCEPINFO contains null + description. +- Fixed passing SAFEARRAY(short) parameters. + Version 3.9 - Fixed defect where eval may trigger premature destruction of handle internal representation. diff --git a/samples/Banking/Banking.idl b/demos/Banking/Banking.idl similarity index 100% rename from samples/Banking/Banking.idl rename to demos/Banking/Banking.idl diff --git a/samples/Banking/client.tcl b/demos/Banking/client.tcl similarity index 100% rename from samples/Banking/client.tcl rename to demos/Banking/client.tcl diff --git a/samples/chart.tcl b/demos/chart.tcl similarity index 93% rename from samples/chart.tcl rename to demos/chart.tcl index fbfd15f..b251742 100644 --- a/samples/chart.tcl +++ b/demos/chart.tcl @@ -1,4 +1,4 @@ -# $Id: chart.tcl,v 1.5 2004/02/26 18:07:38 cthuang Exp $ +# $Id: chart.tcl 5 2005-02-16 14:57:24Z cthuang $ # # This example controls Excel. It performs the following steps. # - Start Excel application. diff --git a/samples/events.tcl b/demos/events.tcl similarity index 85% rename from samples/events.tcl rename to demos/events.tcl index 32e02d3..e8190b4 100644 --- a/samples/events.tcl +++ b/demos/events.tcl @@ -1,4 +1,4 @@ -# $Id: events.tcl,v 1.2 2001/06/30 18:42:58 cthuang Exp $ +# $Id: events.tcl 5 2005-02-16 14:57:24Z cthuang $ package require tcom diff --git a/samples/excel.tcl b/demos/excel.tcl similarity index 95% rename from samples/excel.tcl rename to demos/excel.tcl index b00459e..69fe1b5 100644 --- a/samples/excel.tcl +++ b/demos/excel.tcl @@ -1,4 +1,4 @@ -# $Id: excel.tcl,v 1.10 2002/09/27 22:11:03 cthuang Exp $ +# $Id: excel.tcl 5 2005-02-16 14:57:24Z cthuang $ # # This example controls Excel. It performs the following steps. # - Start Excel application. diff --git a/samples/sendkeys.tcl b/demos/sendkeys.tcl similarity index 86% rename from samples/sendkeys.tcl rename to demos/sendkeys.tcl index e2705ab..c485b1b 100644 --- a/samples/sendkeys.tcl +++ b/demos/sendkeys.tcl @@ -1,4 +1,4 @@ -# $Id: sendkeys.tcl,v 1.3 2001/06/30 18:42:58 cthuang Exp $ +# $Id: sendkeys.tcl 5 2005-02-16 14:57:24Z cthuang $ # # This example demonstrates how to send keys to Windows applications. # It requires Windows Script Host 2.0 installed on the system. diff --git a/doc/Makefile b/doc/Makefile index 40f59cf..e95879d 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.6 2002/04/17 22:07:57 cthuang Exp $ +# $Id: Makefile 5 2005-02-16 14:57:24Z cthuang $ all: tcom.n.html server.html diff --git a/doc/article2html.xsl b/doc/article2html.xsl index 06c72ad..30c126d 100644 --- a/doc/article2html.xsl +++ b/doc/article2html.xsl @@ -1,5 +1,5 @@ - + - <xsl:value-of select="artheader/title"/> + <xsl:value-of select="title"/> -

- + +

+
+ + - ? @@ -47,7 +49,6 @@ ? - @@ -101,15 +102,15 @@ -
+    
     
-    
+
-
+    
     
-    
+
diff --git a/doc/refentry2html.xsl b/doc/refentry2html.xsl index 324d286..dc0858c 100644 --- a/doc/refentry2html.xsl +++ b/doc/refentry2html.xsl @@ -1,5 +1,5 @@ - + <xsl:value-of select="refnamediv/refname"/> @@ -26,7 +32,7 @@ - + @@ -42,7 +48,6 @@ - ? @@ -55,7 +60,10 @@ ? - + + + + @@ -117,19 +125,17 @@ -
- -
+ + +
-
+
- -
@@ -145,17 +151,17 @@ - + - + -
+    
     
-    
+
diff --git a/doc/server.html b/doc/server.html deleted file mode 100644 index d4f1386..0000000 --- a/doc/server.html +++ /dev/null @@ -1,291 +0,0 @@ - - - -COM Object Implementation in Tcl - - - -

COM Object Implementation in Tcl

- - -

Introduction

-

This article shows by example how to implement COM objects in - Tcl with the tcom extension. It shows how an object - can be implemented by an [incr Tcl] class or in just plain Tcl. -

-
- - - -
-

The class diagram shows the structure of server objects which implement - two COM interfaces. The IAccount interface defines a Balance property, and - Deposit and Withdraw methods which modify the balance. The Account class - implements the IAccount interface by delegating its operations to the - AccountImpl class, which is written in [incr Tcl] and actually implements - the operations. The IBank interface defines a method to create an account. - Following the same pattern, the Bank class implements the IBank interface by - delegating to the BankImpl class, which provides the actual implementation. -

- - -

Write MIDL Specification

-

The file Banking.idl contains the MIDL - specification for the COM interfaces and classes. The interfaces can be - declared dual because tcom can - implement objects whose operations are invoked through the IDispatch - interface or the virtual function table.

-
-
-import "oaidl.idl";
-import "ocidl.idl";
-
-        [
-                object,
-                uuid(0A0059C4-E0B0-11D2-942A-00C04F7040AB),
-                dual,
-                helpstring("IAccount Interface"),
-                pointer_default(unique)
-        ]
-        interface IAccount: IDispatch
-        {
-                [id(1), propget, helpstring("property Balance")]
-                HRESULT Balance([out, retval] long *pValue);
-
-                [id(2), helpstring("method Deposit")]
-                HRESULT Deposit([in] long amount);
-
-                [id(3), helpstring("method Withdraw")]
-                HRESULT Withdraw([in] long amount);
-        };
-
-        [
-                object,
-                uuid(0A0059C4-E0B0-11D2-942A-00C04F7040AC),
-                dual,
-                helpstring("IBank Interface"),
-                pointer_default(unique)
-        ]
-        interface IBank: IDispatch
-        {
-                [id(1), helpstring("method CreateAccount")]
-                HRESULT CreateAccount([out, retval] IAccount **pAccount);
-        };
-
-[
-        uuid(0A0059B8-E0B0-11D2-942A-00C04F7040AB),
-        version(1.0),
-        helpstring("Banking 1.0 Type Library")
-]
-library Banking
-{
-        importlib("stdole32.tlb");
-
-        [
-                uuid(0A0059C5-E0B0-11D2-942A-00C04F7040AB),
-                helpstring("Account Class")
-        ]
-        coclass Account
-        {
-                [default] interface IAccount;
-        };
-
-        [
-                uuid(0A0059C5-E0B0-11D2-942A-00C04F7040AC),
-                helpstring("Bank Class")
-        ]
-        coclass Bank
-        {
-                [default] interface IBank;
-        };
-};
-
- - -

Create Type Library

-

Run this command to generate a type library file - Banking.tlb from the MIDL specification.

-
-
-midl Banking.idl
-
- - -

Create Tcl Package

-

The tcom server implementation depends on the Tcl - package mechanism to provide the code that implements specific COM interfaces. - In this example, we'll create a package named Banking, which provides code - that implements the IBank and IAccount interfaces.

- -

Create a directory for the package by making a subdirectory named - Banking under one of the directories in the - auto_path variable. Create a - pkgIndex.tcl file in the package directory.

-
-
-package ifneeded Banking 1.0 [list source [file join $dir server.itcl]]
-
- -

Copy the Banking.tlb type library file into the - package directory.

- -

Create the following server.itcl file in the package - directory. This file defines [incr Tcl] classes that implement the - IBank and IAccount interfaces.

- -
-
-package provide Banking 1.0
-
-package require Itcl
-namespace import ::itcl::*
-
-package require tcom
-::tcom::import [file join [file dirname [info script]] Banking.tlb]
-
-class AccountImpl {
-    private variable balance 0
-
-    public method _get_Balance {} {
-        return $balance
-    }
-
-    public method Deposit {amount} {
-        set balance [expr $balance + $amount]
-    }
-
-    public method Withdraw {amount} {
-        set balance [expr $balance - $amount]
-    }
-}
-
-class BankImpl {
-    public method CreateAccount {} {
-        set accountImpl [AccountImpl #auto]
-        return [::tcom::object create ::Banking::Account \
-            [code $accountImpl] {delete object}]                                ;# 1
-    }
-}
-
-::tcom::object registerfactory ::Banking::Bank {BankImpl #auto} {delete object} ;# 2
-
- -

On line 1, the ::tcom::object create command creates - a COM object that implements the IAccount interface by delegating its - operations to an [incr Tcl] object specified by an [incr Tcl] object handle. - Interface methods are mapped to a method with the same name. Interface - properties are mapped to methods named by prepending _get_ - and _set_ to the property name. When the last reference - to the COM object is released, tcom invokes the - delete object command with the [incr Tcl] object handle as - an additional argument to clean up the [incr Tcl] object.

- -

Line 2 creates a factory for creating instances of the Bank class and - registers the factory with COM. To create a COM object, the factory invokes - a command which returns a handle to an [incr Tcl] object that implements the - operations. In this example, the factory invokes the BankImpl - #auto command which creates a BankImpl [incr Tcl] object and - returns a handle to that object. To clean up when the COM object is - destroyed, tcom invokes the delete - object command with the [incr Tcl] object handle as an additional - argument.

- - -

Register Server

-

Run these Tcl commands to create entries in the Windows registry - required by COM and the tcom server implementation. -

-
-
-package require tcom
-::tcom::server register Banking.tlb
-
- - -

Implement Client

-

The client.tcl script implements a simple client. - It gets a reference to an object that implements the bank interface, creates - an account, and performs some operations on the account.

-
-
-package require tcom
-
-set bank [::tcom::ref createobject "Banking.Bank"]
-set account [$bank CreateAccount]
-puts [$account Balance]
-$account Deposit 20
-puts [$account Balance]
-$account Withdraw 10
-puts [$account Balance]
-
- - -

Implement Objects In Plain Tcl

-

You can implement objects in plain Tcl. The servant command passed to - the ::tcom::object create command can be the name of any - object-style command. Similarly, the factory command passed to the - ::tcom::object registerfactory command can return the - name of any object-style command. The following Tcl script defines the - procedures accountImpl and bankImpl, - which have parameters in the style of a method name followed by any - arguments.

-
-
-package provide Banking 1.0
-
-package require tcom
-::tcom::import [file join [file dirname [info script]] Banking.tlb]
-
-proc accountImpl {method args} {
-    global balance
-
-    switch -- $method {
-        _get_Balance {
-            return $balance
-        }
-
-        Deposit {
-            set amount [lindex $args 0]
-            set balance [expr $balance + $amount]
-        }
-
-        Withdraw {
-            set amount [lindex $args 0]
-            set balance [expr $balance - $amount]
-        }
-        
-        default {
-            error "unknown method $method $args"
-        }
-    }
-}
-
-proc bankImpl {method args} {
-    global balance
-
-    switch -- $method {
-        CreateAccount {
-            set balance 0
-            return [::tcom::object create ::Banking::Account accountImpl]
-        }
-        
-        default {
-            error "unknown method $method $args"
-        }
-    }
-}
-
-::tcom::object registerfactory ::Banking::Bank {list bankImpl}
-
- - - diff --git a/doc/server.xml b/doc/server.xml index fec1814..8741159 100644 --- a/doc/server.xml +++ b/doc/server.xml @@ -1,12 +1,13 @@ - - + +
- - $Date: 2002/06/29 15:34:52 $ - $Revision: 1.23 $ - COM Object Implementation in Tcl - + COM Object Implementation in Tcl + + $Date: 2005-04-14 10:01:20 -0400 (Thu, 14 Apr 2005) $ + $Revision: 12 $ + Introduction This article shows by example how to implement COM objects in @@ -36,7 +37,6 @@ implement objects whose operations are invoked through the IDispatch interface or the virtual function table. - import "oaidl.idl"; import "ocidl.idl"; @@ -106,7 +106,6 @@ library Banking Run this command to generate a type library file Banking.tlb from the MIDL specification. - midl Banking.idl @@ -122,7 +121,6 @@ library Banking auto_path variable. Create a pkgIndex.tcl file in the package directory. - package ifneeded Banking 1.0 [list source [file join $dir server.itcl]] @@ -134,7 +132,6 @@ package ifneeded Banking 1.0 [list source [file join $dir server.itcl]] IBank and IAccount interfaces. - package provide Banking 1.0 package require Itcl @@ -196,7 +193,6 @@ class BankImpl { required by COM and the tcom server implementation. - package require tcom ::tcom::server register Banking.tlb @@ -207,7 +203,6 @@ class BankImpl { It gets a reference to an object that implements the bank interface, creates an account, and performs some operations on the account. - package require tcom set bank [::tcom::ref createobject "Banking.Bank"] @@ -230,7 +225,6 @@ puts [$account Balance] which have parameters in the style of a method name followed by any arguments. - package provide Banking 1.0 package require tcom diff --git a/doc/tcom.n.html b/doc/tcom.n.html deleted file mode 100644 index 518d762..0000000 --- a/doc/tcom.n.html +++ /dev/null @@ -1,598 +0,0 @@ - - - -tcom - - - -

Name

-

tcom -- Access COM objects from Tcl

- - - -

Synopsis

- - package require tcom - ?3.9? -
- ::tcom::ref - createobject - ?-inproc? - ?-local? - ?-remote? - ?-clsid? - progID - ?hostName? -
- ::tcom::ref - getactiveobject - ?-clsid? - progID -
- ::tcom::ref - getobject - pathName -
- ::tcom::ref - equal - handle1 - handle2 -
- handle - ?-method? - method - ?argument ...? -
- handle - -namedarg - method - ?argumentName argumentValue ...? -
- handle - ?-get? - ?-set? - property - ?index ...? - ?value? -
- ::tcom::foreach - varname - collectionHandle - body -
- ::tcom::foreach - varlist - collectionHandle - body -
- ::tcom::bind - handle - command - ?eventIID? -
- ::tcom::unbind - handle -
- ::tcom::na -
- ::tcom::info interface - handle -
- ::tcom::configure - name - ?value? -
- ::tcom::import - typeLibrary - ?namespace? -
- - - -

Description

-

The tcom package provides commands to access COM - objects through IDispatch and IUnknown derived interfaces.

- - -

Commands

-
- -
- - ::tcom::ref - createobject - ?-inproc? - ?-local? - ?-remote? - ?-clsid? - progID - ?hostName? -
- ::tcom::ref - getactiveobject - ?-clsid? - progID - -
-
-

These commands return a handle representing a reference to a COM - object through an interface pointer. The handle can be used as a Tcl - command to invoke operations on the object. In practice, you should store - the handle in a Tcl variable or pass it as an argument to another command. -

-

References to COM objects are automatically released. If you store - the handle in a local variable, the reference is released when execution - leaves the variable's scope. If you store the handle in a global - variable, you can release the reference by unsetting the variable, setting - the variable to another value, or exiting the Tcl interpreter.

-

The createobject subcommand creates an instance - of the object. The -inproc option requests the object be - created in the same process. The -local option requests - the object be created in another process on the local machine. The - -remote option requests the object be created on a remote - machine. The progID parameter is the programmatic - identifier of the object class. Use the -clsid option if - you want to specify the class using a class ID instead. The - hostName parameter specifies the machine where you - want to create the object instance.

-

The getactiveobject subcommand gets a reference - to an already existing object.

-
- - -
- - ::tcom::ref - getobject - pathName - -
-
-

This command returns a reference to a COM object from a file. The - pathName parameter is the full path and name of the - file containing the object.

-
- - -
- - ::tcom::ref - equal - handle1 - handle2 - -
-
-

This command compares the interface pointers represented by two - handles for COM identity, returning 1 if the interface pointers refer to - the same COM object, or 0 if not.

-
- - -
- - handle - ?-method? - method - ?argument ...? - -
-
-

This command invokes a method on the object represented by the - handle. The return value of the method is returned - as a Tcl value. A Tcl error will be raised if the method returns a - failure HRESULT code. Parameters with the [in] attribute are passed by - value. For each parameter with the [out] or [in, out] attributes, pass - the name of a Tcl variable as the argument. After the method returns, the - variables will contain the output values. In some cases where - tcom cannot get information about the object's - interface, you may have to use the -method option to - specify you want to invoke a method.

-
- - -
- - handle - -namedarg - method - ?argumentName argumentValue ...? - -
-
-

Use the -namedarg option to invoke a method - with named arguments. This only works with objects that implement - IDispatch. You specify arguments by passing name and value pairs.

-
- - -
- - handle - ?-get? - ?-set? - property - ?index ...? - ?value? - -
-
-

This command gets or sets a property of the object represented by - the handle. If you supply a - value argument, this command sets the named - property to the value, otherwise it returns the property value. For - indexed properties, you must specify one or more - index values. The command raises a Tcl error if - you specify an invalid property name or if you try to set a value that - cannot be converted to the property's type. In some cases where - tcom cannot get information about the object's - interface, you may have to use the -get or - -set option to specify you want to get or set a property - respectively.

-
- - -
- - ::tcom::foreach - varname - collectionHandle - body -
- ::tcom::foreach - varlist - collectionHandle - body - -
-
-

This command implements a loop where the loop variable(s) take on - values from a collection object represented by - collectionHandle. In the simplest case, there - is one loop variable, varname. The - body argument is a Tcl script. For each - element of the collection, the command assigns the contents of the element - to varname, then calls the Tcl interpreter to - execute body.

-

In the general case, there can be more than one loop variable. - During each iteration of the loop, the variables of - varlist are assigned consecutive elements from - the collection. Each element is used exactly once. The total number of - loop iterations is large enough to use up all the elements from the - collection. On the last iteration, if the collection does not contain - enough elements for each of the loop variables, empty values are used for - the missing elements.

-

The break and continue - statements may be invoked inside body, with the - same effect as in the for command. The - ::tcom::foreach command returns an empty string.

-
- - -
- - ::tcom::bind - handle - command - ?eventIID? - -
-
-

This command specifies a Tcl command that will be executed when - events are received from an object. The command - will be called with additional arguments: the event name and the event - arguments. By default, the event interface is the default event source - interface of the object's class. Use the eventIID - parameter to specify the IID of another event interface. If an error - occurs while executing the command then the bgerror mechanism is used to - report the error.

-
- - -
- - ::tcom::unbind - handle - -
-
-

This command tears down all event connections to the object that - were set up by the ::tcom::bind command.

-
- - -
- - ::tcom::na - -
-
-

Objects that implement the IDispatch interface allow some method - parameters to be optional. This command returns a token representing a - missing optional argument. In practice, you would pass this token as a - method argument in place of a missing optional argument.

-
- - -
- - ::tcom::info interface - handle - -
-
-

This command returns a handle representing a description of the - interface exposed by the object. The handle supports the following - commands.

-
- -
- - interfaceHandle - iid - -
-
-

This command returns an interface identifier code.

-
- - -
- - interfaceHandle - methods - -
-
-

This command returns a list of method descriptions for methods - defined in the interface. Each method description is a list. The - first element is the member ID. The second element is the return type. - The third element is the method name. The fourth element is a list of - parameter descriptions.

-
- - -
- - interfaceHandle - name - -
-
-

This command returns the interface's name.

-
- - -
- - interfaceHandle - properties - -
-
-

This command returns a list of property descriptions for - properties defined in the interface. Each property description is a - list. The first element is the member ID. The second element is the - property read/write mode. The third element is the property data type. - The fourth element is the property name. If the property is an indexed - property, there is a fifth element which is a list of parameter - descriptions.

-
- -
-
- - -
- - ::tcom::configure - name - ?value? - -
-
-

This command sets and retrieves options for the package. If - name is supplied but no - value then the command returns the current - value of the given option. If one or more pairs of - name and value are - supplied, the command sets each of the named options to the corresponding - value; in this case the return value is an empty string.

-
- -
- - -concurrency - ?concurrencyModel? - -
-
-

This option sets the concurrency model, which can be - apartmentthreaded or multithreaded. - The default is apartmentthreaded. You must configure - this option before performing any COM operations such as getting a - reference to an object. After a COM operation has been done, changing - this option has no effect.

-
- -
-
- -
- - -

Importing Type Library Information

- - ::tcom::import - typeLibrary - ?namespace? - -

Use the ::tcom::import command to convert type - information from a type library into Tcl commands to access COM classes and - interfaces. The typeLibrary argument specifies a - type library file. By default, the commands are defined in a namespace named - after the type library, but you may specify another namespace by supplying a - namespace argument. This command returns the - library name stored in the type library file.

- -

Commands

-
- -
- - class - ?-inproc? - ?-local? - ?-remote? - ?hostName? - -
-
-

For each class in the type library, - ::tcom::import defines a Tcl command with the same - name as the class. The class command creates an object of the class and - returns a handle representing an interface pointer to the object. The - command accepts an optional hostName argument - to specify the machine where you want to create the object. You can use - the returned handle to invoke methods and access properties of the - object. In practice, you should store this handle in a Tcl variable or - pass it as an argument to a Tcl command.

-
- - -
- - interface - handle - -
-
-

For each interface in the type library, - ::tcom::import defines a Tcl command with the same - name as the interface. The interface command queries the object - represented by handle for an interface pointer - to that specific interface. The command returns a handle representing - the interface pointer. You can use the returned handle to invoke methods - and access properties of the object. In practice, you should store this - handle in a Tcl variable or pass it as an argument to a Tcl - command.

-
- -
- - -

Enumerations

-

The ::tcom::import command generates a Tcl array - for each enumeration defined in the type library. The array name is the - enumeration name. To get an enumerator value, use an enumerator name as an - index into the array.

- - - -

Tcl Value to VARIANT Mapping

-

Each Tcl value has two representations. A Tcl value has a string - representation and also has an internal representation that can be - manipulated more efficiently. For example, a Tcl list is represented as an - object that holds the list's string representation as well as an array of - pointers to the objects for each list element. The two representations are a - cache of each other and are computed lazily. That is, each representation is - only computed when necessary, is computed from the other representation, and, - once computed, is saved. In addition, a change in one representation - invalidates the other one. As an example, a Tcl program doing integer - calculations can operate directly on a variable's internal machine integer - representation without having to constantly convert between integers and - strings. Only when it needs a string representing the variable's value, say - to print it, will the program regenerate the string representation from the - integer. The internal representations built into Tcl include boolean, - integer and floating point types.

-

When invoking COM object methods, tcom tries to - convert each Tcl argument to the parameter type specified by the method - interface. For example, if a method accepts an int - parameter, tcom tries to convert the argument to that - type. If the parameter type is a VARIANT, the conversion has an extra - complication because a VARIANT is designed to hold many different data types. - One approach might be to simply copy the Tcl value's string representation - to a string in the VARIANT, and hope the method's implementation can correctly - interpret the string, but this doesn't work in general because some - implementations expect certain VARIANT types.

-

Tcom uses the Tcl value's internal representation - type as a hint to choose the resulting VARIANT type.

-
- Tcl value to VARIANT mapping
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Tcl internal representationVARIANT type
booleanVT_BOOL
intVT_I4
doubleVT_R8
listone-dimensional array of VT_VARIANT
bytearrayone-dimensional array of VT_UI1
otherVT_BSTR
-
- -

Invoking Methods With VARIANT Parameters

-

The internal representation of a Tcl value may become significant when - it is passed to a VARIANT parameter of a method. For example, the standard - interface for COM collections defines the Item method for - getting an element by specifying an index. Many implementations of the - method allow the index to be an integer value (usually based from 1) or a - string key. If the index parameter is a VARIANT, you must account for the - internal representation type of the Tcl argument passed to that - parameter.

-
-
-# Assume $collection is a handle to a collection.
-set element [$collection Item 1]
-
-

This command passes a string consisting of the single character "1" - to the Item method. The method may return an error because it can't find an - element with that string key.

-
-
-set numElements [$collection Count]
-for {set i 1} {$i <= $numElements} {incr i} {  ;# 1
-    set element [$collection Item $i]  ;# 2
-}
-
-

In line 1, the for command sets the internal - representation of $i to an int type as a side effect of - evaluating the condition expression {$i <= - $numElements}. The command in line 2 passes the integer value in - $i to the Item method, which should succeed if the method - can handle integer index values.

- - - - diff --git a/doc/tcom.n.xml b/doc/tcom.n.xml index 4794bad..c25414a 100644 --- a/doc/tcom.n.xml +++ b/doc/tcom.n.xml @@ -1,11 +1,12 @@ - - + + - - $Date: 2002/10/22 22:07:55 $ - $Revision: 1.65 $ - + + $Date: 2005-04-14 10:01:20 -0400 (Thu, 14 Apr 2005) $ + $Revision: 12 $ + tcom n @@ -17,78 +18,74 @@ package require tcom - + 3.10 - ::tcom::ref - createobject - - - - - progID - hostName + ::tcom::ref createobject + -inproc + -local + -remote + -clsid + progID + hostName - ::tcom::ref - getactiveobject - - progID + ::tcom::ref getactiveobject + -clsid + progID - ::tcom::ref - getobject - pathName + ::tcom::ref getobject + pathName - ::tcom::ref - equal - handle1 - handle2 + ::tcom::ref equal + handle1 + handle2 - handle - - method - argument + handle + -call + method + argument - handle - - method - argumentName argumentValue + handle + -namedarg + method + argumentName argumentValue - handle - - - property - index - value + handle + -get + -set + property + index + value ::tcom::foreach - varname - collectionHandle - body + varname + collectionHandle + body ::tcom::foreach - varlist - collectionHandle - body + varlist + collectionHandle + body ::tcom::bind - handle - command - eventIID + handle + command + eventIID ::tcom::unbind - handle + handle ::tcom::na ::tcom::info interface - handle + handle ::tcom::configure - name - value + name + value ::tcom::import - typeLibrary - namespace + typeLibrary + namespace @@ -103,19 +100,17 @@ - ::tcom::ref - createobject - - - - - progID - hostName + ::tcom::ref createobject + -inproc + -local + -remote + -clsid + progID + hostName - ::tcom::ref - getactiveobject - - progID + ::tcom::ref getactiveobject + -clsid + progID @@ -146,9 +141,8 @@ - ::tcom::ref - getobject - pathName + ::tcom::ref getobject + pathName @@ -160,10 +154,9 @@ - ::tcom::ref - equal - handle1 - handle2 + ::tcom::ref equal + handle1 + handle2 @@ -175,10 +168,10 @@ - handle - - method - argument + handle + -call + method + argument @@ -190,17 +183,19 @@ the name of a Tcl variable as the argument. After the method returns, the variables will contain the output values. In some cases where tcom cannot get information about the object's - interface, you may have to use the option to + interface, you may have to use the option to specify you want to invoke a method. - handle - - method - argumentName argumentValue + handle + -namedarg + method + + argumentName argumentValue + @@ -212,12 +207,12 @@ - handle - - - property - index - value + handle + -get + -set + property + index + value @@ -239,14 +234,14 @@ ::tcom::foreach - varname - collectionHandle - body + varname + collectionHandle + body ::tcom::foreach - varlist - collectionHandle - body + varlist + collectionHandle + body @@ -276,9 +271,9 @@ ::tcom::bind - handle - command - eventIID + handle + command + eventIID @@ -296,7 +291,7 @@ ::tcom::unbind - handle + handle @@ -321,7 +316,7 @@ ::tcom::info interface - handle + handle @@ -332,7 +327,7 @@ - interfaceHandle + interfaceHandle iid @@ -343,7 +338,7 @@ - interfaceHandle + interfaceHandle methods @@ -358,7 +353,7 @@ - interfaceHandle + interfaceHandle name @@ -369,7 +364,7 @@ - interfaceHandle + interfaceHandle properties @@ -390,8 +385,8 @@ ::tcom::configure - name - value + name + value @@ -406,8 +401,8 @@ - - concurrencyModel + -concurrency + concurrencyModel @@ -428,8 +423,8 @@ Importing Type Library Information ::tcom::import - typeLibrary - namespace + typeLibrary + namespace Use the ::tcom::import command to convert type information from a type library into Tcl commands to access COM classes and @@ -444,11 +439,11 @@ - class - - - - hostName + class + -inproc + -local + -remote + hostName @@ -466,8 +461,8 @@ - interface - handle + interface + handle @@ -569,7 +564,6 @@ internal representation type of the Tcl argument passed to that parameter. - # Assume $collection is a handle to a collection. set element [$collection Item 1] @@ -577,7 +571,6 @@ set element [$collection Item 1] to the Item method. The method may return an error because it can't find an element with that string key. - set numElements [$collection Count] for {set i 1} {$i <= $numElements} {incr i} { ;# 1 set element [$collection Item $i] ;# 2 diff --git a/doc/xslt.tcl b/doc/xslt.tcl index 6969985..f28e4dc 100644 --- a/doc/xslt.tcl +++ b/doc/xslt.tcl @@ -1,4 +1,4 @@ -# $Id: xslt.tcl,v 1.2 2002/09/05 22:10:25 cthuang Exp $ +# $Id: xslt.tcl 7 2005-02-24 05:18:47Z cthuang $ # # Run an XML document through an XSLT processor. @@ -12,6 +12,7 @@ package require tcom set domProgId "Msxml2.DOMDocument" set source [::tcom::ref createobject $domProgId] +$source async 0 $source preserveWhiteSpace 1 $source validateOnParse 0 $source resolveExternals 0 @@ -26,6 +27,7 @@ if {![$source load $sourceUrl]} { } set xslt [::tcom::ref createobject $domProgId] +$xslt async 0 $xslt preserveWhiteSpace 1 $xslt validateOnParse 0 set xsltUrl [lindex $argv 1] @@ -39,7 +41,7 @@ if {![$xslt load $xsltUrl]} { } regsub {]*>} [$source transformNode $xslt] \ - {} \ + {} \ resultHtml set out [open [lindex $argv 2] "w"] diff --git a/lib/Banking/Banking.tlb b/lib/Banking/Banking.tlb deleted file mode 100644 index 83694deeb579b67f55610f6eaf2807db21114a6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2396 zcmcgu&r4KM6h1Sf&WvR`=|UypAqf(bOwnQpgYgHFU}QCT3tae|dF9YJ^O$*Jf{=?@ zwr~;ECXi|oBw^4ZT)8lCTM&ecn4nGnK(xxv_ujpFeK{sAI&kK^^PTUUd(NHv?#z`N zBk3Ro2okMx4GpmI5F!bA0scJBDx|l=0^eX=VnvS1%kuLUYn*{J>oP0&&5TWQQRFFq zhW%5T-_O3G`QL(GeZ|j)h(2ra3iF9MDqd+I`l-bi!$fPEACK&>k30_V=8ti_Me`@w zZ`XW3-|zQy6FHm%L5$n2DVI6Ity7z1U>}qqm$&VY?*RCP?tr^SiV4^YwT7~)2JA9x zDn`^R!MLJ!xUQHM}{nuS&c*Lhc&l z3}P=-|LDap8w_BMH5sUA1aA%Fz&Q{D6+PkkUuCLBe!_=iFE%8GbMx*NHLg`Z#vY!b zjjML*)i2pVW_|w4;SQJEtG~L%IKC4fe--caGULcoHBlG1?z889o!Iv&RtS1KOJyfp%vnz|s)N35|c~i?9*Pf4>|37%uL;C7HBl$(GD{ya%XPm;CV>{o$O$uTKVM zM*;8|R#+3gxj0m^Ovh4Pd*>VcC~ZHs?LEAm~c+g7^%sq2yut@MHd^+Mq8gJAXqTW}#2R{REa zP{$G*{_P*5*zn$ehZH~-yhn|!alTa)*PvnkpAvBI8F139=n3yL?w&Z`Fp7KH<*I)- s-hHKW!N+}sOA7Z2X2P8TL4P-;-QR1PqFS#{n1ea1tmqXrH(4RS0hu!iw*UYD diff --git a/lib/Banking/pkgIndex.tcl b/lib/Banking/pkgIndex.tcl index 1c3601c..8aafe65 100644 --- a/lib/Banking/pkgIndex.tcl +++ b/lib/Banking/pkgIndex.tcl @@ -1,2 +1,2 @@ -# $Id: pkgIndex.tcl,v 1.3 2001/07/04 03:36:16 cthuang Exp $ +# $Id: pkgIndex.tcl 5 2005-02-16 14:57:24Z cthuang $ package ifneeded Banking 1.0 [list source [file join $dir server.tcl]] diff --git a/lib/Banking/server.itcl b/lib/Banking/server.itcl index 7b9540d..ae628a1 100644 --- a/lib/Banking/server.itcl +++ b/lib/Banking/server.itcl @@ -1,4 +1,4 @@ -# $Id: server.itcl,v 1.7 2002/06/29 15:34:52 cthuang Exp $ +# $Id: server.itcl 5 2005-02-16 14:57:24Z cthuang $ package provide Banking 1.0 package require Itcl diff --git a/lib/Banking/server.tcl b/lib/Banking/server.tcl index f31894f..bc72ff7 100644 --- a/lib/Banking/server.tcl +++ b/lib/Banking/server.tcl @@ -1,4 +1,4 @@ -# $Id: server.tcl,v 1.4 2003/03/07 00:03:00 cthuang Exp $ +# $Id: server.tcl 5 2005-02-16 14:57:24Z cthuang $ package provide Banking 1.0 package require tcom diff --git a/lib/TclScript/TclScript.dll b/lib/TclScript/TclScript.dll index a214bbdf208352a703b0ee5e6bc1a97aa84df932..db25d4dac1507b5a59d4cbdfc8186a001c3c8da3 100644 GIT binary patch delta 306 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

Hjs^C@)z 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

?V{Gj}ryhQ%198z+XM=9C^%6Ig)J?QX4 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

>#+sfP>cOIf|H2bLJXiSIzfVsUKof-8b3xO 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 FOaTvAP|E-S delta 280 zcmX@qz;vjAX@dkK%ihdY_LF588<-w2O;i+~ypi!b}MZGuoHt z<>V)4J2>a(`sSyU=A=3}ggUxncqrqfd3u(r#$(|Obj2kA`TUbjvGuYc3h9u|sCuOB3mpC{CI=VUl4PpqIeAz;s zF?{lG3q_{y44dUF!?+-BsBpd_Big{kfB_mNCno6gaxyS8NCD-*^yIk-@{A8A?@dr< z+%x%MLO!zw1Iy&#L`6o+$(4z}nRS4?@+4J8%gqau5_l&XaBOBQU>9JWTGwpHHkr4< F6aZ2+Ra*c6 diff --git a/lib/tcom/tcomlocal.exe b/lib/tcom/tcomlocal.exe index 42df14c8aee3a98b6b9f5aa2ac3eec29334d10f7..e83568bb88e388471c176d765ecacb979198d8e8 100644 GIT binary patch delta 253 zcmX@uz;v*IX#)o%i{QyJr^!5w4NMo9CMrrzUcq>Q@xtaxCTn}J%;p`A9Bj%gjP^yT z>B%|8ZaInR#SYH-xxV=+r8%h%4!%yV-Vsp@3Cx+1kU9(Q|UHhd5)z)L#@NYgJrtQZ88=_>s8JWqVPe1lIg=9$^m(}$m>Cp- za$tJ$+yZ&VQ|uaNj(4n diff --git a/src/ActiveScriptError.cpp b/src/ActiveScriptError.cpp index fe219b3..e71a002 100644 --- a/src/ActiveScriptError.cpp +++ b/src/ActiveScriptError.cpp @@ -1,4 +1,4 @@ -// $Id: ActiveScriptError.cpp,v 1.1 2002/03/30 18:49:53 cthuang Exp $ +// $Id: ActiveScriptError.cpp 5 2005-02-16 14:57:24Z cthuang $ #include "ActiveScriptError.h" STDMETHODIMP diff --git a/src/ActiveScriptError.h b/src/ActiveScriptError.h index 38c542f..9c1723c 100644 --- a/src/ActiveScriptError.h +++ b/src/ActiveScriptError.h @@ -1,4 +1,4 @@ -// $Id: ActiveScriptError.h,v 1.2 2002/04/12 02:55:27 cthuang Exp $ +// $Id: ActiveScriptError.h 5 2005-02-16 14:57:24Z cthuang $ #ifndef ACTIVESCRIPTERROR_H #define ACTIVESCRIPTERROR_H diff --git a/src/Arguments.cpp b/src/Arguments.cpp index b92e4a7..73a055b 100644 --- a/src/Arguments.cpp +++ b/src/Arguments.cpp @@ -1,4 +1,4 @@ -// $Id: Arguments.cpp,v 1.35 2003/03/15 01:32:09 cthuang Exp $ +// $Id: Arguments.cpp 5 2005-02-16 14:57:24Z cthuang $ #include "Arguments.h" #include "Extension.h" #include "TclObject.h" @@ -45,13 +45,23 @@ TypedArguments::initArgument ( // For out parameters, set a pointer to where the out value // will be stored. - if (vt == VT_INT) { + switch (vt) { + case VT_INT: // IDispatch::Invoke returns DISP_E_TYPEMISMATCH on // VT_INT | VT_BYREF parameters. vt = VT_I4; - } else if (vt == VT_USERDEFINED) { + break; + + case VT_UINT: + // IDispatch::Invoke returns DISP_E_TYPEMISMATCH on + // VT_UINT | VT_BYREF parameters. + vt = VT_UI4; + break; + + case VT_USERDEFINED: // Assume user defined types derive from IUnknown. vt = VT_UNKNOWN; + break; } if (vt == VT_SAFEARRAY) { @@ -81,7 +91,7 @@ TypedArguments::initArgument ( // If the argument is an interface pointer, increment its reference // count because the _variant_t destructor will release it. - value.toVariant( + value.toNativeValue( &m_outValues[argIndex], parameter.type(), interp, true); } else { if (vt == VT_UNKNOWN) { @@ -103,7 +113,8 @@ TypedArguments::initArgument ( } else { // If the argument is an interface pointer, increment its reference // count because the _variant_t destructor will release it. - argument.toVariant(&m_args[argIndex], parameter.type(), interp, true); + argument.toNativeValue( + &m_args[argIndex], parameter.type(), interp, true); } return TCL_OK; @@ -149,21 +160,22 @@ PositionalArguments::initialize ( } if (method.vararg() && inputCount > 0) { - m_args = new _variant_t[inputCount]; + m_args = new NativeValue[inputCount]; // Convert the arguments actually provided. int inputIndex = 0; int argIndex = inputCount - 1; for (; inputIndex < inputCount; ++inputIndex, --argIndex) { TclObject value(objv[inputIndex]); - value.toVariant(&m_args[argIndex], Type::variant(), interp, true); + value.toNativeValue( + &m_args[argIndex], Type::variant(), interp, true); } paramCount = inputCount; } else if (paramCount > 0) { - m_args = new _variant_t[paramCount]; - m_outValues = new _variant_t[paramCount]; + m_args = new NativeValue[paramCount]; + m_outValues = new NativeValue[paramCount]; int j = paramCount - 1; Method::Parameters::const_iterator p = parameters.begin(); @@ -186,7 +198,7 @@ PositionalArguments::initialize ( if (dispatchFlags == DISPATCH_PROPERTYPUT || dispatchFlags == DISPATCH_PROPERTYPUTREF) { TclObject value = objv[i]; - value.toVariant(&m_args[j], method.type(), interp, true); + value.toNativeValue(&m_args[j], method.type(), interp, true); } } @@ -244,8 +256,8 @@ NamedArguments::initialize ( int cArgs = objc / 2; if (cArgs > 0) { - m_args = new _variant_t[cArgs]; - m_outValues = new _variant_t[cArgs]; + m_args = new NativeValue[cArgs]; + m_outValues = new NativeValue[cArgs]; m_namedDispids = new DISPID[cArgs]; int j = cArgs - 1; @@ -284,7 +296,7 @@ UntypedArguments::initialize ( WORD dispatchFlags) { if (objc > 0) { - m_args = new _variant_t[objc]; + m_args = new NativeValue[objc]; int j = objc - 1; for (int i = 0; i < objc; ++i, --j) { @@ -292,7 +304,7 @@ UntypedArguments::initialize ( // If the argument is an interface pointer, increment its reference // count because the _variant_t destructor will release it. - value.toVariant(&m_args[j], Type::variant(), interp, true); + value.toNativeValue(&m_args[j], Type::variant(), interp, true); } } diff --git a/src/Arguments.h b/src/Arguments.h index 50e57f9..fbbea6e 100644 --- a/src/Arguments.h +++ b/src/Arguments.h @@ -1,8 +1,9 @@ -// $Id: Arguments.h,v 1.8 2001/10/13 17:56:14 Administrator Exp $ +// $Id: Arguments.h 5 2005-02-16 14:57:24Z cthuang $ #ifndef ARGUMENTS_H #define ARGUMENTS_H #include "TypeInfo.h" +#include "NativeValue.h" class Arguments { @@ -10,7 +11,7 @@ protected: DISPPARAMS m_dispParams; // argument values - _variant_t *m_args; + NativeValue *m_args; Arguments(); @@ -29,7 +30,7 @@ class TypedArguments: public Arguments { protected: // used to hold values returned from out parameters - _variant_t *m_outValues; + NativeValue *m_outValues; TypedArguments(); diff --git a/src/ComModule.cpp b/src/ComModule.cpp index 9ff5224..f4b18ad 100644 --- a/src/ComModule.cpp +++ b/src/ComModule.cpp @@ -1,4 +1,4 @@ -// $Id: ComModule.cpp,v 1.15 2002/05/31 04:03:06 cthuang Exp $ +// $Id: ComModule.cpp 5 2005-02-16 14:57:24Z cthuang $ #pragma warning(disable: 4786) #include "ComObjectFactory.h" #include "ComModule.h" diff --git a/src/ComModule.h b/src/ComModule.h index 21816f4..8a7abed 100644 --- a/src/ComModule.h +++ b/src/ComModule.h @@ -1,4 +1,4 @@ -// $Id: ComModule.h,v 1.13 2002/04/13 03:53:56 cthuang Exp $ +// $Id: ComModule.h 5 2005-02-16 14:57:24Z cthuang $ #ifndef COMMODULE_H #define COMMODULE_H diff --git a/src/ComObject.cpp b/src/ComObject.cpp index beb4e9b..89e693e 100644 --- a/src/ComObject.cpp +++ b/src/ComObject.cpp @@ -1,9 +1,12 @@ -// $Id: ComObject.cpp,v 1.41 2003/04/04 23:55:04 cthuang Exp $ +// $Id: ComObject.cpp 13 2005-04-18 12:24:14Z cthuang $ #pragma warning(disable: 4786) #include "ComObject.h" #include #include "ComModule.h" +#include "DispatchAdapter.h" +#ifdef TCOM_VTBL_SERVER #include "InterfaceAdapter.h" +#endif #include "Reference.h" #include "Extension.h" @@ -76,10 +79,16 @@ ComObject::registerActiveObject (REFCLSID clsid) m_registeredActiveObject = true; } -InterfaceAdapter * +void * ComObject::implementInterface (const Interface &interfaceDesc) { - InterfaceAdapter *pAdapter = new InterfaceAdapter(*this, interfaceDesc); + void *pAdapter = +#ifdef TCOM_VTBL_SERVER + new InterfaceAdapter(*this, interfaceDesc); +#else + new DispatchAdapter(*this, interfaceDesc); +#endif + m_iidToAdapterMap.insert(interfaceDesc.iid(), pAdapter); return pAdapter; } @@ -203,7 +212,7 @@ ComObject::queryInterface (REFIID iid, void **ppvObj) if (IsEqualIID(iid, IID_IDispatch)) { // Expose the operations of the default interface through IDispatch. if (m_pDispatch == 0) { - m_pDispatch = new InterfaceAdapter(*this, m_defaultInterface, true); + m_pDispatch = new DispatchAdapter(*this, m_defaultInterface); } *ppvObj = m_pDispatch; addRef(); @@ -216,7 +225,7 @@ ComObject::queryInterface (REFIID iid, void **ppvObj) return S_OK; } - InterfaceAdapter *pAdapter = m_iidToAdapterMap.find(iid); + void *pAdapter = m_iidToAdapterMap.find(iid); if (pAdapter == 0) { const Interface *pInterface = m_supportedInterfaceMap.find(iid); if (pInterface != 0) { @@ -364,14 +373,22 @@ putOutVariant (Tcl_Interp *interp, } break; + case VT_SAFEARRAY: + if (*V_ARRAYREF(pDest) != 0) { + SafeArrayDestroy(*V_ARRAYREF(pDest)); + } + *V_ARRAYREF(pDest) = + tclObject.getSafeArray(type.elementType(), interp); + break; + default: *V_I4REF(pDest) = tclObject.getLong(); } } HRESULT -ComObject::invoke (InterfaceAdapter *pAdapter, - DISPID dispid, +ComObject::invoke (const Method &method, + bool isProperty, REFIID /*riid*/, LCID /*lcid*/, WORD wFlags, @@ -380,11 +397,6 @@ ComObject::invoke (InterfaceAdapter *pAdapter, EXCEPINFO *pExcepInfo, UINT *pArgErr) { - // Get the method description for method being invoked. - const Method *pMethod = pAdapter->findDispatchMethod(dispid); - if (pMethod == 0) { - return DISP_E_MEMBERNOTFOUND; - } HRESULT hresult; @@ -394,15 +406,14 @@ ComObject::invoke (InterfaceAdapter *pAdapter, // Get the method or property to invoke on the servant. std::string operation; - if ((wFlags & DISPATCH_PROPERTYGET) != 0 - && pAdapter->isProperty(dispid)) { - operation = getPrefix + pMethod->name(); + if ((wFlags & DISPATCH_PROPERTYGET) != 0 && isProperty) { + operation = getPrefix + method.name(); } else if (wFlags & (DISPATCH_PROPERTYPUT | DISPATCH_PROPERTYPUTREF)) { - operation = setPrefix + pMethod->name(); + operation = setPrefix + method.name(); } else if (wFlags & DISPATCH_METHOD) { - operation = pMethod->name(); + operation = method.name(); } else { return DISP_E_MEMBERNOTFOUND; @@ -420,7 +431,7 @@ ComObject::invoke (InterfaceAdapter *pAdapter, // Convert arguments to Tcl values. // TODO: Should handle named arguments differently than positional // arguments. - const Method::Parameters ¶meters = pMethod->parameters(); + const Method::Parameters ¶meters = method.parameters(); int argIndex = pDispParams->cArgs - 1; Method::Parameters::const_iterator pParam; @@ -440,7 +451,7 @@ ComObject::invoke (InterfaceAdapter *pAdapter, if (wFlags & (DISPATCH_PROPERTYPUT | DISPATCH_PROPERTYPUTREF)) { VARIANT *pArg = &(pDispParams->rgvarg[argIndex]); try { - TclObject value(pArg, pMethod->type(), m_interp); + TclObject value(pArg, method.type(), m_interp); script.lappend(value); } catch (_com_error &) { @@ -474,27 +485,24 @@ ComObject::invoke (InterfaceAdapter *pAdapter, argIndex = pDispParams->cArgs - 1; for (pParam = parameters.begin(); pParam != parameters.end(); ++pParam, --argIndex) { - if (pParam->flags() & PARAMFLAG_FOUT) { + VARIANT *pArg = &(pDispParams->rgvarg[argIndex]); + if ((pParam->flags() & PARAMFLAG_FOUT) && (V_VT(pArg) & VT_BYREF)) { // Get name of Tcl variable that holds out value. TclObject varName = getOutVariableName(*pParam); // Copy variable value to out argument. TclObject value; if (getVariable(varName, value) == TCL_OK) { - putOutVariant( - m_interp, - &pDispParams->rgvarg[argIndex], - value, - pParam->type()); + putOutVariant(m_interp, pArg, value, pParam->type()); } } } // Convert return value. - if (pReturnValue != 0 && pMethod->type().vartype() != VT_VOID) { + if (pReturnValue != 0 && method.type().vartype() != VT_VOID) { // Must increment reference count of interface pointers returned // from methods. - result.toVariant(pReturnValue, pMethod->type(), m_interp, true); + result.toVariant(pReturnValue, method.type(), m_interp, true); } } catch (_com_error &e) { @@ -504,6 +512,8 @@ ComObject::invoke (InterfaceAdapter *pAdapter, return hresult; } +#ifdef TCOM_VTBL_SERVER + // Convert the native value that the va_list points to into a Tcl object. // Returns a va_list pointing to the next argument. @@ -584,6 +594,13 @@ convertNativeToTclObject (va_list pArg, interp); break; + case VT_SAFEARRAY: + tclObject = TclObject( + byRef ? *va_arg(pArg, SAFEARRAY **) : va_arg(pArg, SAFEARRAY *), + type, + interp); + break; + default: tclObject = Tcl_NewLongObj( byRef ? *va_arg(pArg, int *) : va_arg(pArg, int)); @@ -703,6 +720,11 @@ putArgument (va_list pArg, } break; + case VT_SAFEARRAY: + *static_cast(pDest) = + tclObject.getSafeArray(type.elementType(), interp); + break; + default: *static_cast(pDest) = tclObject.getLong(); } @@ -870,3 +892,5 @@ invokeComObjectFunction (volatile HRESULT hresult, va_end(pArg); } + +#endif diff --git a/src/ComObject.h b/src/ComObject.h index 3868e2f..386d132 100644 --- a/src/ComObject.h +++ b/src/ComObject.h @@ -1,4 +1,4 @@ -// $Id: ComObject.h,v 1.15 2002/10/22 22:07:55 cthuang Exp $ +// $Id: ComObject.h 13 2005-04-18 12:24:14Z cthuang $ #ifndef COMOBJECT_H #define COMOBJECT_H @@ -49,17 +49,17 @@ class TCOM_API ComObject SupportedInterfaceMap m_supportedInterfaceMap; // collection of implemented interface adapters - typedef HashTable IidToAdapterMap; + typedef HashTable IidToAdapterMap; IidToAdapterMap m_iidToAdapterMap; // implements default interface - InterfaceAdapter *m_pDefaultAdapter; + void *m_pDefaultAdapter; // implements ISupportErrorInfo SupportErrorInfo m_supportErrorInfo; // implements IDispatch - InterfaceAdapter *m_pDispatch; + void *m_pDispatch; // token returned from RegisterActiveObject unsigned long m_activeObjectHandle; @@ -81,7 +81,7 @@ class TCOM_API ComObject void operator=(const ComObject &); // not implemented // Create an adapter which implements the specified interface. - InterfaceAdapter *implementInterface(const Interface &interfaceDesc); + void *implementInterface(const Interface &interfaceDesc); // Convert IDispatch argument to Tcl value. TclObject getArgument(VARIANT *pArg, const Parameter ¶m); @@ -136,15 +136,15 @@ public: // IDispatch implementation HRESULT invoke( - InterfaceAdapter *pThis, - DISPID dispidMember, - REFIID riid, + const Method &method, + bool isProperty, + REFIID iid, LCID lcid, WORD wFlags, - DISPPARAMS *pdispparams, - VARIANT *pvarResult, - EXCEPINFO *pexcepinfo, - UINT *puArgErr); + DISPPARAMS *pDispParams, + VARIANT *pReturnValue, + EXCEPINFO *pExcepInfo, + UINT *pArgErr); }; #endif diff --git a/src/ComObjectFactory.cpp b/src/ComObjectFactory.cpp index 8176be5..710f261 100644 --- a/src/ComObjectFactory.cpp +++ b/src/ComObjectFactory.cpp @@ -1,4 +1,4 @@ -// $Id: ComObjectFactory.cpp,v 1.17 2002/05/31 04:03:06 cthuang Exp $ +// $Id: ComObjectFactory.cpp 5 2005-02-16 14:57:24Z cthuang $ #pragma warning(disable: 4786) #include "ComModule.h" #include "ComObject.h" diff --git a/src/ComObjectFactory.h b/src/ComObjectFactory.h index 6bf8e14..6726813 100644 --- a/src/ComObjectFactory.h +++ b/src/ComObjectFactory.h @@ -1,4 +1,4 @@ -// $Id: ComObjectFactory.h,v 1.11 2002/04/13 03:53:56 cthuang Exp $ +// $Id: ComObjectFactory.h 5 2005-02-16 14:57:24Z cthuang $ #ifndef COMOBJECTFACTORY_H #define COMOBJECTFACTORY_H diff --git a/src/DispatchAdapter.cpp b/src/DispatchAdapter.cpp new file mode 100644 index 0000000..9459c7f --- /dev/null +++ b/src/DispatchAdapter.cpp @@ -0,0 +1,84 @@ +// $Id: DispatchAdapter.cpp 14 2005-04-18 14:14:12Z cthuang $ +#pragma warning(disable: 4786) +#include "DispatchAdapter.h" +#include +#include "ComObject.h" +#include "Reference.h" +#include "Extension.h" + +// Implement IUnknown methods + +STDMETHODIMP +DispatchAdapter::QueryInterface (REFIID iid, void **ppvObj) +{ + return m_dispatchImpl.object().queryInterface(iid, ppvObj); +} + +STDMETHODIMP_(ULONG) +DispatchAdapter::AddRef () +{ + return m_dispatchImpl.object().addRef(); +} + +STDMETHODIMP_(ULONG) +DispatchAdapter::Release () +{ + return m_dispatchImpl.object().release(); +} + +// Implement IDispatch methods + +STDMETHODIMP +DispatchAdapter::GetTypeInfoCount (UINT *pCount) +{ + *pCount = 1; + return S_OK; +} + +STDMETHODIMP +DispatchAdapter::GetTypeInfo (UINT index, LCID, ITypeInfo **ppTypeInfo) +{ + if (index != 0) { + *ppTypeInfo = 0; + return DISP_E_BADINDEX; + } + + ITypeInfo *pTypeInfo = m_dispatchImpl.typeInfo(); + pTypeInfo->AddRef(); + *ppTypeInfo = pTypeInfo; + return S_OK; +} + +STDMETHODIMP +DispatchAdapter::GetIDsOfNames ( + REFIID, + OLECHAR **rgszNames, + UINT cNames, + LCID, + DISPID *rgDispId) +{ + ITypeInfo *pTypeInfo = m_dispatchImpl.typeInfo(); + return pTypeInfo->GetIDsOfNames(rgszNames, cNames, rgDispId); +} + +STDMETHODIMP +DispatchAdapter::Invoke ( + DISPID dispid, + REFIID iid, + LCID lcid, + WORD wFlags, + DISPPARAMS *pDispParams, + VARIANT *pReturnValue, + EXCEPINFO *pExcepInfo, + UINT *pArgErr) +{ + return m_dispatchImpl.invoke( + dispid, + iid, + lcid, + wFlags, + pDispParams, + pReturnValue, + pExcepInfo, + pArgErr); +} diff --git a/src/DispatchAdapter.h b/src/DispatchAdapter.h new file mode 100644 index 0000000..f09544a --- /dev/null +++ b/src/DispatchAdapter.h @@ -0,0 +1,52 @@ +// $Id: DispatchAdapter.h 14 2005-04-18 14:14:12Z cthuang $ +#ifndef DISPATCHADAPTER_H +#define DISPATCHADAPTER_H + +#include "tcomApi.h" +#include "DispatchImpl.h" + +// This class implements an IDispatch interface and delegates the operations to +// the ComObject class. + +class TCOM_API DispatchAdapter: public IDispatch +{ + // provides IDispatch implementation + DispatchImpl m_dispatchImpl; + + // not implemented + DispatchAdapter(const DispatchAdapter &); + void operator=(const DispatchAdapter &); + +public: + DispatchAdapter ( + ComObject &object, + const Interface &interfaceDesc): + m_dispatchImpl(object, interfaceDesc) + { } + + // IUnknown functions + STDMETHODIMP QueryInterface(REFIID iid, void **ppvObj); + STDMETHODIMP_(ULONG) AddRef(); + STDMETHODIMP_(ULONG) Release(); + + // IDispatch functions + STDMETHODIMP GetTypeInfoCount(UINT *pctinfo); + STDMETHODIMP GetTypeInfo(UINT itinfo, LCID lcid, ITypeInfo **pptinfo); + STDMETHODIMP GetIDsOfNames( + REFIID iid, + OLECHAR **rgszNames, + UINT cNames, + LCID lcid, + DISPID *rgdispid); + STDMETHODIMP Invoke( + DISPID dispidMember, + REFIID iid, + LCID lcid, + WORD flags, + DISPPARAMS *pParams, + VARIANT *pResult, + EXCEPINFO *pExcepInfo, + UINT *pArgErr); +}; + +#endif diff --git a/src/DispatchImpl.cpp b/src/DispatchImpl.cpp new file mode 100644 index 0000000..02f544b --- /dev/null +++ b/src/DispatchImpl.cpp @@ -0,0 +1,66 @@ +// $Id: DispatchImpl.cpp 14 2005-04-18 14:14:12Z cthuang $ +#pragma warning(disable: 4786) +#include "DispatchImpl.h" +#include +#include "ComObject.h" + +DispatchImpl::DispatchImpl ( + ComObject &object, + const Interface &interfaceDesc): + m_object(object), + m_interface(interfaceDesc) +{ + // Initialize dispatch member ID to method description map. + const Interface::Methods &methods = m_interface.methods(); + for (Interface::Methods::const_iterator pMethod = methods.begin(); + pMethod != methods.end(); ++pMethod) { + m_dispIdToMethodMap.insert(DispIdToMethodMap::value_type( + pMethod->memberid(), &(*pMethod))); + } + + // Initialize set of property dispatch member ID's. + const Interface::Properties &properties = m_interface.properties(); + for (Interface::Properties::const_iterator pProp = properties.begin(); + pProp != properties.end(); ++pProp) { + m_propertyDispIds.insert(pProp->memberid()); + } +} + +const Method * +DispatchImpl::findDispatchMethod (DISPID dispid) +{ + DispIdToMethodMap::const_iterator p = m_dispIdToMethodMap.find(dispid); + if (p == m_dispIdToMethodMap.end()) { + return 0; + } + return p->second; +} + +HRESULT +DispatchImpl::invoke ( + DISPID dispid, + REFIID iid, + LCID lcid, + WORD wFlags, + DISPPARAMS *pDispParams, + VARIANT *pReturnValue, + EXCEPINFO *pExcepInfo, + UINT *pArgErr) +{ + // Get the method description for method being invoked. + const Method *pMethod = findDispatchMethod(dispid); + if (pMethod == 0) { + return DISP_E_MEMBERNOTFOUND; + } + + return m_object.invoke( + *pMethod, + isProperty(dispid), + iid, + lcid, + wFlags, + pDispParams, + pReturnValue, + pExcepInfo, + pArgErr); +} diff --git a/src/DispatchImpl.h b/src/DispatchImpl.h new file mode 100644 index 0000000..275d436 --- /dev/null +++ b/src/DispatchImpl.h @@ -0,0 +1,67 @@ +// $Id: DispatchImpl.h 14 2005-04-18 14:14:12Z cthuang $ +#ifndef DISPATCHIMPL_H +#define DISPATCHIMPL_H + +#include +#include +#include "tcomApi.h" +#include "TypeInfo.h" + +class TCOM_API ComObject; + +// This class implements an IDispatch interface and delegates the operations to +// the ComObject class. + +class TCOM_API DispatchImpl +{ + // delegate operations to this object + ComObject &m_object; + + // description of the interface to implement + const Interface &m_interface; + + // dispatch member ID to method description map + typedef std::map DispIdToMethodMap; + DispIdToMethodMap m_dispIdToMethodMap; + + // dispatch member ID's which are actually properties + typedef std::set DispIdSet; + DispIdSet m_propertyDispIds; + + // not implemented + DispatchImpl(const DispatchImpl &); + void operator=(const DispatchImpl &); + + // Get dispatch method description. + const Method *findDispatchMethod(DISPID dispid); + + // Return true if the dispatch member ID identifies a property. + bool isProperty (DISPID dispid) const + { return m_propertyDispIds.count(dispid) != 0; } + +public: + DispatchImpl( + ComObject &object, + const Interface &interfaceDesc); + + // Get object for delegating operations. + ComObject &object () const + { return m_object; } + + // Get ITypeInfo for the interface that is implemented. + ITypeInfo *typeInfo () const + { return m_interface.typeInfo(); } + + // Implement IDispatch::Invoke function. + HRESULT invoke( + DISPID dispidMember, + REFIID iid, + LCID lcid, + WORD flags, + DISPPARAMS *pParams, + VARIANT *pResult, + EXCEPINFO *pExcepInfo, + UINT *pArgErr); +}; + +#endif diff --git a/src/Extension.cpp b/src/Extension.cpp index 85d4abe..01c2037 100644 --- a/src/Extension.cpp +++ b/src/Extension.cpp @@ -1,4 +1,4 @@ -// $Id: Extension.cpp,v 1.3 2003/04/02 22:46:51 cthuang Exp $ +// $Id: Extension.cpp 5 2005-02-16 14:57:24Z cthuang $ #pragma warning(disable: 4786) #include "Extension.h" #include "ComModule.h" diff --git a/src/Extension.h b/src/Extension.h index 7eb7116..a354e98 100644 --- a/src/Extension.h +++ b/src/Extension.h @@ -1,4 +1,4 @@ -// $Id: Extension.h,v 1.5 2003/04/02 22:46:51 cthuang Exp $ +// $Id: Extension.h 5 2005-02-16 14:57:24Z cthuang $ #ifndef EXTENSION_H #define EXTENSION_H diff --git a/src/HandleSupport.cpp b/src/HandleSupport.cpp index d4d75df..a1a5d52 100644 --- a/src/HandleSupport.cpp +++ b/src/HandleSupport.cpp @@ -1,4 +1,4 @@ -// $Id: HandleSupport.cpp,v 1.19 2003/07/17 22:33:31 cthuang Exp $ +// $Id: HandleSupport.cpp 5 2005-02-16 14:57:24Z cthuang $ #include "HandleSupport.h" #include #include "ThreadLocalStorage.h" diff --git a/src/HandleSupport.h b/src/HandleSupport.h index d96a1fb..d3a8d2d 100644 --- a/src/HandleSupport.h +++ b/src/HandleSupport.h @@ -1,4 +1,4 @@ -// $Id: HandleSupport.h,v 1.29 2003/07/17 22:33:31 cthuang Exp $ +// $Id: HandleSupport.h 5 2005-02-16 14:57:24Z cthuang $ #ifndef HANDLESUPPORT_H #define HANDLESUPPORT_H diff --git a/src/HashTable.h b/src/HashTable.h index 120b029..25f6949 100644 --- a/src/HashTable.h +++ b/src/HashTable.h @@ -1,4 +1,4 @@ -// $Id: HashTable.h,v 1.22 2003/07/17 22:33:31 cthuang Exp $ +// $Id: HashTable.h 5 2005-02-16 14:57:24Z cthuang $ #ifndef HASHTABLE_H #define HASHTABLE_H diff --git a/src/InterfaceAdapter.cpp b/src/InterfaceAdapter.cpp index f1117e3..1b644f2 100644 --- a/src/InterfaceAdapter.cpp +++ b/src/InterfaceAdapter.cpp @@ -1,43 +1,28 @@ -// $Id: InterfaceAdapter.cpp,v 1.3 2002/02/27 01:58:45 cthuang Exp $ +// $Id: InterfaceAdapter.cpp 16 2005-04-19 14:47:52Z cthuang $ +#ifdef TCOM_VTBL_SERVER + #pragma warning(disable: 4786) -#include "ComObject.h" #include "InterfaceAdapter.h" +#include "ComObject.h" InterfaceAdapter::InterfaceAdapter ( ComObject &object, const Interface &interfaceDesc, bool forceDispatch): - m_object(object), - m_interface(interfaceDesc) + m_dispatchImpl(object, interfaceDesc) { // Initialize virtual function index to method description map. - const Interface::Methods &methods = m_interface.methods(); + const Interface::Methods &methods = interfaceDesc.methods(); for (Interface::Methods::const_iterator p = methods.begin(); p != methods.end(); ++p) { m_vtblIndexToMethodMap.insert(VtblIndexToMethodMap::value_type( p->vtblIndex(), &(*p))); } - if (m_interface.dispatchable() || forceDispatch) { - m_pVtbl = dispatchVtbl; - - // Initialize dispatch member ID to method description map. - const Interface::Methods &methods = m_interface.methods(); - for (Interface::Methods::const_iterator pMethod = methods.begin(); - pMethod != methods.end(); ++pMethod) { - m_dispIdToMethodMap.insert(DispIdToMethodMap::value_type( - pMethod->memberid(), &(*pMethod))); - } - - // Initialize set of property dispatch member ID's. - const Interface::Properties &properties = m_interface.properties(); - for (Interface::Properties::const_iterator pProp = properties.begin(); - pProp != properties.end(); ++pProp) { - m_propertyDispIds.insert(pProp->memberid()); - } - + if (interfaceDesc.dispatchable() || forceDispatch) { + m_pVtbl = dualVtbl; } else { - m_pVtbl = unknownVtbl; + m_pVtbl = customVtbl; } } @@ -52,35 +37,25 @@ InterfaceAdapter::findComMethod (int funcIndex) return p->second; } -const Method * -InterfaceAdapter::findDispatchMethod (DISPID dispid) -{ - DispIdToMethodMap::const_iterator p = m_dispIdToMethodMap.find(dispid); - if (p == m_dispIdToMethodMap.end()) { - return 0; - } - return p->second; -} - // Implement IUnknown methods STDMETHODIMP InterfaceAdapter::QueryInterface ( InterfaceAdapter *pThis, REFIID iid, void **ppvObj) { - return pThis->m_object.queryInterface(iid, ppvObj); + return pThis->m_dispatchImpl.object().queryInterface(iid, ppvObj); } STDMETHODIMP_(ULONG) InterfaceAdapter::AddRef (InterfaceAdapter *pThis) { - return pThis->m_object.addRef(); + return pThis->m_dispatchImpl.object().addRef(); } STDMETHODIMP_(ULONG) InterfaceAdapter::Release (InterfaceAdapter *pThis) { - return pThis->m_object.release(); + return pThis->m_dispatchImpl.object().release(); } // Implement IDispatch methods @@ -101,7 +76,7 @@ InterfaceAdapter::GetTypeInfo ( return DISP_E_BADINDEX; } - ITypeInfo *pTypeInfo = pThis->m_interface.typeInfo(); + ITypeInfo *pTypeInfo = pThis->m_dispatchImpl.typeInfo(); pTypeInfo->AddRef(); *ppTypeInfo = pTypeInfo; return S_OK; @@ -116,7 +91,7 @@ InterfaceAdapter::GetIDsOfNames ( LCID, DISPID *rgDispId) { - ITypeInfo *pTypeInfo = pThis->m_interface.typeInfo(); + ITypeInfo *pTypeInfo = pThis->m_dispatchImpl.typeInfo(); return pTypeInfo->GetIDsOfNames(rgszNames, cNames, rgDispId); } @@ -132,8 +107,7 @@ InterfaceAdapter::Invoke ( EXCEPINFO *pExcepInfo, UINT *pArgErr) { - return pThis->m_object.invoke( - pThis, + return pThis->m_dispatchImpl.invoke( dispid, iid, lcid, @@ -143,3 +117,5 @@ InterfaceAdapter::Invoke ( pExcepInfo, pArgErr); } + +#endif diff --git a/src/InterfaceAdapter.h b/src/InterfaceAdapter.h index 19bc8e0..6d6b330 100644 --- a/src/InterfaceAdapter.h +++ b/src/InterfaceAdapter.h @@ -1,11 +1,11 @@ -// $Id: InterfaceAdapter.h,v 1.3 2002/02/27 01:58:45 cthuang Exp $ +// $Id: InterfaceAdapter.h 16 2005-04-19 14:47:52Z cthuang $ #ifndef INTERFACEADAPTER_H #define INTERFACEADAPTER_H #include #include #include "tcomApi.h" -#include "TypeInfo.h" +#include "DispatchImpl.h" class TCOM_API ComObject; @@ -22,31 +22,21 @@ class TCOM_API InterfaceAdapter const void *m_pVtbl; // delegate operations to this object - ComObject &m_object; - - // description of the interface to implement - const Interface &m_interface; + DispatchImpl m_dispatchImpl; // virtual function index to method description map typedef std::map VtblIndexToMethodMap; VtblIndexToMethodMap m_vtblIndexToMethodMap; - // dispatch member ID to method description map - typedef std::map DispIdToMethodMap; - DispIdToMethodMap m_dispIdToMethodMap; - - // dispatch member ID's which are actually properties - typedef std::set DispIdSet; - DispIdSet m_propertyDispIds; - - // virtual function table for IUnknown derived interfaces - static const void *unknownVtbl[]; + // virtual function table for custom (IUnknown derived) interfaces + static const void *customVtbl[]; - // virtual function table for IDispatch derived interfaces - static const void *dispatchVtbl[]; + // virtual function table for dual (IDispatch derived) interfaces + static const void *dualVtbl[]; - InterfaceAdapter(const InterfaceAdapter &); // not implemented - void operator=(const InterfaceAdapter &); // not implemented + // not implemented + InterfaceAdapter(const InterfaceAdapter &); + void operator=(const InterfaceAdapter &); public: InterfaceAdapter( @@ -56,18 +46,11 @@ public: // Get delegate object. ComObject &object () const - { return m_object; } + { return m_dispatchImpl.object(); } // Get COM method description. const Method *findComMethod(int funcIndex); - // Get dispatch method description. - const Method *findDispatchMethod(DISPID dispid); - - // Return true if the dispatch member ID identifies a property. - bool isProperty (DISPID dispid) const - { return m_propertyDispIds.count(dispid) != 0; } - // IUnknown implementation static STDMETHODIMP QueryInterface( InterfaceAdapter *pThis, REFIID iid, void **ppvObj); diff --git a/src/InterfaceAdapterVtbl.cpp b/src/InterfaceAdapterVtbl.cpp index 896f36d..8ab5ce5 100644 --- a/src/InterfaceAdapterVtbl.cpp +++ b/src/InterfaceAdapterVtbl.cpp @@ -1,4 +1,6 @@ -// $Id: InterfaceAdapterVtbl.cpp,v 1.3 2001/10/13 17:56:14 Administrator Exp $ +// $Id: InterfaceAdapterVtbl.cpp 16 2005-04-19 14:47:52Z cthuang $ +#ifdef TCOM_VTBL_SERVER + #pragma warning(disable: 4786) #include "InterfaceAdapter.h" #include "ComObject.h" @@ -1076,7 +1078,7 @@ FUNCTION_ENTRY_POINT(1021) FUNCTION_ENTRY_POINT(1022) FUNCTION_ENTRY_POINT(1023) -const void *InterfaceAdapter::unknownVtbl[] = { +const void *InterfaceAdapter::customVtbl[] = { InterfaceAdapter::QueryInterface, InterfaceAdapter::AddRef, InterfaceAdapter::Release, @@ -2103,7 +2105,7 @@ const void *InterfaceAdapter::unknownVtbl[] = { function_1023 }; -const void *InterfaceAdapter::dispatchVtbl[] = { +const void *InterfaceAdapter::dualVtbl[] = { InterfaceAdapter::QueryInterface, InterfaceAdapter::AddRef, InterfaceAdapter::Release, @@ -3129,3 +3131,5 @@ const void *InterfaceAdapter::dispatchVtbl[] = { function_1022, function_1023 }; + +#endif diff --git a/src/Makefile b/src/Makefile index 9c9c309..5d9375e 100644 --- a/src/Makefile +++ b/src/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.12 2003/07/24 22:46:35 cthuang Exp $ +# $Id: Makefile 5 2005-02-16 14:57:24Z cthuang $ debug: tclsh &&| diff --git a/src/NativeValue.cpp b/src/NativeValue.cpp new file mode 100644 index 0000000..b171e9a --- /dev/null +++ b/src/NativeValue.cpp @@ -0,0 +1,12 @@ +// $Id: NativeValue.cpp 5 2005-02-16 14:57:24Z cthuang $ +#include "NativeValue.h" + +void +NativeValue::fixInvalidVariantType () +{ + if (vt == VT_I8 || vt == VT_UI8) { + // 64-bit integers are not valid VARIANT types. Change the VARIANT + // type to something valid so VariantClear does not return an error. + vt = VT_EMPTY; + } +} diff --git a/src/NativeValue.h b/src/NativeValue.h new file mode 100644 index 0000000..8e8df33 --- /dev/null +++ b/src/NativeValue.h @@ -0,0 +1,25 @@ +// $Id: NativeValue.h 5 2005-02-16 14:57:24Z cthuang $ +#ifndef NATIVEVALUE_H +#define NATIVEVALUE_H + +#include + +// This is a value in the native machine format. + +class NativeValue: public _variant_t +{ +public: + NativeValue () + { } + + ~NativeValue () + { fixInvalidVariantType(); } + + NativeValue &operator= (const _variant_t &rhs) + { _variant_t::operator=(rhs); return *this; } + + // Change the variant type if it is invalid. + void fixInvalidVariantType(); +}; + +#endif diff --git a/src/Reference.cpp b/src/Reference.cpp index 9a7f448..3e21047 100644 --- a/src/Reference.cpp +++ b/src/Reference.cpp @@ -1,4 +1,4 @@ -// $Id: Reference.cpp,v 1.73 2003/11/06 15:29:01 cthuang Exp $ +// $Id: Reference.cpp 5 2005-02-16 14:57:24Z cthuang $ #pragma warning(disable: 4786) #include #include "ComObject.h" @@ -231,6 +231,8 @@ Reference::invokeDispatch ( if (hr == DISP_E_EXCEPTION) { throwDispatchException(excepInfo); + } else if (hr == DISP_E_TYPEMISMATCH || hr == DISP_E_PARAMNOTFOUND) { + throw InvokeException(hr, pParams->cArgs - argErr); } return hr; @@ -264,6 +266,8 @@ Reference::invoke (MEMBERID memberid, if (hr == DISP_E_EXCEPTION) { throwDispatchException(excepInfo); + } else if (hr == DISP_E_TYPEMISMATCH || hr == DISP_E_PARAMNOTFOUND) { + throw InvokeException(hr, arguments.dispParams()->cArgs - argErr); } } diff --git a/src/Reference.h b/src/Reference.h index fc46931..003b8f1 100644 --- a/src/Reference.h +++ b/src/Reference.h @@ -1,4 +1,4 @@ -// $Id: Reference.h,v 1.42 2003/11/06 15:29:01 cthuang Exp $ +// $Id: Reference.h 5 2005-02-16 14:57:24Z cthuang $ #ifndef REFERENCE_H #define REFERENCE_H @@ -29,6 +29,26 @@ public: { return m_description; } }; +// Throw this exception when invoke returns error about an argument. + +class InvokeException +{ + HRESULT m_hresult; + unsigned m_argIndex; + +public: + InvokeException (HRESULT hresult, unsigned argIndex): + m_hresult(hresult), + m_argIndex(argIndex) + { } + + HRESULT hresult () const + { return m_hresult; } + + unsigned argIndex () const + { return m_argIndex; } +}; + // This class holds an interface pointer and the interface description needed // to invoke methods on it. diff --git a/src/RegistryKey.cpp b/src/RegistryKey.cpp index 4a9f3be..02aeb7a 100644 --- a/src/RegistryKey.cpp +++ b/src/RegistryKey.cpp @@ -1,4 +1,4 @@ -// $Id: RegistryKey.cpp,v 1.6 2001/11/28 16:10:57 cthuang Exp $ +// $Id: RegistryKey.cpp 5 2005-02-16 14:57:24Z cthuang $ #include "RegistryKey.h" void diff --git a/src/RegistryKey.h b/src/RegistryKey.h index e1b06da..819ae6d 100644 --- a/src/RegistryKey.h +++ b/src/RegistryKey.h @@ -1,4 +1,4 @@ -// $Id: RegistryKey.h,v 1.5 2001/11/28 16:10:57 cthuang Exp $ +// $Id: RegistryKey.h 5 2005-02-16 14:57:24Z cthuang $ #ifndef REGISTRYKEY_H #define REGISTRYKEY_H diff --git a/src/Singleton.h b/src/Singleton.h index 7a6543a..078d93d 100644 --- a/src/Singleton.h +++ b/src/Singleton.h @@ -1,4 +1,4 @@ -// $Id: Singleton.h,v 1.9 2002/04/13 03:53:56 cthuang Exp $ +// $Id: Singleton.h 5 2005-02-16 14:57:24Z cthuang $ #ifndef SINGLETON_H #define SINGLETON_H diff --git a/src/SupportErrorInfo.cpp b/src/SupportErrorInfo.cpp index e2dd645..a8e132c 100644 --- a/src/SupportErrorInfo.cpp +++ b/src/SupportErrorInfo.cpp @@ -1,4 +1,4 @@ -// $Id: SupportErrorInfo.cpp,v 1.3 2001/07/17 02:24:08 cthuang Exp $ +// $Id: SupportErrorInfo.cpp 5 2005-02-16 14:57:24Z cthuang $ #include "ComObject.h" #include "SupportErrorInfo.h" diff --git a/src/SupportErrorInfo.h b/src/SupportErrorInfo.h index 40d94b5..806049f 100644 --- a/src/SupportErrorInfo.h +++ b/src/SupportErrorInfo.h @@ -1,4 +1,4 @@ -// $Id: SupportErrorInfo.h,v 1.3 2001/07/17 02:24:08 cthuang Exp $ +// $Id: SupportErrorInfo.h 5 2005-02-16 14:57:24Z cthuang $ #ifndef SUPPORTERRORINFO_H #define SUPPORTERRORINFO_H diff --git a/src/TclInterp.cpp b/src/TclInterp.cpp index 0a2f93a..6e9aa0d 100644 --- a/src/TclInterp.cpp +++ b/src/TclInterp.cpp @@ -1,4 +1,4 @@ -// $Id: TclInterp.cpp,v 1.12 2002/04/13 03:53:56 cthuang Exp $ +// $Id: TclInterp.cpp 5 2005-02-16 14:57:24Z cthuang $ #include #include "RegistryKey.h" #include "TclObject.h" diff --git a/src/TclInterp.h b/src/TclInterp.h index bbfa522..350695c 100644 --- a/src/TclInterp.h +++ b/src/TclInterp.h @@ -1,4 +1,4 @@ -// $Id: TclInterp.h,v 1.8 2002/04/13 03:53:56 cthuang Exp $ +// $Id: TclInterp.h 5 2005-02-16 14:57:24Z cthuang $ #ifndef TCLINTERP_H #define TCLINTERP_H diff --git a/src/TclModule.cpp b/src/TclModule.cpp index 3a4f05c..7c85136 100644 --- a/src/TclModule.cpp +++ b/src/TclModule.cpp @@ -1,4 +1,4 @@ -// $Id: TclModule.cpp,v 1.5 2002/04/13 03:53:56 cthuang Exp $ +// $Id: TclModule.cpp 5 2005-02-16 14:57:24Z cthuang $ #pragma warning(disable: 4786) #include "TclObject.h" #include "TclModule.h" diff --git a/src/TclModule.h b/src/TclModule.h index af95d6b..3709765 100644 --- a/src/TclModule.h +++ b/src/TclModule.h @@ -1,4 +1,4 @@ -// $Id: TclModule.h,v 1.4 2002/04/13 03:53:56 cthuang Exp $ +// $Id: TclModule.h 5 2005-02-16 14:57:24Z cthuang $ #ifndef TCLMODULE_H #define TCLMODULE_H diff --git a/src/TclObject.cpp b/src/TclObject.cpp index 8c24d8a..2a924b6 100644 --- a/src/TclObject.cpp +++ b/src/TclObject.cpp @@ -1,4 +1,4 @@ -// $Id: TclObject.cpp,v 1.35 2003/05/12 23:30:43 cthuang Exp $ +// $Id: TclObject.cpp 18 2005-05-03 00:40:40Z cthuang $ #include "TclObject.h" #include #ifdef WIN32 @@ -158,7 +158,7 @@ TclObject::lappend (Tcl_Obj *pElement) static Tcl_Obj * convertFromSafeArray ( SAFEARRAY *psa, - VARTYPE vt, + VARTYPE elementType, unsigned dim, long *pIndices, const Type &type, @@ -185,14 +185,14 @@ convertFromSafeArray ( pResult = Tcl_NewListObj(0, 0); for (long i = lowerBound; i <= upperBound; ++i) { pIndices[dim - 1] = i; - Tcl_Obj *pElement = - convertFromSafeArray(psa, vt, dim + 1, pIndices, type, interp); + Tcl_Obj *pElement = convertFromSafeArray( + psa, elementType, dim + 1, pIndices, type, interp); Tcl_ListObjAppendElement(interp, pResult, pElement); } return pResult; } - if (vt == VT_UI1 && SafeArrayGetDim(psa) == 1) { + if (elementType == VT_UI1 && SafeArrayGetDim(psa) == 1) { unsigned char *pData; hr = SafeArrayAccessData(psa, reinterpret_cast(&pData)); if (FAILED(hr)) { @@ -218,14 +218,14 @@ convertFromSafeArray ( // Create list of Tcl values. pResult = Tcl_NewListObj(0, 0); for (long i = lowerBound; i <= upperBound; ++i) { - _variant_t elementVar; + NativeValue elementVar; pIndices[dim - 1] = i; - if (vt == VT_VARIANT) { + if (elementType == VT_VARIANT) { hr = SafeArrayGetElement(psa, pIndices, &elementVar); } else { // I hope the element can be contained in a VARIANT. - V_VT(&elementVar) = vt; + V_VT(&elementVar) = elementType; hr = SafeArrayGetElement(psa, pIndices, &elementVar.punkVal); } if (FAILED(hr)) { @@ -284,8 +284,8 @@ fillSafeArray ( } else { for (int i = 0; i < numElements; ++i) { TclObject element(pElements[i]); - _variant_t elementVar; - element.toVariant(&elementVar, Type::variant(), interp, addRef); + NativeValue elementVar; + element.toNativeValue(&elementVar, Type::variant(), interp, addRef); pIndices[dim1] = i; hr = SafeArrayPutElement(psa, pIndices, &elementVar); @@ -296,15 +296,28 @@ fillSafeArray ( } } +static Tcl_Obj * +convertFromUnknown (IUnknown *pUnknown, REFIID iid, Tcl_Interp *interp) +{ + if (pUnknown == 0) { + return Tcl_NewObj(); + } + + const Interface *pInterface = InterfaceManager::instance().find(iid); + return Extension::referenceHandles.newObj( + interp, + Reference::newReference(pUnknown, pInterface)); +} + TclObject::TclObject (VARIANT *pSrc, const Type &type, Tcl_Interp *interp) { - if (V_VT(pSrc) & VT_ARRAY) { - SAFEARRAY *psa = V_ARRAY(pSrc); - VARTYPE vt = V_VT(pSrc) & VT_TYPEMASK; + if (V_ISARRAY(pSrc)) { + SAFEARRAY *psa = V_ISBYREF(pSrc) ? *V_ARRAYREF(pSrc) : V_ARRAY(pSrc); + VARTYPE elementType = V_VT(pSrc) & VT_TYPEMASK; unsigned numDimensions = SafeArrayGetDim(psa); std::vector indices(numDimensions); m_pObj = convertFromSafeArray( - psa, vt, 1, &indices[0], type, interp); + psa, elementType, 1, &indices[0], type, interp); } else if (vtMissing == pSrc) { m_pObj = Extension::newNaObj(); @@ -315,6 +328,10 @@ TclObject::TclObject (VARIANT *pSrc, const Type &type, Tcl_Interp *interp) m_pObj = Tcl_NewBooleanObj(V_BOOL(pSrc)); break; + case VT_ERROR: + m_pObj = Tcl_NewLongObj(V_ERROR(pSrc)); + break; + case VT_I1: case VT_UI1: m_pObj = Tcl_NewLongObj(V_I1(pSrc)); @@ -332,6 +349,13 @@ TclObject::TclObject (VARIANT *pSrc, const Type &type, Tcl_Interp *interp) m_pObj = Tcl_NewLongObj(V_I4(pSrc)); break; +#ifdef V_I8 + case VT_I8: + case VT_UI8: + m_pObj = Tcl_NewWideIntObj(V_I8(pSrc)); + break; +#endif + case VT_R4: m_pObj = Tcl_NewDoubleObj(V_R4(pSrc)); break; @@ -342,27 +366,25 @@ TclObject::TclObject (VARIANT *pSrc, const Type &type, Tcl_Interp *interp) break; case VT_DISPATCH: - if (V_DISPATCH(pSrc) == 0) { - m_pObj = Tcl_NewObj(); - } else { - const Interface *pInterface = - InterfaceManager::instance().find(type.iid()); - m_pObj = Extension::referenceHandles.newObj( - interp, - Reference::newReference(V_DISPATCH(pSrc), pInterface)); - } + m_pObj = convertFromUnknown(V_DISPATCH(pSrc), type.iid(), interp); + break; + + case VT_DISPATCH | VT_BYREF: + m_pObj = convertFromUnknown( + (V_DISPATCHREF(pSrc) != 0) ? *V_DISPATCHREF(pSrc) : 0, + type.iid(), + interp); break; case VT_UNKNOWN: - if (V_UNKNOWN(pSrc) == 0) { - m_pObj = Tcl_NewObj(); - } else { - const Interface *pInterface = - InterfaceManager::instance().find(type.iid()); - m_pObj = Extension::referenceHandles.newObj( - interp, - Reference::newReference(V_UNKNOWN(pSrc), pInterface)); - } + m_pObj = convertFromUnknown(V_UNKNOWN(pSrc), type.iid(), interp); + break; + + case VT_UNKNOWN | VT_BYREF: + m_pObj = convertFromUnknown( + (V_UNKNOWNREF(pSrc) != 0) ? *V_UNKNOWNREF(pSrc) : 0, + type.iid(), + interp); break; case VT_NULL: @@ -392,6 +414,10 @@ TclObject::TclObject (VARIANT *pSrc, const Type &type, Tcl_Interp *interp) m_pObj = Tcl_NewStringObj( const_cast(uuid.toString().c_str()), -1); } else { + if (V_VT(pSrc) == (VT_VARIANT | VT_BYREF)) { + pSrc = V_VARIANTREF(pSrc); + } + _bstr_t str(pSrc); #if TCL_MINOR_VERSION >= 2 // Uses Unicode function introduced in Tcl 8.2. @@ -408,6 +434,33 @@ TclObject::TclObject (VARIANT *pSrc, const Type &type, Tcl_Interp *interp) Tcl_IncrRefCount(m_pObj); } +TclObject::TclObject (const _bstr_t &src) +{ + if (src.length() > 0) { +#if TCL_MINOR_VERSION >= 2 + // Uses Unicode functions introduced in Tcl 8.2. + m_pObj = Tcl_NewUnicodeObj(src, -1); +#else + m_pObj = Tcl_NewStringObj(src, -1); +#endif + } else { + m_pObj = Tcl_NewObj(); + } + + Tcl_IncrRefCount(m_pObj); +} + +TclObject::TclObject ( + SAFEARRAY *psa, const Type &type, Tcl_Interp *interp) +{ + unsigned numDimensions = SafeArrayGetDim(psa); + std::vector indices(numDimensions); + m_pObj = convertFromSafeArray( + psa, type.elementType().vartype(), 1, &indices[0], type, interp); + + Tcl_IncrRefCount(m_pObj); +} + BSTR TclObject::getBSTR () const { @@ -453,6 +506,83 @@ newByteSafeArray (Tcl_Obj *pObj) } #endif +SAFEARRAY * +TclObject::getSafeArray (const Type &elementType, Tcl_Interp *interp) const +{ + SAFEARRAY *psa; + + if (elementType.vartype() == VT_UI1) { + psa = newByteSafeArray(m_pObj); + } else { + // Convert Tcl list to SAFEARRAY. + int numElements; + Tcl_Obj **pElements; + if (Tcl_ListObjGetElements(interp, m_pObj, &numElements, &pElements) + != TCL_OK) { + _com_issue_error(E_INVALIDARG); + } + + psa = SafeArrayCreateVector(elementType.vartype(), 0, numElements); + if (psa == 0) { + _com_issue_error(E_OUTOFMEMORY); + } + + void *pData; + HRESULT hr; + hr = SafeArrayAccessData(psa, &pData); + if (FAILED(hr)) { + _com_issue_error(hr); + } + + for (int i = 0; i < numElements; ++i) { + TclObject value(pElements[i]); + + switch (elementType.vartype()) { + case VT_BOOL: + static_cast(pData)[i] = + value.getBool() ? VARIANT_TRUE : VARIANT_FALSE; + break; + + case VT_I2: + case VT_UI2: + static_cast(pData)[i] = value.getLong(); + break; + + case VT_R4: + static_cast(pData)[i] = + static_cast(value.getDouble()); + break; + + case VT_R8: + static_cast(pData)[i] = value.getDouble(); + break; + + case VT_BSTR: + static_cast(pData)[i] = value.getBSTR(); + break; + + case VT_VARIANT: + { + VARIANT *pDest = static_cast(pData) + i; + VariantInit(pDest); + value.toVariant(pDest, elementType, interp); + } + break; + + default: + static_cast(pData)[i] = value.getLong(); + } + } + + hr = SafeArrayUnaccessData(psa); + if (FAILED(hr)) { + _com_issue_error(hr); + } + } + + return psa; +} + void TclObject::toVariant (VARIANT *pDest, const Type &type, @@ -493,75 +623,10 @@ TclObject::toVariant (VARIANT *pDest, V_UNKNOWN(pDest) = pUnknown; } else if (vt == VT_SAFEARRAY) { - SAFEARRAY *psa; - const Type &elementType = type.elementType(); - - if (elementType.vartype() == VT_UI1) { - psa = newByteSafeArray(m_pObj); - } else { - // Convert Tcl list to SAFEARRAY. - int numElements; - Tcl_Obj **pElements; - if (Tcl_ListObjGetElements(interp, m_pObj, &numElements, &pElements) - != TCL_OK) { - _com_issue_error(E_INVALIDARG); - } - - psa = SafeArrayCreateVector(elementType.vartype(), 0, numElements); - if (psa == 0) { - _com_issue_error(E_OUTOFMEMORY); - } - - void *pData; - HRESULT hr; - hr = SafeArrayAccessData(psa, &pData); - if (FAILED(hr)) { - _com_issue_error(hr); - } - - for (int i = 0; i < numElements; ++i) { - TclObject value(pElements[i]); - - switch (elementType.vartype()) { - case VT_BOOL: - static_cast(pData)[i] = - value.getBool() ? VARIANT_TRUE : VARIANT_FALSE; - break; - - case VT_R4: - static_cast(pData)[i] = - static_cast(value.getDouble()); - break; - - case VT_R8: - static_cast(pData)[i] = value.getDouble(); - break; - - case VT_BSTR: - static_cast(pData)[i] = value.getBSTR(); - break; - - case VT_VARIANT: - { - VARIANT *pDest = static_cast(pData) + i; - VariantInit(pDest); - value.toVariant(pDest, elementType, interp); - } - break; - - default: - static_cast(pData)[i] = value.getLong(); - } - } - - hr = SafeArrayUnaccessData(psa); - if (FAILED(hr)) { - _com_issue_error(hr); - } - } + const Type &elementType = type.elementType(); V_VT(pDest) = VT_ARRAY | elementType.vartype(); - V_ARRAY(pDest) = psa; + V_ARRAY(pDest) = getSafeArray(elementType, interp); } else if (m_pObj->typePtr == TclTypes::listType()) { // Convert Tcl list to array of VARIANT. @@ -678,4 +743,26 @@ TclObject::toVariant (VARIANT *pDest, } } + +void +TclObject::toNativeValue (NativeValue *pDest, + const Type &type, + Tcl_Interp *interp, + bool addRef) +{ +#ifdef V_I8 + VARTYPE vt = type.vartype(); + if (vt == VT_I8 || vt == VT_UI8) { + pDest->fixInvalidVariantType(); + VariantClear(pDest); + V_VT(pDest) = vt; + Tcl_GetWideIntFromObj(interp, m_pObj, &V_I8(pDest)); + return; + } +#endif + + pDest->fixInvalidVariantType(); + toVariant(pDest, type, interp, addRef); +} + #endif diff --git a/src/TclObject.h b/src/TclObject.h index 9a71502..35c3cb2 100644 --- a/src/TclObject.h +++ b/src/TclObject.h @@ -1,9 +1,10 @@ -// $Id: TclObject.h,v 1.12 2002/04/12 02:55:28 cthuang Exp $ +// $Id: TclObject.h 16 2005-04-19 14:47:52Z cthuang $ #ifndef TCLOBJECT_H #define TCLOBJECT_H #ifdef WIN32 #include "TypeInfo.h" +#include "NativeValue.h" #endif #include #include @@ -101,12 +102,21 @@ public: TclObject &lappend(Tcl_Obj *pElement); #ifdef WIN32 - // Construct Tcl object from VARIANT value. + // Construct Tcl object from native machine value. TclObject( - VARIANT *pSrc, // VARIANT value to convert from + VARIANT *pSrc, // value to convert from const Type &type, // expected type for interface pointers Tcl_Interp *interp); + // Construct Tcl object from _bstr_t. + TclObject(const _bstr_t &src); + + // Construct Tcl object from SAFEARRAY. + TclObject( + SAFEARRAY *psa, // value to convert from + const Type &type, // array type + Tcl_Interp *interp); + // Convert Tcl object to VARIANT value. void toVariant( VARIANT *pDest, // converted value put here @@ -114,9 +124,20 @@ public: Tcl_Interp *interp, bool addRef=false); // call AddRef on interface pointer + // Convert Tcl object to native machine value. + void toNativeValue( + NativeValue *pDest, // converted value put here + const Type &type, // desired data type + Tcl_Interp *interp, + bool addRef=false); // call AddRef on interface pointer + // Get BSTR representation. Caller is responsible for freeing the // returned BSTR. BSTR getBSTR() const; + + // Get SAFEARRAY representation. Caller is responsible for freeing the + // returned array. + SAFEARRAY *getSafeArray(const Type &elementType, Tcl_Interp *interp) const; #endif }; diff --git a/src/TclScript.cpp b/src/TclScript.cpp index df52143..1f43bf1 100644 --- a/src/TclScript.cpp +++ b/src/TclScript.cpp @@ -1,4 +1,4 @@ -// $Id: TclScript.cpp,v 1.12 2003/04/02 22:46:51 cthuang Exp $ +// $Id: TclScript.cpp 5 2005-02-16 14:57:24Z cthuang $ #include "ActiveScriptError.h" #include "Reference.h" #include "TypeInfo.h" diff --git a/src/TclScriptVersion.rc b/src/TclScriptVersion.rc index 914a688..7208227 100644 --- a/src/TclScriptVersion.rc +++ b/src/TclScriptVersion.rc @@ -1,4 +1,4 @@ -// $Id: TclScriptVersion.rc,v 1.3 2002/04/27 18:15:24 cthuang Exp $ +// $Id: TclScriptVersion.rc 5 2005-02-16 14:57:24Z cthuang $ #include #include "version.h" #include "buildNumber.h" diff --git a/src/ThreadLocalStorage.h b/src/ThreadLocalStorage.h index 71770d1..804dc95 100644 --- a/src/ThreadLocalStorage.h +++ b/src/ThreadLocalStorage.h @@ -1,4 +1,4 @@ -// $Id: ThreadLocalStorage.h,v 1.1 2002/04/20 15:43:57 cthuang Exp $ +// $Id: ThreadLocalStorage.h 5 2005-02-16 14:57:24Z cthuang $ #ifndef THREADLOCALSTORAGE_H #define THREADLOCALSTORAGE_H diff --git a/src/TypeInfo.cpp b/src/TypeInfo.cpp index 39b5fda..04775ed 100644 --- a/src/TypeInfo.cpp +++ b/src/TypeInfo.cpp @@ -1,4 +1,4 @@ -// $Id: TypeInfo.cpp,v 1.58 2002/04/20 06:11:32 cthuang Exp $ +// $Id: TypeInfo.cpp 5 2005-02-16 14:57:24Z cthuang $ #pragma warning(disable: 4786) #include #include @@ -35,7 +35,7 @@ static VarTypeStringAssoc varTypeStringAssocs[] = { { VT_DATE, "DATE" }, { VT_BSTR, "BSTR" }, { VT_DISPATCH, "DISPATCH" }, - { VT_ERROR, "ERROR" }, + { VT_ERROR, "SCODE" }, { VT_BOOL, "BOOL" }, { VT_VARIANT, "VARIANT" }, { VT_UNKNOWN, "UNKNOWN" }, diff --git a/src/TypeInfo.h b/src/TypeInfo.h index 2794e1a..1dd13a2 100644 --- a/src/TypeInfo.h +++ b/src/TypeInfo.h @@ -1,4 +1,4 @@ -// $Id: TypeInfo.h,v 1.41 2002/04/20 06:11:32 cthuang Exp $ +// $Id: TypeInfo.h 5 2005-02-16 14:57:24Z cthuang $ #ifndef TYPEINFO_H #define TYPEINFO_H diff --git a/src/TypeLib.cpp b/src/TypeLib.cpp index 37f4591..8bc99ae 100644 --- a/src/TypeLib.cpp +++ b/src/TypeLib.cpp @@ -1,4 +1,4 @@ -// $Id: TypeLib.cpp,v 1.29 2002/03/09 16:40:24 cthuang Exp $ +// $Id: TypeLib.cpp 9 2005-04-07 14:14:37Z cthuang $ #pragma warning(disable: 4786) #include #include "RegistryKey.h" @@ -148,7 +148,7 @@ TypeLib::loadByLibid (const std::string &libidStr, const std::string &version) ITypeLibPtr pTypeLib; HRESULT hr = LoadRegTypeLib( - libid, majorVersion, minorVersion, LOCALE_USER_DEFAULT, &pTypeLib); + libid, majorVersion, minorVersion, LOCALE_NEUTRAL, &pTypeLib); if (FAILED(hr)) { _com_issue_error(hr); } diff --git a/src/TypeLib.h b/src/TypeLib.h index 8d989a1..417f4a3 100644 --- a/src/TypeLib.h +++ b/src/TypeLib.h @@ -1,4 +1,4 @@ -// $Id: TypeLib.h,v 1.21 2002/03/09 16:40:24 cthuang Exp $ +// $Id: TypeLib.h 5 2005-02-16 14:57:24Z cthuang $ #ifndef TYPELIB_H #define TYPELIB_H diff --git a/src/Uuid.cpp b/src/Uuid.cpp index a45e740..cbc0782 100644 --- a/src/Uuid.cpp +++ b/src/Uuid.cpp @@ -1,4 +1,4 @@ -// $Id: Uuid.cpp,v 1.2 2000/04/20 18:37:40 chuang Exp $ +// $Id: Uuid.cpp 5 2005-02-16 14:57:24Z cthuang $ #include "Uuid.h" std::string diff --git a/src/Uuid.h b/src/Uuid.h index ab01674..6aa1d21 100644 --- a/src/Uuid.h +++ b/src/Uuid.h @@ -1,4 +1,4 @@ -// $Id: Uuid.h,v 1.3 2000/04/28 19:37:53 chuang Exp $ +// $Id: Uuid.h 5 2005-02-16 14:57:24Z cthuang $ #ifndef UUID_H #define UUID_H diff --git a/src/bindCmd.cpp b/src/bindCmd.cpp index 7b0c253..80b80fa 100644 --- a/src/bindCmd.cpp +++ b/src/bindCmd.cpp @@ -1,4 +1,4 @@ -// $Id: bindCmd.cpp,v 1.53 2003/04/02 22:46:51 cthuang Exp $ +// $Id: bindCmd.cpp 13 2005-04-18 12:24:14Z cthuang $ #pragma warning(disable: 4786) #include "Extension.h" #include "Reference.h" diff --git a/src/buildNumber.h b/src/buildNumber.h index 7fe11cc..e5f4509 100644 --- a/src/buildNumber.h +++ b/src/buildNumber.h @@ -1 +1 @@ -#define BUILD_NUMBER 28 +#define BUILD_NUMBER 33 diff --git a/src/configureCmd.cpp b/src/configureCmd.cpp index 7e8ee1c..633e33d 100644 --- a/src/configureCmd.cpp +++ b/src/configureCmd.cpp @@ -1,4 +1,4 @@ -// $Id: configureCmd.cpp,v 1.7 2002/04/13 03:53:57 cthuang Exp $ +// $Id: configureCmd.cpp 5 2005-02-16 14:57:24Z cthuang $ #pragma warning(disable: 4786) #include "Extension.h" diff --git a/src/dllmain.cpp b/src/dllmain.cpp index 537d1c1..a88805f 100644 --- a/src/dllmain.cpp +++ b/src/dllmain.cpp @@ -1,4 +1,4 @@ -// $Id: dllmain.cpp,v 1.16 2002/07/14 18:42:57 cthuang Exp $ +// $Id: dllmain.cpp 5 2005-02-16 14:57:24Z cthuang $ #pragma warning(disable: 4786) #include "Uuid.h" #include "HandleSupport.h" diff --git a/src/dllserver.dsp b/src/dllserver.dsp index 34ad259..eb1662c 100644 --- a/src/dllserver.dsp +++ b/src/dllserver.dsp @@ -43,7 +43,7 @@ RSC=rc.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "DLLSERVER_EXPORTS" /YX /FD /c -# ADD CPP /nologo /MD /W3 /GX /Zi /Od /I "\tcl\include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "DLLSERVER_EXPORTS" /D "TCL_THREADS" /D "USE_TCL_STUBS" /D "USE_NON_CONST" /YX /FD /c +# ADD CPP /nologo /MD /W3 /GX /Zi /Od /I "\tcl\include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "TCL_THREADS" /D "USE_TCL_STUBS" /D "USE_NON_CONST" /YX /FD /c # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "NDEBUG" @@ -69,7 +69,7 @@ LINK32=link.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "DLLSERVER_EXPORTS" /YX /FD /GZ /c -# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "\tcl\include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "DLLSERVER_EXPORTS" /D "TCL_THREADS" /D "USE_TCL_STUBS" /D "USE_NON_CONST" /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "\tcl\include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "TCL_THREADS" /D "USE_TCL_STUBS" /D "USE_NON_CONST" /YX /FD /GZ /c # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" diff --git a/src/dllserverVersion.rc b/src/dllserverVersion.rc index 484be11..1de70de 100644 --- a/src/dllserverVersion.rc +++ b/src/dllserverVersion.rc @@ -1,4 +1,4 @@ -// $Id: dllserverVersion.rc,v 1.5 2002/04/27 18:15:24 cthuang Exp $ +// $Id: dllserverVersion.rc 5 2005-02-16 14:57:24Z cthuang $ #include #include "version.h" #include "buildNumber.h" diff --git a/src/exemain.cpp b/src/exemain.cpp index abd3919..0dee0b8 100644 --- a/src/exemain.cpp +++ b/src/exemain.cpp @@ -1,4 +1,4 @@ -// $Id: exemain.cpp,v 1.12 2002/07/14 18:42:57 cthuang Exp $ +// $Id: exemain.cpp 5 2005-02-16 14:57:24Z cthuang $ #pragma warning(disable: 4786) #include "TclModule.h" #include "tclRunTime.h" diff --git a/src/exeserverVersion.rc b/src/exeserverVersion.rc index 711106b..78753ce 100644 --- a/src/exeserverVersion.rc +++ b/src/exeserverVersion.rc @@ -1,4 +1,4 @@ -// $Id: exeserverVersion.rc,v 1.5 2002/04/27 18:15:24 cthuang Exp $ +// $Id: exeserverVersion.rc 5 2005-02-16 14:57:24Z cthuang $ #include #include "version.h" #include "buildNumber.h" diff --git a/src/foreachCmd.cpp b/src/foreachCmd.cpp index d61e3bb..f6e5758 100644 --- a/src/foreachCmd.cpp +++ b/src/foreachCmd.cpp @@ -1,4 +1,4 @@ -// $Id: foreachCmd.cpp,v 1.10 2002/05/31 04:03:06 cthuang Exp $ +// $Id: foreachCmd.cpp 5 2005-02-16 14:57:24Z cthuang $ #include "Extension.h" #include #include "Reference.h" diff --git a/src/importCmd.cpp b/src/importCmd.cpp index 2682c14..b3d5c8b 100644 --- a/src/importCmd.cpp +++ b/src/importCmd.cpp @@ -1,4 +1,4 @@ -// $Id: importCmd.cpp,v 1.26 2002/05/31 04:03:06 cthuang Exp $ +// $Id: importCmd.cpp 5 2005-02-16 14:57:24Z cthuang $ #pragma warning(disable: 4786) #include "Extension.h" #include diff --git a/src/infoCmd.cpp b/src/infoCmd.cpp index 2a3dffd..ac6fb14 100644 --- a/src/infoCmd.cpp +++ b/src/infoCmd.cpp @@ -1,4 +1,4 @@ -// $Id: infoCmd.cpp,v 1.31 2002/04/13 03:53:57 cthuang Exp $ +// $Id: infoCmd.cpp 5 2005-02-16 14:57:24Z cthuang $ #include "Extension.h" #include "TclObject.h" #include "Reference.h" diff --git a/src/main.cpp b/src/main.cpp index 160c515..eff5738 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,4 +1,4 @@ -// $Id: main.cpp,v 1.70 2002/07/14 18:42:57 cthuang Exp $ +// $Id: main.cpp 5 2005-02-16 14:57:24Z cthuang $ #pragma warning(disable: 4786) #include "ComModule.h" #include "Extension.h" diff --git a/src/mutex.h b/src/mutex.h index 3ee1f72..2e132a8 100644 --- a/src/mutex.h +++ b/src/mutex.h @@ -1,4 +1,4 @@ -// $Id: mutex.h,v 1.7 2002/04/13 03:53:57 cthuang Exp $ +// $Id: mutex.h 5 2005-02-16 14:57:24Z cthuang $ #ifndef MUTEX_H #define MUTEX_H diff --git a/src/naCmd.cpp b/src/naCmd.cpp index 8cc47b0..3283907 100644 --- a/src/naCmd.cpp +++ b/src/naCmd.cpp @@ -1,4 +1,4 @@ -// $Id: naCmd.cpp,v 1.7 2003/03/07 00:17:30 cthuang Exp $ +// $Id: naCmd.cpp 5 2005-02-16 14:57:24Z cthuang $ #include "Extension.h" #include diff --git a/src/nullCmd.cpp b/src/nullCmd.cpp index 28e669e..d268a20 100644 --- a/src/nullCmd.cpp +++ b/src/nullCmd.cpp @@ -1,4 +1,4 @@ -// $Id: nullCmd.cpp,v 1.10 2003/03/07 00:17:30 cthuang Exp $ +// $Id: nullCmd.cpp 5 2005-02-16 14:57:24Z cthuang $ #include "Extension.h" #include diff --git a/src/objectCmd.cpp b/src/objectCmd.cpp index 5dc9560..ca49314 100644 --- a/src/objectCmd.cpp +++ b/src/objectCmd.cpp @@ -1,4 +1,4 @@ -// $Id: objectCmd.cpp,v 1.31 2003/03/07 00:24:04 cthuang Exp $ +// $Id: objectCmd.cpp 5 2005-02-16 14:57:24Z cthuang $ #pragma warning(disable: 4786) #include "Extension.h" #include diff --git a/src/refCmd.cpp b/src/refCmd.cpp index eac808d..a21daef 100644 --- a/src/refCmd.cpp +++ b/src/refCmd.cpp @@ -1,4 +1,4 @@ -// $Id: refCmd.cpp,v 1.46 2003/11/06 15:29:01 cthuang Exp $ +// $Id: refCmd.cpp 16 2005-04-19 14:47:52Z cthuang $ #pragma warning(disable: 4786) #include "Extension.h" #include @@ -10,6 +10,8 @@ static int referenceObjCmd(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST []); HandleSupport Extension::referenceHandles(referenceObjCmd); +static const char unknownErrorDescription[] = "Unknown error"; + // Check if the object implements ISupportErrorInfo. If it does, get the // error information. Return true if successful. @@ -36,6 +38,59 @@ getErrorInfo (Reference *pReference, IErrorInfo **ppErrorInfo) return GetErrorInfo(0, ppErrorInfo) == S_OK; } +// Get description text for an HRESULT. + +static Tcl_Obj * +formatMessage (HRESULT hresult) +{ +#if TCL_MINOR_VERSION >= 2 + // Uses Unicode functions introduced in Tcl 8.2. + wchar_t *pMessage; + DWORD nLen = FormatMessageW( + FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, + NULL, + hresult, + 0, + reinterpret_cast(&pMessage), + 0, + NULL); +#else + char *pMessage; + DWORD nLen = FormatMessageA( + FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, + NULL, + hresult, + 0, + reinterpret_cast(&pMessage), + 0, + NULL); +#endif + + Tcl_Obj *pDescription; + if (nLen > 0) { + if (nLen > 1 && pMessage[nLen - 1] == '\n') { + --nLen; + if (nLen > 1 && pMessage[nLen - 1] == '\r') { + --nLen; + } + } + pMessage[nLen] = '\0'; + + +#if TCL_MINOR_VERSION >= 2 + // Uses Unicode functions introduced in Tcl 8.2. + pDescription = Tcl_NewUnicodeObj(pMessage, nLen); +#else + pDescription = Tcl_NewStringObj(pMessage, nLen); +#endif + } else { + pDescription = Tcl_NewStringObj(unknownErrorDescription, -1); + } + LocalFree(pMessage); + + return pDescription; +} + // Set the Tcl errorCode variable and the Tcl interpreter result. // Returns TCL_ERROR. @@ -43,7 +98,7 @@ static int setErrorCodeAndResult ( Tcl_Interp *interp, HRESULT hresult, - const _bstr_t &description, + Tcl_Obj *pDescription, const char *file, int line) { @@ -60,13 +115,8 @@ setErrorCodeAndResult ( result.lappend(hrObj); // Append description. - const wchar_t *pWide = static_cast(description); - if (pWide == 0) { - pWide = L"Unknown error"; - } - TclObject descriptionObj(pWide); - errorCode.lappend(descriptionObj); - result.lappend(descriptionObj); + errorCode.lappend(pDescription); + result.lappend(pDescription); #ifndef NDEBUG // Append file and line number. @@ -81,45 +131,29 @@ setErrorCodeAndResult ( return TCL_ERROR; } +static int +setErrorCodeAndResult ( + Tcl_Interp *interp, + HRESULT hresult, + const _bstr_t &description, + const char *file, + int line) +{ + TclObject descriptionObj; + int length; + Tcl_GetStringFromObj(descriptionObj, &length); + if (length == 0) { + descriptionObj = Tcl_NewStringObj(unknownErrorDescription, -1); + } + return setErrorCodeAndResult(interp, hresult, descriptionObj, file, line); +} + int Extension::setComErrorResult ( Tcl_Interp *interp, _com_error &e, const char *file, int line) { - // Get description. - _bstr_t description; - -#if TCL_MINOR_VERSION >= 2 - // Uses Unicode functions introduced in Tcl 8.2. - wchar_t *pMessage; - DWORD nLen = FormatMessageW( - FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, - NULL, - e.Error(), - 0, - reinterpret_cast(&pMessage), - 0, - NULL); - - if (nLen > 0) { - if (nLen > 1 && pMessage[nLen - 1] == '\n') { - --nLen; - if (nLen > 1 && pMessage[nLen - 1] == '\r') { - --nLen; - } - } - pMessage[nLen] = '\0'; - - description = _bstr_t(pMessage); - } else { - // FormatMessageW doesn't seem to work on Windows 95/98. - description = _bstr_t(e.ErrorMessage()); - } - LocalFree(pMessage); -#else - description = _bstr_t(e.ErrorMessage()); -#endif - - return setErrorCodeAndResult(interp, e.Error(), description, file, line); + return setErrorCodeAndResult( + interp, e.Error(), formatMessage(e.Error()), file, line); } // Invoke a method or property. @@ -135,7 +169,7 @@ invoke (Tcl_Interp *interp, WORD dispatchFlags) { // Set up return value. - _variant_t returnValue; + NativeValue returnValue; VARIANT *pReturnValue = (pMethod->type().vartype() == VT_VOID) ? 0 : &returnValue; @@ -286,7 +320,7 @@ invokeWithoutInterfaceDesc ( } // Set up return value. - _variant_t varReturnValue; + NativeValue varReturnValue; VARIANT *pReturnValue = (dispatchFlags & DISPATCH_PROPERTYPUT) ? 0 : &varReturnValue; @@ -339,10 +373,10 @@ referenceObjCmd ( int i = 1; for (; i < objc; ++i) { static char *options[] = { - "-get", "-method", "-namedarg", "-set", NULL + "-call", "-get", "-method", "-namedarg", "-set", NULL }; enum OptionEnum { - OPTION_GET, OPTION_METHOD, OPTION_NAMEDARG, OPTION_SET + OPTION_CALL, OPTION_GET, OPTION_METHOD, OPTION_NAMEDARG, OPTION_SET }; int index; @@ -352,12 +386,13 @@ referenceObjCmd ( } switch (index) { - case OPTION_GET: - dispatchFlags = DISPATCH_PROPERTYGET; - break; + case OPTION_CALL: case OPTION_METHOD: dispatchFlags = DISPATCH_METHOD; break; + case OPTION_GET: + dispatchFlags = DISPATCH_PROPERTYGET; + break; case OPTION_NAMEDARG: namedArgOpt = true; break; @@ -460,6 +495,18 @@ referenceObjCmd ( result = setErrorCodeAndResult( interp, e.scode(), e.description(), __FILE__, __LINE__); } + catch (InvokeException &e) { + std::ostringstream argOut; + argOut << "Argument " << e.argIndex() << ": "; + TclObject descriptionObj(argOut.str()); + + TclObject messageObj(formatMessage(e.hresult())); + Tcl_AppendObjToObj(descriptionObj, messageObj); + + result = setErrorCodeAndResult( + interp, e.hresult(), descriptionObj, __FILE__, __LINE__); + } + return result; } diff --git a/src/shortPathNameCmd.cpp b/src/shortPathNameCmd.cpp index a885e22..f0e5fe8 100644 --- a/src/shortPathNameCmd.cpp +++ b/src/shortPathNameCmd.cpp @@ -1,4 +1,4 @@ -// $Id: shortPathNameCmd.cpp,v 1.3 2002/04/13 03:53:57 cthuang Exp $ +// $Id: shortPathNameCmd.cpp 5 2005-02-16 14:57:24Z cthuang $ #include "Extension.h" #define WIN32_LEAN_AND_MEAN #include diff --git a/src/tclRunTime.h b/src/tclRunTime.h index 4c89f3c..3bac0cb 100644 --- a/src/tclRunTime.h +++ b/src/tclRunTime.h @@ -1,4 +1,4 @@ -// $Id: tclRunTime.h,v 1.1 2002/07/15 04:03:54 cthuang Exp $ +// $Id: tclRunTime.h 5 2005-02-16 14:57:24Z cthuang $ #ifndef TCLRUNTIME_H #define TCLRUNTIME_H diff --git a/src/tcom.dsp b/src/tcom.dsp index b05665d..e7cc1ee 100644 --- a/src/tcom.dsp +++ b/src/tcom.dsp @@ -45,7 +45,7 @@ RSC=rc.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "TCOM_EXPORTS" /YX /FD /c -# ADD CPP /nologo /MD /W3 /GX /Zi /Od /I "\tcl\include" /D "NDEBUG" /D "_WIN32_DCOM" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "TCOM_EXPORTS" /D "TCL_THREADS" /D "USE_TCL_STUBS" /D "USE_NON_CONST" /YX /FD /c +# ADD CPP /nologo /MD /W3 /GX /Zi /Od /I "\tcl\include" /D "NDEBUG" /D "_WIN32_DCOM" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "TCOM_EXPORTS" /D "TCOM_VTBL_SERVER" /D "TCL_THREADS" /D "USE_TCL_STUBS" /D "USE_NON_CONST" /YX /FD /c # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "NDEBUG" @@ -71,7 +71,7 @@ LINK32=link.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "TCOM_EXPORTS" /YX /FD /GZ /c -# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "\tcl\include" /D "_DEBUG" /D "_WIN32_DCOM" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "TCOM_EXPORTS" /D "TCL_THREADS" /D "USE_TCL_STUBS" /D "USE_NON_CONST" /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "\tcl\include" /D "_DEBUG" /D "_WIN32_DCOM" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "TCOM_EXPORTS" /D "TCOM_VTBL_SERVER" /D "TCL_THREADS" /D "USE_TCL_STUBS" /D "USE_NON_CONST" /YX /FD /GZ /c # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" @@ -98,7 +98,7 @@ LINK32=link.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /I "e:\tcl\include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "TCOM_EXPORTS" /D "_WIN32_DCOM" /YX /FD /c -# ADD CPP /nologo /MD /W3 /GX /Zi /O2 /I "\tcl\include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "TCOM_EXPORTS" /D "TCL_THREADS" /D "USE_TCL_STUBS" /D "USE_NON_CONST" /YX /FD /c +# ADD CPP /nologo /MD /W3 /GX /Zi /O2 /I "\tcl\include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "TCOM_EXPORTS" /D "TCOM_VTBL_SERVER" /D "TCL_THREADS" /D "USE_TCL_STUBS" /D "USE_NON_CONST" /YX /FD /c # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "NDEBUG" @@ -125,7 +125,7 @@ LINK32=link.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "c:\tcl\include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "TCOM_EXPORTS" /D "_WIN32_DCOM" /YX /FD /GZ /c -# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "\tcl\include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "TCOM_EXPORTS" /D "TCL_THREADS" /D "USE_TCL_STUBS" /D "USE_NON_CONST" /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "\tcl\include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "TCOM_EXPORTS" /D "TCOM_VTBL_SERVER" /D "TCL_THREADS" /D "USE_TCL_STUBS" /D "USE_NON_CONST" /YX /FD /GZ /c # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" @@ -174,6 +174,14 @@ SOURCE=.\configureCmd.cpp # End Source File # Begin Source File +SOURCE=.\DispatchAdapter.cpp +# End Source File +# Begin Source File + +SOURCE=.\DispatchImpl.cpp +# End Source File +# Begin Source File + SOURCE=.\Extension.cpp # End Source File # Begin Source File @@ -210,6 +218,10 @@ SOURCE=.\naCmd.cpp # End Source File # Begin Source File +SOURCE=.\NativeValue.cpp +# End Source File +# Begin Source File + SOURCE=.\nullCmd.cpp # End Source File # Begin Source File @@ -286,6 +298,14 @@ SOURCE=.\ComObjectFactory.h # End Source File # Begin Source File +SOURCE=.\DispatchAdapter.h +# End Source File +# Begin Source File + +SOURCE=.\DispatchImpl.h +# End Source File +# Begin Source File + SOURCE=.\Extension.h # End Source File # Begin Source File @@ -306,6 +326,10 @@ SOURCE=.\mutex.h # End Source File # Begin Source File +SOURCE=.\NativeValue.h +# End Source File +# Begin Source File + SOURCE=.\Reference.h # End Source File # Begin Source File diff --git a/src/tcomApi.h b/src/tcomApi.h index 1cdd220..9f00bec 100644 --- a/src/tcomApi.h +++ b/src/tcomApi.h @@ -1,4 +1,4 @@ -// $Id: tcomApi.h,v 1.1 2000/04/22 21:39:36 chuang Exp $ +// $Id: tcomApi.h 5 2005-02-16 14:57:24Z cthuang $ #ifndef TCOMAPI_H #define TCOMAPI_H diff --git a/src/tcomVersion.rc b/src/tcomVersion.rc index 12e742b..9480528 100644 --- a/src/tcomVersion.rc +++ b/src/tcomVersion.rc @@ -1,4 +1,4 @@ -// $Id: tcomVersion.rc,v 1.5 2002/04/27 18:15:24 cthuang Exp $ +// $Id: tcomVersion.rc 5 2005-02-16 14:57:24Z cthuang $ #include #include "version.h" #include "buildNumber.h" diff --git a/src/typelibCmd.cpp b/src/typelibCmd.cpp index b5da966..58d00e0 100644 --- a/src/typelibCmd.cpp +++ b/src/typelibCmd.cpp @@ -1,4 +1,4 @@ -// $Id: typelibCmd.cpp,v 1.29 2002/04/13 03:53:57 cthuang Exp $ +// $Id: typelibCmd.cpp 5 2005-02-16 14:57:24Z cthuang $ #pragma warning(disable: 4786) #include "Extension.h" #include "TypeLib.h" diff --git a/src/variantCmd.cpp b/src/variantCmd.cpp index 51e5214..cbad50e 100644 --- a/src/variantCmd.cpp +++ b/src/variantCmd.cpp @@ -1,4 +1,4 @@ -// $Id: variantCmd.cpp,v 1.1 2003/05/29 03:33:08 cthuang Exp $ +// $Id: variantCmd.cpp 5 2005-02-16 14:57:24Z cthuang $ #include "Extension.h" #include diff --git a/src/version.h b/src/version.h index 5e98760..361a705 100644 --- a/src/version.h +++ b/src/version.h @@ -1,9 +1,9 @@ -// $Id: version.h,v 1.4 2002/10/01 21:51:32 cthuang Exp $ +// $Id: version.h 5 2005-02-16 14:57:24Z cthuang $ #ifndef VERSION_H #define VERSION_H #define PACKAGE_MAJOR_VERSION 3 -#define PACKAGE_MINOR_VERSION 9 +#define PACKAGE_MINOR_VERSION 10 #define MAKE_VERSION_STRING0(MAJOR,MINOR) #MAJOR "." #MINOR #define MAKE_VERSION_STRING(MAJOR,MINOR) MAKE_VERSION_STRING0(MAJOR,MINOR) diff --git a/tests/all.tcl b/tests/all.tcl index b2d4f9e..c25e0c3 100644 --- a/tests/all.tcl +++ b/tests/all.tcl @@ -1,4 +1,4 @@ -# $Id: all.tcl,v 1.1 2002/03/16 04:53:17 cthuang Exp $ +# $Id: all.tcl 5 2005-02-16 14:57:24Z cthuang $ # # This file contains a top-level script to run all of the tests. diff --git a/tests/array.test b/tests/array.test index 8a8f49b..d0f5c50 100644 --- a/tests/array.test +++ b/tests/array.test @@ -1,6 +1,6 @@ -# $Id: array.test,v 1.1 2003/05/12 23:31:03 cthuang Exp $ +# $Id: array.test 5 2005-02-16 14:57:24Z cthuang $ # -# This file contains tests for the passing arrays +# This file contains tests for passing arrays. if {[lsearch [namespace children] ::tcltest] == -1} { package require tcltest diff --git a/tests/eval.test b/tests/eval.test index e55972b..c2ed8f8 100644 --- a/tests/eval.test +++ b/tests/eval.test @@ -1,6 +1,6 @@ -# $Id: eval.test,v 1.2 2003/04/02 22:57:35 cthuang Exp $ +# $Id: eval.test 5 2005-02-16 14:57:24Z cthuang $ # -# This file contains tests the robustness of handles under eval. +# This file tests the robustness of handles under eval. if {[lsearch [namespace children] ::tcltest] == -1} { package require tcltest diff --git a/tests/foreach.test b/tests/foreach.test index f2935bf..6791a78 100644 --- a/tests/foreach.test +++ b/tests/foreach.test @@ -1,4 +1,4 @@ -# $Id: foreach.test,v 1.2 2003/03/07 00:01:40 cthuang Exp $ +# $Id: foreach.test 5 2005-02-16 14:57:24Z cthuang $ # # This file contains tests for the ::tcom::foreach command. diff --git a/tests/namedarg.test b/tests/namedarg.test index 21f718f..e3fa96f 100644 --- a/tests/namedarg.test +++ b/tests/namedarg.test @@ -1,4 +1,4 @@ -# $Id: namedarg.test,v 1.2 2003/04/02 22:57:35 cthuang Exp $ +# $Id: namedarg.test 5 2005-02-16 14:57:24Z cthuang $ # # This file contains tests invoking methods through IDispatch with named # arguments. diff --git a/tests/ref.test b/tests/ref.test index bf28e22..2b43a8e 100644 --- a/tests/ref.test +++ b/tests/ref.test @@ -1,4 +1,4 @@ -# $Id: ref.test,v 1.2 2002/06/29 15:44:21 cthuang Exp $ +# $Id: ref.test 13 2005-04-18 12:24:14Z cthuang $ # # This file contains tests for the ::tcom::ref command. @@ -34,7 +34,9 @@ test createobject-1.2 {::tcom::ref createobject, Banking example server} { package require tcom set bank [::tcom::ref createobject "Banking.Bank"] +# set bank [::tcom::ref querydispatch $bank] set account [$bank CreateAccount] +# set account [::tcom::ref querydispatch $account] $account Deposit 30 $account Withdraw 20 $account Balance -- 2.23.0