From 2325035d544f07247f2f8979f59904d6e2faef36 Mon Sep 17 00:00:00 2001 From: Pat Thoyts Date: Thu, 29 Jan 2009 22:17:50 +0000 Subject: [PATCH] import: tcom-3.9 --- CHANGES | 16 ++ README | 12 +- doc/docbookx.dtd | 0 doc/tcom.n.html | 15 +- doc/tcom.n.xml | 21 +- doc/xslt.tcl | 3 +- lib/Banking/server.tcl | 3 +- lib/TclScript/TclScript.dll | Bin 32833 -> 32833 bytes lib/TclScript/TclScript.itcl | 55 +++-- lib/TclScript/TclScript.tlb | Bin 20252 -> 20468 bytes lib/TclScript/unregister.tcl | 13 + lib/tcom/pkgIndex.tcl | 4 +- lib/tcom/tcom.dll | Bin 262194 -> 262194 bytes lib/tcom/tcom.tcl | 9 +- lib/tcom/tcominproc.dll | Bin 32834 -> 32834 bytes lib/tcom/tcomlocal.exe | Bin 32833 -> 32833 bytes samples/chart.tcl | 26 +- samples/excel.tcl | 3 +- src/Arguments.cpp | 10 +- src/ComObject.cpp | 106 +++++--- src/ComObject.h | 11 +- src/Extension.cpp | 33 ++- src/Extension.h | 12 +- src/HandleSupport.cpp | 65 +++-- src/HandleSupport.h | 28 +-- src/HashTable.h | 4 +- src/Makefile | 8 +- src/Reference.cpp | 39 +-- src/Reference.h | 4 +- src/TclObject.cpp | 459 ++++++++++++++++++++--------------- src/TclScript.cpp | 27 +-- src/TclScript.dsp | 4 +- src/TclScript.idl | 9 + src/bindCmd.cpp | 48 ++-- src/buildNumber.h | 2 +- src/comsupp.cpp | 60 ----- src/naCmd.cpp | 6 +- src/nullCmd.cpp | 23 +- src/objectCmd.cpp | 46 +++- src/refCmd.cpp | 27 ++- src/tcom.dsp | 4 + src/variantCmd.cpp | 151 ++++++++++++ src/version.h | 4 +- tests/array.test | 53 ++++ tests/eval.test | 35 +++ tests/foreach.test | 10 +- tests/namedarg.test | 4 +- 47 files changed, 946 insertions(+), 526 deletions(-) delete mode 100644 doc/docbookx.dtd create mode 100644 lib/TclScript/unregister.tcl delete mode 100644 src/comsupp.cpp create mode 100644 src/variantCmd.cpp create mode 100644 tests/array.test create mode 100644 tests/eval.test diff --git a/CHANGES b/CHANGES index 1ce6379..6edeffe 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,19 @@ +Version 3.9 +- Fixed defect where eval may trigger premature destruction of handle internal + representation. +- Fixed COM server handling of byref BSTR and VARIANT parameters. +- Fixed invalid pointer error when Visual Studio automation object returns a + VARIANT of type VT_DISPATCH with pointer set to NULL. +- Fixed incorrect type conversion when passing to SAFEARRAY(BYTE) parameter. +- Fixed memory corruption in handling of [out] DECIMAL parameters. +- Fixed Unicode encoding of ::tcom::ref getobject parameter. +- If an error occurs while executing a ::tcom::bind event handler command + then use the bgerror mechanism to report the error. +- Added ::tcom::variant command which creates VARIANT values. +- Added [::tcom::object null] command which returns a token representing a + null IUnknown pointer. +- Added support for two-dimensional SAFEARRAY. + Version 3.8 - Fixed defect which prevented DISPATCH_PROPERTYPUTREF properties from being set. diff --git a/README b/README index e013838..6ff0ac0 100644 --- a/README +++ b/README @@ -14,10 +14,10 @@ directory is C:\Tcl\lib, enter this command at the command prompt: TCL ACTIVE SCRIPT ENGINE -This distribution includes an Active Script engine that's currently in a -pre-alpha stage of development. It implements just enough of the IActiveScript -and IActiveScriptParse interfaces to enable Internet Explorer and Windows -Script Host to run simple scripts. It works with the ActiveTcl binary -distribution from ActiveState. To register the script engine (assuming the -Tcl library directory is C:\Tcl\lib), change the current working directory to +This distribution includes an experimental implementation of a Tcl Active +Script engine. It implements just enough of the IActiveScript and +IActiveScriptParse interfaces to enable Internet Explorer and Windows Script +Host to run simple scripts. It works with the ActiveTcl binary distribution +from ActiveState. To register the script engine (assuming the Tcl library +directory is C:\Tcl\lib), change the current working directory to C:\Tcl\lib\TclScript and run the register.tcl script. diff --git a/doc/docbookx.dtd b/doc/docbookx.dtd deleted file mode 100644 index e69de29..0000000 diff --git a/doc/tcom.n.html b/doc/tcom.n.html index 6913361..518d762 100644 --- a/doc/tcom.n.html +++ b/doc/tcom.n.html @@ -20,7 +20,7 @@

Synopsis

package require tcom - ?3.8? + ?3.9?
::tcom::ref createobject @@ -286,12 +286,13 @@

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.

+ 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.

diff --git a/doc/tcom.n.xml b/doc/tcom.n.xml index f5c20e4..4794bad 100644 --- a/doc/tcom.n.xml +++ b/doc/tcom.n.xml @@ -1,10 +1,10 @@ - + - $Date: 2002/04/12 23:44:50 $ - $Revision: 1.63 $ + $Date: 2002/10/22 22:07:55 $ + $Revision: 1.65 $ tcom @@ -17,7 +17,7 @@ package require tcom - + ::tcom::ref createobject @@ -283,12 +283,13 @@ 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. + 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. diff --git a/doc/xslt.tcl b/doc/xslt.tcl index 4df74fa..6969985 100644 --- a/doc/xslt.tcl +++ b/doc/xslt.tcl @@ -1,4 +1,4 @@ -# $Id: xslt.tcl,v 1.1 2002/04/17 22:07:57 cthuang Exp $ +# $Id: xslt.tcl,v 1.2 2002/09/05 22:10:25 cthuang Exp $ # # Run an XML document through an XSLT processor. @@ -14,6 +14,7 @@ set domProgId "Msxml2.DOMDocument" set source [::tcom::ref createobject $domProgId] $source preserveWhiteSpace 1 $source validateOnParse 0 +$source resolveExternals 0 set sourceUrl [lindex $argv 0] if {![$source load $sourceUrl]} { set parseError [$source parseError] diff --git a/lib/Banking/server.tcl b/lib/Banking/server.tcl index 520e669..f31894f 100644 --- a/lib/Banking/server.tcl +++ b/lib/Banking/server.tcl @@ -1,4 +1,4 @@ -# $Id: server.tcl,v 1.3 2002/06/29 15:34:52 cthuang Exp $ +# $Id: server.tcl,v 1.4 2003/03/07 00:03:00 cthuang Exp $ package provide Banking 1.0 package require tcom @@ -34,7 +34,6 @@ proc bankImpl {method args} { switch -- $method { CreateAccount { set balance 0 - set name "" return [::tcom::object create ::Banking::Account accountImpl] } diff --git a/lib/TclScript/TclScript.dll b/lib/TclScript/TclScript.dll index 81409ac4f4f83e66ee0260c452e1e9a4eb353060..a214bbdf208352a703b0ee5e6bc1a97aa84df932 100644 GIT binary patch delta 5634 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 delta 5862 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 delta 578 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 delta 82540 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 z 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 lA#TZ<7Bz<$odfUBrTI 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 diff --git a/lib/tcom/tcom.tcl b/lib/tcom/tcom.tcl index 2044e33..58eaab4 100644 --- a/lib/tcom/tcom.tcl +++ b/lib/tcom/tcom.tcl @@ -1,6 +1,11 @@ -# $Id: tcom.tcl,v 1.14 2002/03/30 16:24:11 cthuang Exp $ +# $Id: tcom.tcl,v 1.17 2003/04/02 22:46:51 cthuang Exp $ namespace eval ::tcom { + # Tear down all event connections to the object. + proc unbind {handle} { + ::tcom::bind $handle {} + } + # Look for the file in the directories in the package load path. # Return the full path of the file. proc search_auto_path {fileSpec} { @@ -44,6 +49,7 @@ namespace eval ::tcom { set key "HKEY_CLASSES_ROOT\\$verIndependentProgId" registry set $key "" "$className Class" registry set "$key\\CLSID" "" $clsid + registry set "$key\\CurVer" "" $progId set key "HKEY_CLASSES_ROOT\\CLSID\\$clsid" registry set $key "" "$className Class" @@ -55,7 +61,6 @@ namespace eval ::tcom { if {$inproc} { set key "HKEY_CLASSES_ROOT\\CLSID\\$clsid\\InprocServer32" registry set $key "" $dllPath - registry set $key "ThreadingModel" "Apartment" } if {$local} { diff --git a/lib/tcom/tcominproc.dll b/lib/tcom/tcominproc.dll index ddedbfe09a9d270954d78f074c6024f948e743a1..519a611acaa08c35c3f9e36d74fe1d3801426287 100644 GIT binary patch delta 1380 zcmY+Edr;I>6vyvbeygCYZmzs@Db$@|CsoO{0Ko^$u? zy}#a8LvO30+XlkfRfknff+YA13!ypYNEBnGPR5e(vLO?%fddBcF~dGEXrCB1n!t}4 z<|43YtIQFAnYc1;2`t3^xMtyujWOJ6iN~t=YN)}J@q6JgF19p*7Y8hzup4WwO;Cq} z)@R^6Iuf?R^LQws6pZ*+Lfy=FEsXg+zv|ZNY-TR?S?kJ~S??$|FxJ*5__o<}UH26W zWhCI6iD{JPSfUJZcr$SZ6l;mL=~3iT>^7*z3i}+gx7#PveAHf&+&r6^Yxgr6rM2zp zoNYJE?Vj+#w}U8$&1cR5B+y7nM-K?F>?-lr6oLJfy5&bT@QtPo?E&#$;r&Yp3WR*zV;5z z%SwTbSd*1tTS5_j|G9stjKOig3sa79i9q~h5eJ6yu= za#lkTx^o?{2-oB~Osgp>)rgaf6xoAix%MeL$iw^IHOd2{{CJe7@%vmy*%ew*ck~~K zyh@lzcb(lP((_{vh;-RlG+kbvJB~PpXeW*(W{fhQ7(;6n7w0*k95>Uv4nN3qICqdj z0_!633IQUozz45z^nYvaKcz+To-!nl2eoN!eZ%tAMe`fhcp7S(>Q@vMEuQCISos1A zVokv$xP#3Fh0uqe7NkG~zbV)NZ(zyXeCWoOxqINgmRwjdZse1qdFR`bO)*sMamqhJ z+_UssDAby2=zSGxyO#MTKuAk}Wh}IGx!!Y~c75R*bp7GF>x#Id#0jEBOc5QTQxrw7 zxLw>WzAt_xhQur4peRV=B%72fO_!XKA}x>>NmbHI(sF67)GTe2x}*=KBhm$FNRs4A zxkK)h_sR$4!*aKLQa&U1%ID<^^4Id9JS6`v-;nRf!?JOnGEuQA>B=m{tvsz%E6bD( z%B#vwWuJ0LIjIDdFO^@EdrFjQQm3lfs!J_VE7TX&P3lhdpn6@nB5u`of&VlzLMWjZ%C#w-P{s{?0kS-@WJE zbI*Nen+<214X12iY;UU*F%c5sdn|&+=u^`e^Entx#LI?kybE@?j?Wm5fl=)-yl#ef zF@tl%0=1GG2XNuGIU8X;4$WyahHZ@DK1(c?$8LaKcsjNX&R~fp0Q>QR$adF1%O9tb?UPK*VRL5Uz?y3S7*p@6Axzi zXLTFtBj03((ufVmGcJQ0FJ^w3)FSF1%L1v2C(0M;)e{UFJM{Uv_0)gC*ik<<5Y^E@fqThA zCS9o?ZOEic{YNUO&bV$!;`9@w>NSa@8@JfHO4Q>-jJ!&pgw*2{(QDm3iM^Bf?Id2n-<Cv%Sgw$fpMyT(d zMmU`?i*N>E;Uszpqsd=`CHZ!`z&$iKV`skIahw<;ST~`bK_%2P=tIxY_dj2c52@q% zFBy_%f*h!>s(E#Xds)p+Z;d}twbkt|S?XC?ww?{*=7PD@K8*!Ma1OsHNP)-rQ$Zal zxT0_|^k7rrQF<~-MWr(*ek5wcGFy^4in5t${|UsSn|_8uHL#gpRiS!hi!vK7sp-3B zK+}HL2d)#YKG%@zSJz$FBbVkf@f;t=r}CM+lNb3n`1kmu{D*uO{{w%UALcE>JRw8K z6_yA~h1J43!7o$_)k2-HS5Soag>K=r@QrXo7!_8D72*l;Bk?n_S3D#3i|56#ctyM_ z-VpDI!{Vs;r}#uPNKqciDy2y2(qf61N~Bk$DrvXWBDG4L(n;wn>Adu#bWM6FO_yWk tB-tsu<&|=|yiMLIACNockbG7S%U5Ko@yKq@e5g6fgy$Th0nN>e{{bpk)zSa} diff --git a/lib/tcom/tcomlocal.exe b/lib/tcom/tcomlocal.exe index f71826876875e4a554f8baa1f37ec917ad40f354..42df14c8aee3a98b6b9f5aa2ac3eec29334d10f7 100644 GIT binary patch delta 502 zcmX@uz;v*IX#)o%%kj)r_M3Sa&x$YxY`!HrgHb9V$${bjBo8JAhUOzI-K`S;|Nrmy zUPtt(9(O0aAtvQ@Ny%yZ&GRf^JuifEQbU z44^5CL1s4F226gerBV+zKZvLKh)AdFkLKDR45fU>SwVszV0_?p!a}g>3KoVElWtxR zyE~Ajn`vaPrHjh zC&_`KljFbW7YC5J8I#L(?Dl30$wzJ{Qp1l@Qx0U^z_L_2CgiDKt-Dy4eI$P8nA70*aD529gZAqjGrbSbXR2D zF!`~&H6!yo-=JGRNZ4JH7D^SdPg delta 504 zcmX@uz;v*IX#)o%%hGwpwwrkv&x$anY`!HrgHb9a$${bjBo8JAhUOzI-K`S;|Nrmy zUPtt(9(O0aAtvQ@LcDZ9yh5lqz<+as<5C z!T>gBF-Qz3Gx?#GN3nrnYBl=2;C1#1E-Ha_q=VIf#`1q(xoNjEQu z-5to%&9pcH#DepkSQclX3UDmW0Sdg9JI)GH2?EDiK}ta2I4ejF1iB};Xh%(cpxwbA zljOkA$?;$Giv!5qh{@$T_Ix2AG1n=*u2Ta3n+9w?q9en^_-gV)J$c4clNt5JBsTx~ z|G&5Qz&~K9h|U1&JG`U9*@5BZoXPt7{)|48>-FnR&in={@dcXO;|P*ZZ~@Bi0E(S~ zgKpP10WTUq{{J6&ct;0Fdgf#!16P({prXx<2KD?C4cIn0Y=Oqj4o40)#t)MZx+^kn zoc!3`nvrX=yoWU7k;&E`lNrBmKJRf*otJ}wnSmGRH!wYUZoz3ri_MvZ!i+$wwy2wz Ob-__XTc*jp4JH5`D!gO> diff --git a/samples/chart.tcl b/samples/chart.tcl index cb34c09..fbfd15f 100644 --- a/samples/chart.tcl +++ b/samples/chart.tcl @@ -1,4 +1,4 @@ -# $Id: chart.tcl,v 1.1 2001/08/18 00:35:52 cthuang Exp $ +# $Id: chart.tcl,v 1.5 2004/02/26 18:07:38 cthuang Exp $ # # This example controls Excel. It performs the following steps. # - Start Excel application. @@ -16,28 +16,16 @@ set workbook [$workbooks Add] set worksheets [$workbook Worksheets] set worksheet [$worksheets Item [expr 1]] -set cells [$worksheet Cells] -$cells Item 1 A "North" -$cells Item 1 B "South" -$cells Item 1 C "East" -$cells Item 1 D "West" -$cells Item 2 A 5.2 -$cells Item 2 B 10.0 -$cells Item 2 C 8.0 -$cells Item 2 D 20.0 +set data [list \ + [list "North" "South" "East" "West"] \ + [list 5.2 10.0 8.0 20.0] \ +] set sourceRange [$worksheet Range "A1" "D2"] +$sourceRange Value $data set charts [$workbook Charts] set chart [$charts Add] -$chart ChartWizard \ - $sourceRange \ - [expr -4102] \ - [expr 7] \ - [expr 1] \ - [expr 1] \ - [expr 0] \ - 0 \ - "Sales Percentages" +$chart ChartWizard $sourceRange 5 [::tcom::na] 1 1 0 0 "Sales Percentages" # Prevent Excel from prompting to save the document on close. $workbook Saved 1 diff --git a/samples/excel.tcl b/samples/excel.tcl index 4bc3031..b00459e 100644 --- a/samples/excel.tcl +++ b/samples/excel.tcl @@ -1,4 +1,4 @@ -# $Id: excel.tcl,v 1.9 2001/06/30 18:42:58 cthuang Exp $ +# $Id: excel.tcl,v 1.10 2002/09/27 22:11:03 cthuang Exp $ # # This example controls Excel. It performs the following steps. # - Start Excel application. @@ -13,6 +13,7 @@ package require tcom proc dumpInterface {obj} { set interface [::tcom::info interface $obj] + puts "interface [$interface name]" set properties [$interface properties] foreach property $properties { diff --git a/src/Arguments.cpp b/src/Arguments.cpp index 4ed82a7..b92e4a7 100644 --- a/src/Arguments.cpp +++ b/src/Arguments.cpp @@ -1,4 +1,4 @@ -// $Id: Arguments.cpp,v 1.33 2002/07/09 04:10:08 cthuang Exp $ +// $Id: Arguments.cpp,v 1.35 2003/03/15 01:32:09 cthuang Exp $ #include "Arguments.h" #include "Extension.h" #include "TclObject.h" @@ -45,7 +45,11 @@ TypedArguments::initArgument ( // For out parameters, set a pointer to where the out value // will be stored. - if (vt == VT_USERDEFINED) { + if (vt == VT_INT) { + // IDispatch::Invoke returns DISP_E_TYPEMISMATCH on + // VT_INT | VT_BYREF parameters. + vt = VT_I4; + } else if (vt == VT_USERDEFINED) { // Assume user defined types derive from IUnknown. vt = VT_UNKNOWN; } @@ -57,7 +61,7 @@ TypedArguments::initArgument ( m_args[argIndex].vt = VT_BYREF | vt; } - if (vt == VT_VARIANT) { + if (vt == VT_VARIANT || vt == VT_DECIMAL) { // Set a pointer to out variant. m_args[argIndex].byref = &m_outValues[argIndex]; } else { diff --git a/src/ComObject.cpp b/src/ComObject.cpp index e0fc187..beb4e9b 100644 --- a/src/ComObject.cpp +++ b/src/ComObject.cpp @@ -1,4 +1,4 @@ -// $Id: ComObject.cpp,v 1.37 2002/05/31 04:03:06 cthuang Exp $ +// $Id: ComObject.cpp,v 1.41 2003/04/04 23:55:04 cthuang Exp $ #pragma warning(disable: 4786) #include "ComObject.h" #include @@ -16,14 +16,17 @@ static const char setPrefix[] = "_set_"; ComObject::ComObject (const Class::Interfaces &interfaces, Tcl_Interp *interp, TclObject servant, - TclObject destructor): + TclObject destructor, + bool isSink): m_refCount(0), m_defaultInterface(*(interfaces.front())), m_interp(interp), m_servant(servant), m_destructor(destructor), m_supportErrorInfo(*this), - m_pDispatch(0) + m_pDispatch(0), + m_registeredActiveObject(false), + m_isSink(isSink) { // Tcl_Preserve(reinterpret_cast(m_interp)); ComModule::instance().lock(); @@ -86,16 +89,18 @@ ComObject::newInstance ( const Interface &defaultInterface, Tcl_Interp *interp, TclObject servant, - TclObject destructor) + TclObject destructor, + bool isSink) { Class::Interfaces interfaces; interfaces.push_back(&defaultInterface); return new ComObject( - interfaces, - interp, - servant, - destructor); + interfaces, + interp, + servant, + destructor, + isSink); } ComObject * @@ -105,12 +110,12 @@ ComObject::newInstance ( TclObject servant, TclObject destructor) { - ComObject *pComObject = new ComObject( - interfaces, - interp, - servant, - destructor); - return pComObject; + return new ComObject( + interfaces, + interp, + servant, + destructor, + false); } int @@ -190,9 +195,9 @@ HRESULT ComObject::queryInterface (REFIID iid, void **ppvObj) { if (IsEqualIID(iid, IID_IUnknown)) { - *ppvObj = m_pDefaultAdapter; + *ppvObj = m_pDefaultAdapter; addRef(); - return S_OK; + return S_OK; } if (IsEqualIID(iid, IID_IDispatch)) { @@ -200,15 +205,15 @@ ComObject::queryInterface (REFIID iid, void **ppvObj) if (m_pDispatch == 0) { m_pDispatch = new InterfaceAdapter(*this, m_defaultInterface, true); } - *ppvObj = m_pDispatch; + *ppvObj = m_pDispatch; addRef(); - return S_OK; + return S_OK; } if (IsEqualIID(iid, IID_ISupportErrorInfo)) { - *ppvObj = &m_supportErrorInfo; + *ppvObj = &m_supportErrorInfo; addRef(); - return S_OK; + return S_OK; } InterfaceAdapter *pAdapter = m_iidToAdapterMap.find(iid); @@ -220,9 +225,9 @@ ComObject::queryInterface (REFIID iid, void **ppvObj) } if (pAdapter != 0) { - *ppvObj = pAdapter; + *ppvObj = pAdapter; addRef(); - return S_OK; + return S_OK; } *ppvObj = 0; @@ -241,7 +246,7 @@ ComObject::release () { InterlockedDecrement(&m_refCount); if (m_refCount == 0) { - delete this; + delete this; return 0; } return m_refCount; @@ -447,13 +452,22 @@ ComObject::invoke (InterfaceAdapter *pAdapter, // Execute the Tcl script. TclObject result; int completionCode = eval(script, &result); - if (completionCode != TCL_OK) { - fillExcepInfo( - pExcepInfo, - hresultFromErrorCode(), - m_servant.c_str(), - result.c_str()); - return DISP_E_EXCEPTION; + if (completionCode == TCL_OK) { + hresult = S_OK; + } else { + if (m_isSink) { + Tcl_BackgroundError(m_interp); + } + + hresult = hresultFromErrorCode(); + if (FAILED(hresult)) { + fillExcepInfo( + pExcepInfo, + hresult, + m_servant.c_str(), + result.c_str()); + hresult = DISP_E_EXCEPTION; + } } // Copy values to out arguments. @@ -482,8 +496,6 @@ ComObject::invoke (InterfaceAdapter *pAdapter, // from methods. result.toVariant(pReturnValue, pMethod->type(), m_interp, true); } - - hresult = S_OK; } catch (_com_error &e) { fillExcepInfo(pExcepInfo, e.Error(), m_servant.c_str(), 0); @@ -549,19 +561,29 @@ convertNativeToTclObject (va_list pArg, { #if TCL_MINOR_VERSION >= 2 // Uses Unicode function introduced in Tcl 8.2. - Tcl_UniChar *pUnicode = va_arg(pArg, Tcl_UniChar *); + Tcl_UniChar *pUnicode = byRef ? + *va_arg(pArg, Tcl_UniChar **) : va_arg(pArg, Tcl_UniChar *); if (pUnicode != 0) { tclObject = Tcl_NewUnicodeObj(pUnicode, -1); } else { tclObject = Tcl_NewObj(); } #else - _bstr_t str(va_arg(pArg, wchar_t *)); + wchar_t *pUnicode = byRef ? + *va_arg(pArg, wchar_t **) : va_arg(pArg, wchar_t *); + _bstr_t str(pUnicode); tclObject = Tcl_NewStringObj(str, -1); #endif } break; + case VT_VARIANT: + tclObject = TclObject( + byRef ? va_arg(pArg, VARIANT *) : &va_arg(pArg, VARIANT), + type, + interp); + break; + default: tclObject = Tcl_NewLongObj( byRef ? *va_arg(pArg, int *) : va_arg(pArg, int)); @@ -711,6 +733,10 @@ nextArgument (va_list pArg, const Type &type) va_arg(pArg, BSTR); break; + case VT_VARIANT: + va_arg(pArg, VARIANT); + break; + default: va_arg(pArg, int); } @@ -752,10 +778,10 @@ setErrorInfo (const char *source, const char *description) void __cdecl invokeComObjectFunction (volatile HRESULT hresult, volatile DWORD pArgEnd, - DWORD /*ebp*/, - DWORD funcIndex, - DWORD /*retAddr*/, - InterfaceAdapter *pAdapter, + DWORD /*ebp*/, + DWORD funcIndex, + DWORD /*retAddr*/, + InterfaceAdapter *pAdapter, ...) { // Get the method description for method being invoked. @@ -812,7 +838,9 @@ invokeComObjectFunction (volatile HRESULT hresult, hresult = S_OK; } else { hresult = object.hresultFromErrorCode(); - setErrorInfo(object.m_servant.c_str(), result.c_str()); + if (FAILED(hresult)) { + setErrorInfo(object.m_servant.c_str(), result.c_str()); + } } // Copy values to out arguments. diff --git a/src/ComObject.h b/src/ComObject.h index 1d71c0a..3868e2f 100644 --- a/src/ComObject.h +++ b/src/ComObject.h @@ -1,4 +1,4 @@ -// $Id: ComObject.h,v 1.14 2002/04/13 03:53:56 cthuang Exp $ +// $Id: ComObject.h,v 1.15 2002/10/22 22:07:55 cthuang Exp $ #ifndef COMOBJECT_H #define COMOBJECT_H @@ -67,12 +67,16 @@ class TCOM_API ComObject // true if object registered in running object table bool m_registeredActiveObject; + // true if object is an event sink + bool m_isSink; + // Do not allow others to create or copy instances of this class. ComObject( const Class::Interfaces &interfaces, Tcl_Interp *interp, TclObject servant, - TclObject destructor); + TclObject destructor, + bool isSink); ComObject(const ComObject &); // not implemented void operator=(const ComObject &); // not implemented @@ -91,7 +95,8 @@ public: const Interface &defaultInterface, Tcl_Interp *interp, TclObject servant, - TclObject destructor); + TclObject destructor, + bool isSink = false); static ComObject *newInstance( const Class::Interfaces &interfaces, Tcl_Interp *interp, diff --git a/src/Extension.cpp b/src/Extension.cpp index ab53fba..85d4abe 100644 --- a/src/Extension.cpp +++ b/src/Extension.cpp @@ -1,4 +1,4 @@ -// $Id: Extension.cpp,v 1.1 2002/06/29 15:40:32 cthuang Exp $ +// $Id: Extension.cpp,v 1.3 2003/04/02 22:46:51 cthuang Exp $ #pragma warning(disable: 4786) #include "Extension.h" #include "ComModule.h" @@ -35,6 +35,8 @@ Extension::Extension (Tcl_Interp *interp): interp, PACKAGE_NAMESPACE "null", nullCmd, 0, 0); Tcl_CreateObjCommand( interp, PACKAGE_NAMESPACE "object", objectCmd, this, 0); + Tcl_CreateObjCommand( + interp, PACKAGE_NAMESPACE "outputdebug", outputdebugCmd, this, 0); Tcl_CreateObjCommand( interp, PACKAGE_NAMESPACE "property", propertyCmd, 0, 0); Tcl_CreateObjCommand( @@ -46,7 +48,7 @@ Extension::Extension (Tcl_Interp *interp): Tcl_CreateObjCommand( interp, PACKAGE_NAMESPACE "typeof", typeofCmd, 0, 0); Tcl_CreateObjCommand( - interp, PACKAGE_NAMESPACE "unbind", unbindCmd, 0, 0); + interp, PACKAGE_NAMESPACE "variant", variantCmd, 0, 0); Tcl_CallWhenDeleted(interp, interpDeleteProc, this); Tcl_CreateExitHandler(exitProc, this); @@ -97,3 +99,30 @@ Extension::typeofCmd ( Tcl_SetResult(interp, name, TCL_STATIC); return TCL_OK; } + +// This Tcl command outputs a string to the debug stream. + +int +Extension::outputdebugCmd ( + ClientData, + Tcl_Interp *interp, + int objc, + Tcl_Obj *CONST objv[]) +{ + if (objc != 2) { + Tcl_WrongNumArgs(interp, 1, objv, "message"); + return TCL_ERROR; + } + + Tcl_Obj *pMessage = objv[1]; + Tcl_Obj *pWithNewLine = + Tcl_IsShared(pMessage) ? Tcl_DuplicateObj(pMessage) : pMessage; + + Tcl_AppendToObj(pWithNewLine, "\n", 1); + OutputDebugString(Tcl_GetStringFromObj(pWithNewLine, 0)); + + if (Tcl_IsShared(pMessage)) { + Tcl_DecrRefCount(pWithNewLine); + } + return TCL_OK; +} diff --git a/src/Extension.h b/src/Extension.h index de47b6c..7eb7116 100644 --- a/src/Extension.h +++ b/src/Extension.h @@ -1,4 +1,4 @@ -// $Id: Extension.h,v 1.1 2002/06/29 15:40:32 cthuang Exp $ +// $Id: Extension.h,v 1.5 2003/04/02 22:46:51 cthuang Exp $ #ifndef EXTENSION_H #define EXTENSION_H @@ -47,12 +47,13 @@ class TCOM_API Extension static int naCmd(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST []); static int nullCmd(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST []); static int objectCmd(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST []); + static int outputdebugCmd(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST []); static int propertyCmd(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST []); static int refCmd(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST []); static int shortPathNameCmd(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST []); static int typelibCmd(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST []); static int typeofCmd(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST []); - static int unbindCmd(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST []); + static int variantCmd(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST []); // not implemented Extension(const Extension &); @@ -84,10 +85,17 @@ public: static Tcl_ObjType naType; static Tcl_ObjType nullType; static Tcl_ObjType unknownPointerType; + static Tcl_ObjType variantType; // Create a Tcl value representing a missing optional argument. static Tcl_Obj *newNaObj(); + // Create a Tcl value representing a SQL-style null. + static Tcl_Obj *newNullObj(); + + // Create a Tcl value representing a VARIANT. + static Tcl_Obj *newVariantObj(_variant_t *pVar); + // Set the Tcl result to a description of the COM error and return TCL_ERROR. static int setComErrorResult( Tcl_Interp *interp, _com_error &e, const char *file, int line); diff --git a/src/HandleSupport.cpp b/src/HandleSupport.cpp index 2795dcf..d4d75df 100644 --- a/src/HandleSupport.cpp +++ b/src/HandleSupport.cpp @@ -1,4 +1,4 @@ -// $Id: HandleSupport.cpp,v 1.15 2002/05/31 04:03:06 cthuang Exp $ +// $Id: HandleSupport.cpp,v 1.19 2003/07/17 22:33:31 cthuang Exp $ #include "HandleSupport.h" #include #include "ThreadLocalStorage.h" @@ -20,13 +20,16 @@ InternalRep::InternalRep ( objClientData, 0); - HandleNameToRepMap::instance(interp)->insert(handleName.c_str(), this); + m_pNameEntry = HandleNameToRepMap::instance(interp)->insert( + handleName.c_str(), this); } InternalRep::~InternalRep () { - HandleNameToRepMap::instance(m_interp)->erase(name().c_str()); - Tcl_DeleteCommandFromToken(m_interp, m_command); + HandleNameToRepMap::erase(m_pNameEntry); + if (!Tcl_InterpDeleted(m_interp)) { + Tcl_DeleteCommandFromToken(m_interp, m_command); + } } std::string @@ -58,7 +61,7 @@ InternalRep::decrHandleCount () class ObjToRepMap { - Tcl_HashTable m_hashTable; + Tcl_HashTable m_objMap; static ThreadLocalStorage ms_tls; @@ -89,7 +92,7 @@ ObjToRepMap::exitProc (ClientData clientData) ObjToRepMap::ObjToRepMap () { - Tcl_InitHashTable(&m_hashTable, TCL_ONE_WORD_KEYS); + Tcl_InitHashTable(&m_objMap, TCL_ONE_WORD_KEYS); #ifdef TCL_THREADS Tcl_CreateThreadExitHandler(exitProc, this); @@ -100,7 +103,7 @@ ObjToRepMap::ObjToRepMap () ObjToRepMap::~ObjToRepMap () { - Tcl_DeleteHashTable(&m_hashTable); + Tcl_DeleteHashTable(&m_objMap); } ObjToRepMap & @@ -114,7 +117,7 @@ ObjToRepMap::insert (Tcl_Obj *pObj, InternalRep *pRep) { int isNew; Tcl_HashEntry *pEntry = Tcl_CreateHashEntry( - &m_hashTable, reinterpret_cast(pObj), &isNew); + &m_objMap, reinterpret_cast(pObj), &isNew); Tcl_SetHashValue(pEntry, pRep); } @@ -122,7 +125,7 @@ InternalRep * ObjToRepMap::find (Tcl_Obj *pObj) { Tcl_HashEntry *pEntry = Tcl_FindHashEntry( - &m_hashTable, reinterpret_cast(pObj)); + &m_objMap, reinterpret_cast(pObj)); if (pEntry == 0) { return 0; } @@ -133,7 +136,7 @@ void ObjToRepMap::erase (Tcl_Obj *pObj) { Tcl_HashEntry *pEntry = Tcl_FindHashEntry( - &m_hashTable, reinterpret_cast(pObj)); + &m_objMap, reinterpret_cast(pObj)); if (pEntry != 0) { Tcl_DeleteHashEntry(pEntry); } @@ -176,8 +179,9 @@ CmdNameType::freeInternalRep (Tcl_Obj *pObj) { if (pObj->refCount == 0) { InternalRep *pRep = ObjToRepMap::instance().find(pObj); - if (pRep != 0 && pRep->decrHandleCount() == 0) { + if (pRep != 0) { ObjToRepMap::instance().erase(pObj); + pRep->decrHandleCount(); } } @@ -236,6 +240,8 @@ static char ASSOC_KEY[] = "tcomHandles"; HandleNameToRepMap::HandleNameToRepMap (Tcl_Interp *interp): m_interp(interp) { + Tcl_InitHashTable(&m_handleMap, TCL_STRING_KEYS); + Tcl_SetAssocData(interp, ASSOC_KEY, deleteInterpProc, this); Tcl_CreateExitHandler(exitProc, this); } @@ -243,7 +249,15 @@ HandleNameToRepMap::HandleNameToRepMap (Tcl_Interp *interp): HandleNameToRepMap::~HandleNameToRepMap () { // Clean up any left over objects. - clear(); + Tcl_HashSearch search; + Tcl_HashEntry *pEntry = Tcl_FirstHashEntry(&m_handleMap, &search); + while (pEntry != 0) { + Tcl_HashEntry *pNext = Tcl_NextHashEntry(&search); + delete static_cast(Tcl_GetHashValue(pEntry)); + pEntry = pNext; + } + + Tcl_DeleteHashTable(&m_handleMap); } void @@ -268,9 +282,30 @@ HandleNameToRepMap::instance (Tcl_Interp *interp) Tcl_GetAssocData(interp, ASSOC_KEY, 0)); } +Tcl_HashEntry * +HandleNameToRepMap::insert (const char *handleStr, InternalRep *pRep) +{ + int isNew; + Tcl_HashEntry *pEntry = Tcl_CreateHashEntry( + &m_handleMap, const_cast(handleStr), &isNew); + Tcl_SetHashValue(pEntry, static_cast(pRep)); + return pEntry; +} + +InternalRep * +HandleNameToRepMap::find (Tcl_Obj *pHandle) const +{ + char *key = Tcl_GetStringFromObj(pHandle, 0); + Tcl_HashEntry *pEntry = Tcl_FindHashEntry( + const_cast(&m_handleMap), key); + if (pEntry == 0) { + return 0; + } + return static_cast(Tcl_GetHashValue(pEntry)); +} + void -HandleNameToRepMap::clear () +HandleNameToRepMap::erase (Tcl_HashEntry *pNameEntry) { - m_map.forEach(Delete()); - m_map.clear(); + Tcl_DeleteHashEntry(pNameEntry); } diff --git a/src/HandleSupport.h b/src/HandleSupport.h index 51ad6c0..d96a1fb 100644 --- a/src/HandleSupport.h +++ b/src/HandleSupport.h @@ -1,11 +1,10 @@ -// $Id: HandleSupport.h,v 1.27 2002/04/17 21:43:07 cthuang Exp $ +// $Id: HandleSupport.h,v 1.29 2003/07/17 22:33:31 cthuang Exp $ #ifndef HANDLESUPPORT_H #define HANDLESUPPORT_H #include #include #include "tcomApi.h" -#include "HashTable.h" #include "Singleton.h" // This class represents an association from a handle to an application object. @@ -17,6 +16,7 @@ protected: Tcl_Interp *m_interp; Tcl_Command m_command; ClientData m_clientData; + Tcl_HashEntry *m_pNameEntry; // number of Tcl_Obj instances that are handles to this object long m_handleCount; @@ -94,16 +94,16 @@ public: Tcl_Obj *newObj(Tcl_Interp *interp, InternalRep *pRep); }; -// Maps handle name to internal representation. There's an instance of this -// class associated with each Tcl interpreter that loads the extension. +// Maps string representation of handle to internal representation. There's an +// instance of this class associated with each Tcl interpreter that loads the +// extension. class TCOM_API HandleNameToRepMap { Tcl_Interp *m_interp; // handle string representation to internal representation map - typedef StringHashTable Map; - Map m_map; + Tcl_HashTable m_handleMap; static void deleteInterpProc(ClientData clientData, Tcl_Interp *interp); static void exitProc(ClientData clientData); @@ -117,19 +117,13 @@ public: static HandleNameToRepMap *instance(Tcl_Interp *interp); // Insert handle to object mapping. - void insert (const char *handleStr, InternalRep *pRep) - { m_map.insert(handleStr, pRep); } + Tcl_HashEntry *insert(const char *handleStr, InternalRep *pRep); // Get the object represented by the handle. - InternalRep *find (Tcl_Obj *pHandle) const - { return m_map.find(Tcl_GetStringFromObj(pHandle, 0)); } + InternalRep *find(Tcl_Obj *pHandle) const; // Remove handle to object mapping. - void erase (const char *handleStr) - { m_map.erase(handleStr); } - - // Clean all handles. - void clear(); + static void erase(Tcl_HashEntry *pNameEntry); }; // This class provides functions to map handles to objects of a specific @@ -150,10 +144,6 @@ public: // ownership of the application object and is responsible for deleting it. Tcl_Obj *newObj(Tcl_Interp *interp, AppType *pAppObject); - // Get count of matching elements. - size_t count (Tcl_Interp *interp, Tcl_Obj *pHandle) const - { return HandleNameToRepMap::instance(interp)->count(pHandle); } - // Get the application object represented by the handle. If the handle // is invalid, return 0. AppType *find(Tcl_Interp *interp, Tcl_Obj *pHandle) const; diff --git a/src/HashTable.h b/src/HashTable.h index 8b1d3d3..120b029 100644 --- a/src/HashTable.h +++ b/src/HashTable.h @@ -1,4 +1,4 @@ -// $Id: HashTable.h,v 1.21 2002/04/13 03:53:56 cthuang Exp $ +// $Id: HashTable.h,v 1.22 2003/07/17 22:33:31 cthuang Exp $ #ifndef HASHTABLE_H #define HASHTABLE_H @@ -118,6 +118,7 @@ HashTable::erase (const K &key) } } +#if 0 // This class wraps a Tcl hash table that uses null-terminated strings as keys. // The mapped type is assumed to be a pointer type. @@ -172,5 +173,6 @@ StringHashTable::erase (const char *key) Tcl_DeleteHashEntry(pEntry); } } +#endif #endif diff --git a/src/Makefile b/src/Makefile index 9ce33e0..9c9c309 100644 --- a/src/Makefile +++ b/src/Makefile @@ -1,21 +1,27 @@ -# $Id: Makefile,v 1.10 2002/05/31 04:03:06 cthuang Exp $ +# $Id: Makefile,v 1.12 2003/07/24 22:46:35 cthuang Exp $ debug: tclsh &&| set libDir [file join [info library] "../tcom"] +file copy -force ../lib/tcom/pkgIndex.tcl $libDir +file copy -force ../lib/tcom/tcom.tcl $libDir file copy -force Debug/tcom.dll $libDir file copy -force dllserver_Debug/tcominproc.dll $libDir file copy -force exeserver_Debug/tcomlocal.exe $libDir set libDir [file join [info library] "../TclScript"] file copy -force TclScript_Debug/TclScript.dll $libDir +file copy -force TclScript_Debug/TclScript.tlb $libDir | release: tclsh &&| set libDir [file join [info library] "../tcom"] +file copy -force ../lib/tcom/pkgIndex.tcl $libDir +file copy -force ../lib/tcom/tcom.tcl $libDir file copy -force Release/tcom.dll $libDir file copy -force dllserver_Release/tcominproc.dll $libDir file copy -force exeserver_Release/tcomlocal.exe $libDir set libDir [file join [info library] "../TclScript"] file copy -force TclScript_Release/TclScript.dll $libDir +file copy -force TclScript_Release/TclScript.tlb $libDir | diff --git a/src/Reference.cpp b/src/Reference.cpp index 49e9a79..9a7f448 100644 --- a/src/Reference.cpp +++ b/src/Reference.cpp @@ -1,4 +1,4 @@ -// $Id: Reference.cpp,v 1.69 2002/06/28 00:53:46 cthuang Exp $ +// $Id: Reference.cpp,v 1.73 2003/11/06 15:29:01 cthuang Exp $ #pragma warning(disable: 4786) #include #include "ComObject.h" @@ -35,7 +35,8 @@ Reference::Connection::Connection (Tcl_Interp *interp, eventInterfaceDesc, interp, servant, - ""); + "", + true); // Connect to connection point. hr = m_pConnectionPoint->Advise(pComObject->unknown(), &m_adviseCookie); @@ -159,6 +160,21 @@ Reference::operator== (const Reference &rhs) const return result; } +static void +throwDispatchException (EXCEPINFO &excepInfo) +{ + // Clean up exception information strings. + _bstr_t source(excepInfo.bstrSource, false); + _bstr_t description(excepInfo.bstrDescription, false); + _bstr_t helpFile(excepInfo.bstrHelpFile, false); + + HRESULT hr = excepInfo.scode; + if (hr == 0) { + hr = _com_error::WCodeToHRESULT(excepInfo.wCode); + } + throw DispatchException(hr, description); +} + HRESULT Reference::invokeDispatch ( MEMBERID memberid, @@ -214,16 +230,7 @@ Reference::invokeDispatch ( &argErr); if (hr == DISP_E_EXCEPTION) { - // Clean up exception information strings. - _bstr_t source(excepInfo.bstrSource, false); - _bstr_t description(excepInfo.bstrDescription, false); - _bstr_t helpFile(excepInfo.bstrHelpFile, false); - - hr = excepInfo.scode; - if (hr == 0) { - hr = _com_error::WCodeToHRESULT(excepInfo.wCode); - } - throw DispatchException(hr, description); + throwDispatchException(excepInfo); } return hr; @@ -254,6 +261,10 @@ Reference::invoke (MEMBERID memberid, if (SUCCEEDED(hr)) { return hr; } + + if (hr == DISP_E_EXCEPTION) { + throwDispatchException(excepInfo); + } } return invokeDispatch(memberid, dispatchFlags, arguments, pResult); @@ -518,11 +529,11 @@ Reference::getActiveObject (const char *progId) } Reference * -Reference::getObject (const char *displayName) +Reference::getObject (const wchar_t *displayName) { IUnknown *pUnknown; HRESULT hr = CoGetObject( - _bstr_t(displayName), + displayName, NULL, IID_IUnknown, reinterpret_cast(&pUnknown)); diff --git a/src/Reference.h b/src/Reference.h index 5c423d5..fc46931 100644 --- a/src/Reference.h +++ b/src/Reference.h @@ -1,4 +1,4 @@ -// $Id: Reference.h,v 1.41 2002/06/12 02:14:08 cthuang Exp $ +// $Id: Reference.h,v 1.42 2003/11/06 15:29:01 cthuang Exp $ #ifndef REFERENCE_H #define REFERENCE_H @@ -132,7 +132,7 @@ public: static Reference *getActiveObject(const char *progId); // Get an object using CoGetObject and construct a reference. - static Reference *getObject(const char *displayName); + static Reference *getObject(const wchar_t *displayName); // Get raw interface pointer. IUnknown *unknown () const diff --git a/src/TclObject.cpp b/src/TclObject.cpp index dc164f7..8c24d8a 100644 --- a/src/TclObject.cpp +++ b/src/TclObject.cpp @@ -1,5 +1,6 @@ -// $Id: TclObject.cpp,v 1.29 2002/05/31 04:03:06 cthuang Exp $ +// $Id: TclObject.cpp,v 1.35 2003/05/12 23:30:43 cthuang Exp $ #include "TclObject.h" +#include #ifdef WIN32 #include "Extension.h" #include "Reference.h" @@ -152,112 +153,161 @@ TclObject::lappend (Tcl_Obj *pElement) } #ifdef WIN32 +// Convert SAFEARRAY to a Tcl value. -TclObject::TclObject (VARIANT *pSrc, const Type &type, Tcl_Interp *interp) +static Tcl_Obj * +convertFromSafeArray ( + SAFEARRAY *psa, + VARTYPE vt, + unsigned dim, + long *pIndices, + const Type &type, + Tcl_Interp *interp) { HRESULT hr; - if (V_VT(pSrc) & VT_ARRAY) { - // We can handle only one-dimensional arrays. - SAFEARRAY *psa = V_ARRAY(pSrc); - if (SafeArrayGetDim(psa) != 1) { - _com_issue_error(E_INVALIDARG); + // Get index range. + long lowerBound; + hr = SafeArrayGetLBound(psa, dim, &lowerBound); + if (FAILED(hr)) { + _com_issue_error(hr); + } + + long upperBound; + hr = SafeArrayGetUBound(psa, dim, &upperBound); + if (FAILED(hr)) { + _com_issue_error(hr); + } + + Tcl_Obj *pResult; + if (dim < SafeArrayGetDim(psa)) { + // Create list of list for multi-dimensional array. + 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_ListObjAppendElement(interp, pResult, pElement); } + return pResult; + } - // Get index range. - long lowerBound; - hr = SafeArrayGetLBound(psa, 1, &lowerBound); + if (vt == VT_UI1 && SafeArrayGetDim(psa) == 1) { + unsigned char *pData; + hr = SafeArrayAccessData(psa, reinterpret_cast(&pData)); if (FAILED(hr)) { _com_issue_error(hr); } - long upperBound; - hr = SafeArrayGetUBound(psa, 1, &upperBound); + long length = upperBound - lowerBound + 1; + pResult = +#if TCL_MINOR_VERSION >= 1 + // Convert array of bytes to Tcl byte array. + Tcl_NewByteArrayObj(pData, length); +#else + // Convert array of bytes to Tcl string. + Tcl_NewStringObj(reinterpret_cast(pData), length); +#endif + + hr = SafeArrayUnaccessData(psa); if (FAILED(hr)) { _com_issue_error(hr); } - // Get element type. - VARTYPE vt = V_VT(pSrc) & VT_TYPEMASK; + } else { + // Create list of Tcl values. + pResult = Tcl_NewListObj(0, 0); + for (long i = lowerBound; i <= upperBound; ++i) { + _variant_t elementVar; + + pIndices[dim - 1] = i; + if (vt == VT_VARIANT) { + hr = SafeArrayGetElement(psa, pIndices, &elementVar); + } else { + // I hope the element can be contained in a VARIANT. + V_VT(&elementVar) = vt; + hr = SafeArrayGetElement(psa, pIndices, &elementVar.punkVal); + } + if (FAILED(hr)) { + _com_issue_error(hr); + } - switch (vt) { - case VT_UNKNOWN: - case VT_DISPATCH: - // Convert array of IUnknown to Tcl list of interface pointer - // handles. - { - IUnknown **pData; - hr = SafeArrayAccessData( - psa, reinterpret_cast(&pData)); - if (FAILED(hr)) { - _com_issue_error(hr); - } + TclObject element(&elementVar, type, interp); + Tcl_ListObjAppendElement(interp, pResult, element); + } + } - m_pObj = Tcl_NewListObj(0, 0); - for (long i = lowerBound; i <= upperBound; ++i) { - Tcl_Obj *pElement = - Extension::referenceHandles.newObj( - interp, Reference::newReference(pData[i])); - Tcl_ListObjAppendElement(interp, m_pObj, pElement); - } + return pResult; +} - hr = SafeArrayUnaccessData(psa); - if (FAILED(hr)) { - _com_issue_error(hr); - } - } - break; +// Fill SAFEARRAY from Tcl list. - case VT_UI1: - { - unsigned char *pData; - hr = SafeArrayAccessData( - psa, reinterpret_cast(&pData)); - if (FAILED(hr)) { - _com_issue_error(hr); - } +static void +fillSafeArray ( + Tcl_Obj *pList, + SAFEARRAY *psa, + unsigned dim, + long *pIndices, + Tcl_Interp *interp, + bool addRef) +{ + HRESULT hr; - long length = upperBound - lowerBound + 1; - m_pObj = -#if TCL_MINOR_VERSION >= 1 - // Convert array of bytes to Tcl byte array. - Tcl_NewByteArrayObj(pData, length); -#else - // Convert array of bytes to Tcl string. - Tcl_NewStringObj(reinterpret_cast(pData), length); -#endif + // Get index range. + long lowerBound; + hr = SafeArrayGetLBound(psa, dim, &lowerBound); + if (FAILED(hr)) { + _com_issue_error(hr); + } - hr = SafeArrayUnaccessData(psa); - if (FAILED(hr)) { - _com_issue_error(hr); - } - } - break; + long upperBound; + hr = SafeArrayGetUBound(psa, dim, &upperBound); + if (FAILED(hr)) { + _com_issue_error(hr); + } - default: - // Convert array of other types to Tcl list of objects. - { - m_pObj = Tcl_NewListObj(0, 0); - for (long i = lowerBound; i <= upperBound; ++i) { - _variant_t elementVar; - - if (vt == VT_VARIANT) { - hr = SafeArrayGetElement(psa, &i, &elementVar); - } else { - // I hope the element can be contained in a VARIANT. - V_VT(&elementVar) = vt; - hr = SafeArrayGetElement( - psa, &i, &elementVar.punkVal); - } - if (FAILED(hr)) { - _com_issue_error(hr); - } + int numElements; + Tcl_Obj **pElements; + if (Tcl_ListObjGetElements(interp, pList, &numElements, &pElements) + != TCL_OK) { + _com_issue_error(E_INVALIDARG); + } - TclObject element(&elementVar, type, interp); - Tcl_ListObjAppendElement(interp, m_pObj, element); - } + unsigned dim1 = dim - 1; + if (dim < SafeArrayGetDim(psa)) { + // Create list of list for multi-dimensional array. + for (int i = 0; i < numElements; ++i) { + pIndices[dim1] = i; + fillSafeArray(pElements[i], psa, dim + 1, pIndices, interp, addRef); + } + + } else { + for (int i = 0; i < numElements; ++i) { + TclObject element(pElements[i]); + _variant_t elementVar; + element.toVariant(&elementVar, Type::variant(), interp, addRef); + + pIndices[dim1] = i; + hr = SafeArrayPutElement(psa, pIndices, &elementVar); + if (FAILED(hr)) { + _com_issue_error(hr); } } + } +} + +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; + unsigned numDimensions = SafeArrayGetDim(psa); + std::vector indices(numDimensions); + m_pObj = convertFromSafeArray( + psa, vt, 1, &indices[0], type, interp); + + } else if (vtMissing == pSrc) { + m_pObj = Extension::newNaObj(); } else { switch (V_VT(pSrc)) { @@ -292,7 +342,9 @@ 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( @@ -302,7 +354,9 @@ TclObject::TclObject (VARIANT *pSrc, const Type &type, Tcl_Interp *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( @@ -312,7 +366,7 @@ TclObject::TclObject (VARIANT *pSrc, const Type &type, Tcl_Interp *interp) break; case VT_NULL: - m_pObj = Tcl_NewObj(); + m_pObj = Extension::newNullObj(); break; case VT_LPSTR: @@ -366,6 +420,39 @@ TclObject::getBSTR () const #endif } +#if TCL_MINOR_VERSION >= 1 +// Convert Tcl byte array to SAFEARRAY of bytes. + +static SAFEARRAY * +newByteSafeArray (Tcl_Obj *pObj) +{ + int length; + unsigned char *pSrc = Tcl_GetByteArrayFromObj(pObj, &length); + + SAFEARRAY *psa = SafeArrayCreateVector(VT_UI1, 0, length); + if (psa == 0) { + _com_issue_error(E_OUTOFMEMORY); + } + + unsigned char *pDest; + HRESULT hr; + hr = SafeArrayAccessData( + psa, reinterpret_cast(&pDest)); + if (FAILED(hr)) { + _com_issue_error(hr); + } + + memcpy(pDest, pSrc, length); + + hr = SafeArrayUnaccessData(psa); + if (FAILED(hr)) { + _com_issue_error(hr); + } + + return psa; +} +#endif + void TclObject::toVariant (VARIANT *pDest, const Type &type, @@ -397,7 +484,7 @@ TclObject::toVariant (VARIANT *pDest, // Convert to interface pointer. IUnknown *pUnknown = static_cast( m_pObj->internalRep.otherValuePtr); - if (addRef) { + if (addRef && pUnknown != 0) { // Must increment reference count of interface pointers returned // from methods. pUnknown->AddRef(); @@ -406,66 +493,71 @@ TclObject::toVariant (VARIANT *pDest, V_UNKNOWN(pDest) = pUnknown; } else if (vt == VT_SAFEARRAY) { - // 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); - } - + SAFEARRAY *psa; const Type &elementType = type.elementType(); - SAFEARRAY *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); - } + 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); + } - 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; + psa = SafeArrayCreateVector(elementType.vartype(), 0, numElements); + if (psa == 0) { + _com_issue_error(E_OUTOFMEMORY); + } - default: - static_cast(pData)[i] = value.getLong(); + void *pData; + HRESULT hr; + hr = SafeArrayAccessData(psa, &pData); + if (FAILED(hr)) { + _com_issue_error(hr); } - } - hr = SafeArrayUnaccessData(psa); - 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); + } } V_VT(pDest) = VT_ARRAY | elementType.vartype(); @@ -480,60 +572,41 @@ TclObject::toVariant (VARIANT *pDest, _com_issue_error(E_INVALIDARG); } - SAFEARRAY *psa = SafeArrayCreateVector(VT_VARIANT, 0, numElements); - if (psa == 0) { - _com_issue_error(E_OUTOFMEMORY); - } + SAFEARRAYBOUND bounds[2]; + bounds[0].cElements = numElements; + bounds[0].lLbound = 0; - VARIANT *pData; - HRESULT hr; - hr = SafeArrayAccessData(psa, reinterpret_cast(&pData)); - if (FAILED(hr)) { - _com_issue_error(hr); - } + unsigned numDimensions; - for (int i = 0; i < numElements; ++i) { - TclObject value(pElements[i]); - VariantInit(&pData[i]); - value.toVariant(&pData[i], Type::variant(), interp, addRef); - } + // Check if the first element of the list is a list. + if (numElements > 0 && pElements[0]->typePtr == TclTypes::listType()) { + int colSize; + Tcl_Obj **pCol; + if (Tcl_ListObjGetElements(interp, pElements[0], &colSize, &pCol) + != TCL_OK) { + _com_issue_error(E_INVALIDARG); + } - hr = SafeArrayUnaccessData(psa); - if (FAILED(hr)) { - _com_issue_error(hr); + bounds[1].cElements = colSize; + bounds[1].lLbound = 0; + numDimensions = 2; + } else { + numDimensions = 1; } + SAFEARRAY *psa = SafeArrayCreate(VT_VARIANT, numDimensions, bounds); + std::vector indices(numDimensions); + fillSafeArray(m_pObj, psa, 1, &indices[0], interp, addRef); + V_VT(pDest) = VT_ARRAY | VT_VARIANT; V_ARRAY(pDest) = psa; #if TCL_MINOR_VERSION >= 1 } else if (m_pObj->typePtr == TclTypes::byteArrayType()) { - // Convert Tcl byte array to array of bytes. - int length; - unsigned char *pBytes = Tcl_GetByteArrayFromObj(m_pObj, &length); - - SAFEARRAY *psa = SafeArrayCreateVector(VT_UI1, 0, length); - if (psa == 0) { - _com_issue_error(E_OUTOFMEMORY); - } - - unsigned char *pDestData; - HRESULT hr; - hr = SafeArrayAccessData( - psa, reinterpret_cast(&pDestData)); - if (FAILED(hr)) { - _com_issue_error(hr); - } - - memcpy(pDestData, pBytes, length); - - hr = SafeArrayUnaccessData(psa); - if (FAILED(hr)) { - _com_issue_error(hr); - } + // Convert Tcl byte array to SAFEARRAY of bytes. V_VT(pDest) = VT_ARRAY | VT_UI1; - V_ARRAY(pDest) = psa; + V_ARRAY(pDest) = newByteSafeArray(m_pObj); #endif } else if (m_pObj->typePtr == &Extension::naType) { @@ -543,6 +616,11 @@ TclObject::toVariant (VARIANT *pDest, } else if (m_pObj->typePtr == &Extension::nullType) { V_VT(pDest) = VT_NULL; + } else if (m_pObj->typePtr == &Extension::variantType) { + VariantCopy( + pDest, + static_cast<_variant_t *>(m_pObj->internalRep.otherValuePtr)); + } else if (m_pObj->typePtr == TclTypes::intType()) { long value; if (Tcl_GetLongFromObj(interp, m_pObj, &value) != TCL_OK) { @@ -584,26 +662,19 @@ TclObject::toVariant (VARIANT *pDest, V_BOOL(pDest) = getBool() ? VARIANT_TRUE : VARIANT_FALSE; } else { -#if TCL_MINOR_VERSION >= 2 - // Uses Unicode function introduced in Tcl 8.2. - const wchar_t *pStringRep = - reinterpret_cast(Tcl_GetUnicode(m_pObj)); -#else - const char *pStringRep = Tcl_GetStringFromObj(m_pObj, 0); -#endif - _variant_t var(pStringRep); + V_VT(pDest) = VT_BSTR; + V_BSTR(pDest) = getBSTR(); // If trying to convert from a string to a date, // we need to convert to a double (VT_R8) first. if (vt == VT_DATE) { - var.ChangeType(VT_R8); + VariantChangeType(pDest, pDest, 0, VT_R8); } // Try to convert from a string representation. if (vt != VT_VARIANT && vt != VT_USERDEFINED && vt != VT_LPWSTR) { - var.ChangeType(vt); + VariantChangeType(pDest, pDest, 0, vt); } - VariantCopy(pDest, &var); } } diff --git a/src/TclScript.cpp b/src/TclScript.cpp index 71954c6..df52143 100644 --- a/src/TclScript.cpp +++ b/src/TclScript.cpp @@ -1,4 +1,4 @@ -// $Id: TclScript.cpp,v 1.10 2002/07/14 18:42:57 cthuang Exp $ +// $Id: TclScript.cpp,v 1.12 2003/04/02 22:46:51 cthuang Exp $ #include "ActiveScriptError.h" #include "Reference.h" #include "TypeInfo.h" @@ -9,29 +9,6 @@ #define ENGINE_PACKAGE_NAME "TclScript" #define ENGINE_PACKAGE_VERSION "1.0" -static int -outputdebugCmd ( - ClientData, - Tcl_Interp *interp, - int objc, - Tcl_Obj *CONST objv[]) -{ - if (objc != 2) { - Tcl_WrongNumArgs(interp, 1, objv, "message"); - return TCL_ERROR; - } - - Tcl_Obj *pMessage = objv[1]; - if (Tcl_IsShared(pMessage)) { - pMessage = Tcl_DuplicateObj(pMessage); - } - Tcl_IncrRefCount(pMessage); - Tcl_AppendToObj(pMessage, "\n", 1); - OutputDebugString(Tcl_GetStringFromObj(pMessage, 0)); - Tcl_DecrRefCount(pMessage); - return TCL_OK; -} - static int getnameditemCmd ( ClientData, @@ -206,8 +183,6 @@ Tclscript_Init (Tcl_Interp *interp) } #endif - Tcl_CreateObjCommand( - interp, NAMESPACE "outputdebug", outputdebugCmd, 0, 0); Tcl_CreateObjCommand( interp, NAMESPACE "getnameditem", getnameditemCmd, 0, 0); Tcl_CreateObjCommand( diff --git a/src/TclScript.dsp b/src/TclScript.dsp index 12f542d..ec02430 100644 --- a/src/TclScript.dsp +++ b/src/TclScript.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" /win32 # SUBTRACT MTL /mktyplib203 @@ -70,7 +70,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" /win32 # SUBTRACT MTL /mktyplib203 diff --git a/src/TclScript.idl b/src/TclScript.idl index 1dbdf31..2ea365a 100644 --- a/src/TclScript.idl +++ b/src/TclScript.idl @@ -24,4 +24,13 @@ library TclScript interface IActiveScriptParse; interface IObjectSafety; }; + + [ + uuid(0A0059C5-E0B0-11D2-942A-00C04F7040AE), + helpstring("Dispatch Class") + ] + coclass Dispatch + { + [default] interface IDispatch; + }; }; diff --git a/src/bindCmd.cpp b/src/bindCmd.cpp index a336015..7b0c253 100644 --- a/src/bindCmd.cpp +++ b/src/bindCmd.cpp @@ -1,4 +1,4 @@ -// $Id: bindCmd.cpp,v 1.52 2002/04/13 03:53:56 cthuang Exp $ +// $Id: bindCmd.cpp,v 1.53 2003/04/02 22:46:51 cthuang Exp $ #pragma warning(disable: 4786) #include "Extension.h" #include "Reference.h" @@ -175,7 +175,7 @@ Extension::bindCmd ( Tcl_Obj *CONST objv[]) { if (objc < 3 || objc > 4) { - Tcl_WrongNumArgs(interp, 1, objv, "object sinkCommand ?eventIID?"); + Tcl_WrongNumArgs(interp, 1, objv, "handle sinkCommand ?eventIID?"); return TCL_ERROR; } @@ -187,6 +187,19 @@ Extension::bindCmd ( return TCL_ERROR; } + int servantLength; + Tcl_GetStringFromObj(objv[2], &servantLength); + if (servantLength == 0) { + try { + // Tear down all event connections to the object. + pReference->unadvise(); + } + catch (_com_error &e) { + return setComErrorResult(interp, e, __FILE__, __LINE__); + } + return TCL_OK; + } + TclObject servant(objv[2]); char *eventIIDStr = (objc < 4) ? 0 : Tcl_GetStringFromObj(objv[3], 0); @@ -205,34 +218,3 @@ Extension::bindCmd ( } return TCL_OK; } - -// This Tcl command tears down all event connections to the object. - -int -Extension::unbindCmd ( - ClientData, - Tcl_Interp *interp, - int objc, - Tcl_Obj *CONST objv[]) -{ - if (objc != 2) { - Tcl_WrongNumArgs(interp, 1, objv, "object"); - return TCL_ERROR; - } - - Reference *pReference = referenceHandles.find(interp, objv[1]); - if (pReference == 0) { - const char *arg = Tcl_GetStringFromObj(objv[1], 0); - Tcl_AppendResult( - interp, "invalid interface pointer handle ", arg, NULL); - return TCL_ERROR; - } - - try { - pReference->unadvise(); - } - catch (_com_error &e) { - return setComErrorResult(interp, e, __FILE__, __LINE__); - } - return TCL_OK; -} diff --git a/src/buildNumber.h b/src/buildNumber.h index dd59692..7fe11cc 100644 --- a/src/buildNumber.h +++ b/src/buildNumber.h @@ -1 +1 @@ -#define BUILD_NUMBER 13 +#define BUILD_NUMBER 28 diff --git a/src/comsupp.cpp b/src/comsupp.cpp deleted file mode 100644 index a4128f5..0000000 --- a/src/comsupp.cpp +++ /dev/null @@ -1,60 +0,0 @@ -// $Id: comsupp.cpp,v 1.2 2001/07/12 04:09:58 cthuang Exp $ -// -// These functions are defined in comsupp.lib but Borland C++ does not include -// that library in its distribution, so we implement them here when compiling -// with Borland C++. -#include -#include -#include -#include - -// This value represents a missing optional parameter. -_variant_t vtMissing(DISP_E_PARAMNOTFOUND, VT_ERROR); - -// COM error handling routine - -void __stdcall -_com_issue_error (HRESULT hr) throw(_com_error) -{ - throw _com_error(hr); -} - -namespace _com_util { - -// Convert char * to BSTR - -BSTR __stdcall -ConvertStringToBSTR (const char* pSrc) throw(_com_error) -{ - if (pSrc == 0) { - return SysAllocString(0); - } - - // Guess the number of wide characters needed. - size_t destLen = strlen(pSrc) + 1; - wchar_t *pDest = new wchar_t[destLen]; - mbstowcs(pDest, pSrc, destLen); - BSTR result = SysAllocString(pDest); - delete[] pDest; - return result; -} - -// Convert BSTR to char * - -char* __stdcall -ConvertBSTRToString (BSTR pSrc) throw(_com_error) -{ - if (pSrc == 0) { - char *pDest = new char[1]; - *pDest = '\0'; - return pDest; - } - - // Guess the number of bytes needed. - size_t destLen = wcslen(pSrc) * 3 + 1; - char *pDest = new char[destLen]; - wcstombs(pDest, pSrc, destLen); - return pDest; -} - -} //namespace diff --git a/src/naCmd.cpp b/src/naCmd.cpp index 2b6f4d1..8cc47b0 100644 --- a/src/naCmd.cpp +++ b/src/naCmd.cpp @@ -1,4 +1,4 @@ -// $Id: naCmd.cpp,v 1.6 2002/04/27 18:15:24 cthuang Exp $ +// $Id: naCmd.cpp,v 1.7 2003/03/07 00:17:30 cthuang Exp $ #include "Extension.h" #include @@ -34,7 +34,7 @@ Tcl_ObjType Extension::naType = { naSetFromAny }; -// Create an NA object. +// Create a Tcl value representing a missing optional argument. Tcl_Obj * Extension::newNaObj () @@ -45,7 +45,7 @@ Extension::newNaObj () return pObj; } -// This Tcl command returns an object used to represent a missing optional +// This Tcl command returns a Tcl value representing a missing optional // argument. int diff --git a/src/nullCmd.cpp b/src/nullCmd.cpp index 91fc3aa..28e669e 100644 --- a/src/nullCmd.cpp +++ b/src/nullCmd.cpp @@ -1,4 +1,4 @@ -// $Id: nullCmd.cpp,v 1.9 2002/04/27 18:15:24 cthuang Exp $ +// $Id: nullCmd.cpp,v 1.10 2003/03/07 00:17:30 cthuang Exp $ #include "Extension.h" #include @@ -34,8 +34,19 @@ Tcl_ObjType Extension::nullType = { nullSetFromAny }; -// This Tcl command returns a null object which be used to pass a null pointer -// argument. +// Create a Tcl value representing a null value in SQL operations. + +Tcl_Obj * +Extension::newNullObj () +{ + Tcl_Obj *pObj = Tcl_NewObj(); + Tcl_InvalidateStringRep(pObj); + pObj->typePtr = &nullType; + return pObj; +} + +// This Tcl command returns a Tcl value representing a null value in SQL +// operations. int Extension::nullCmd ( @@ -49,10 +60,6 @@ Extension::nullCmd ( return TCL_ERROR; } - Tcl_Obj *pObj = Tcl_NewObj(); - Tcl_InvalidateStringRep(pObj); - pObj->typePtr = &nullType; - - Tcl_SetObjResult(interp, pObj); + Tcl_SetObjResult(interp, newNullObj()); return TCL_OK; } diff --git a/src/objectCmd.cpp b/src/objectCmd.cpp index 9f2c010..5dc9560 100644 --- a/src/objectCmd.cpp +++ b/src/objectCmd.cpp @@ -1,4 +1,4 @@ -// $Id: objectCmd.cpp,v 1.30 2002/04/27 18:15:24 cthuang Exp $ +// $Id: objectCmd.cpp,v 1.31 2003/03/07 00:24:04 cthuang Exp $ #pragma warning(disable: 4786) #include "Extension.h" #include @@ -140,6 +140,16 @@ findInterface (Tcl_Interp *interp, Tcl_Obj *pName) return pInterface; } +static Tcl_Obj * +newUnknownPointer (IUnknown *pUnknown) +{ + Tcl_Obj *pObj = Tcl_NewObj(); + Tcl_InvalidateStringRep(pObj); + pObj->typePtr = &Extension::unknownPointerType; + pObj->internalRep.otherValuePtr = pUnknown; + return pObj; +} + // This Tcl command creates a COM object. static int @@ -234,12 +244,7 @@ objectCreateCmd ( destructor); } - Tcl_Obj *pObj = Tcl_NewObj(); - Tcl_InvalidateStringRep(pObj); - pObj->typePtr = &Extension::unknownPointerType; - pObj->internalRep.otherValuePtr = pComObject->unknown(); - - Tcl_SetObjResult(interp, pObj); + Tcl_SetObjResult(interp, newUnknownPointer(pComObject->unknown())); } catch (_com_error &e) { return Extension::setComErrorResult(interp, e, __FILE__, __LINE__); @@ -247,6 +252,27 @@ objectCreateCmd ( return TCL_OK; } +// This Tcl command creates a null IUnknown pointer. + +static int +objectNullCmd ( + Tcl_Interp *interp, + int objc, + Tcl_Obj *CONST objv[]) +{ + if (objc != 2) { + Tcl_WrongNumArgs( + interp, + 2, + objv, + NULL); + return TCL_ERROR; + } + + Tcl_SetObjResult(interp, newUnknownPointer(0)); + return TCL_OK; +} + // This Tcl command provides operations for creating COM objects. int @@ -266,10 +292,10 @@ Extension::objectCmd ( pExtension->initializeCom(); static char *options[] = { - "create", "registerfactory", NULL + "create", "null", "registerfactory", NULL }; enum SubCommandEnum { - CREATE, REGISTER_FACTORY + CREATE, OBJECT_NULL, REGISTER_FACTORY }; int index; @@ -281,6 +307,8 @@ Extension::objectCmd ( switch (index) { case CREATE: return objectCreateCmd(interp, objc, objv); + case OBJECT_NULL: + return objectNullCmd(interp, objc, objv); case REGISTER_FACTORY: return objectRegisterFactoryCmd(interp, objc, objv); } diff --git a/src/refCmd.cpp b/src/refCmd.cpp index 6b4e641..eac808d 100644 --- a/src/refCmd.cpp +++ b/src/refCmd.cpp @@ -1,4 +1,4 @@ -// $Id: refCmd.cpp,v 1.43 2002/06/12 02:14:08 cthuang Exp $ +// $Id: refCmd.cpp,v 1.46 2003/11/06 15:29:01 cthuang Exp $ #pragma warning(disable: 4786) #include "Extension.h" #include @@ -17,9 +17,10 @@ static bool getErrorInfo (Reference *pReference, IErrorInfo **ppErrorInfo) { const Interface *pInterface = pReference->interfaceDesc(); - if (pInterface == 0) { - return false; - } + + // The .NET Framework uses GUID_NULL to identify the interface which + // raised the error. + const IID &iid = (pInterface == 0) ? GUID_NULL : pInterface->iid(); ISupportErrorInfoPtr pSupportErrorInfo; HRESULT hr = pReference->unknown()->QueryInterface( @@ -28,8 +29,7 @@ getErrorInfo (Reference *pReference, IErrorInfo **ppErrorInfo) return false; } - if (pSupportErrorInfo->InterfaceSupportsErrorInfo(pInterface->iid()) - != S_OK) { + if (pSupportErrorInfo->InterfaceSupportsErrorInfo(iid) != S_OK) { return false; } @@ -90,18 +90,17 @@ Extension::setComErrorResult ( #if TCL_MINOR_VERSION >= 2 // Uses Unicode functions introduced in Tcl 8.2. - wchar_t *pMessage = 0; - FormatMessageW( + wchar_t *pMessage; + DWORD nLen = FormatMessageW( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, e.Error(), - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + 0, reinterpret_cast(&pMessage), 0, NULL); - if (pMessage != 0) { - int nLen = wcslen(pMessage); + if (nLen > 0) { if (nLen > 1 && pMessage[nLen - 1] == '\n') { --nLen; if (nLen > 1 && pMessage[nLen - 1] == '\r') { @@ -477,7 +476,11 @@ getObjectCmd ( return TCL_ERROR; } - char *monikerName = Tcl_GetStringFromObj(objv[2], 0); +#if TCL_MINOR_VERSION >= 2 + const wchar_t *monikerName = Tcl_GetUnicode(objv[2]); +#else + _bstr_t monikerName(Tcl_GetStringFromObj(objv[2], 0)); +#endif try { Reference *pReference = Reference::getObject(monikerName); diff --git a/src/tcom.dsp b/src/tcom.dsp index 1672759..b05665d 100644 --- a/src/tcom.dsp +++ b/src/tcom.dsp @@ -260,6 +260,10 @@ SOURCE=.\typelibCmd.cpp SOURCE=.\Uuid.cpp # End Source File +# Begin Source File + +SOURCE=.\variantCmd.cpp +# End Source File # End Group # Begin Group "Header Files" diff --git a/src/variantCmd.cpp b/src/variantCmd.cpp new file mode 100644 index 0000000..51e5214 --- /dev/null +++ b/src/variantCmd.cpp @@ -0,0 +1,151 @@ +// $Id: variantCmd.cpp,v 1.1 2003/05/29 03:33:08 cthuang Exp $ +#include "Extension.h" +#include + +static void +variantFreeInternalRep (Tcl_Obj *pObj) +{ + delete static_cast<_variant_t *>(pObj->internalRep.otherValuePtr); +} + +static void +variantDuplicateInternalRep (Tcl_Obj *pSrc, Tcl_Obj *pDup) +{ + pDup->typePtr = &Extension::variantType; + pDup->internalRep.otherValuePtr = new _variant_t( + static_cast<_variant_t *>(pSrc->internalRep.otherValuePtr)); +} + +static void +variantUpdateString (Tcl_Obj *pObj) +{ + try { + _bstr_t bstr( + static_cast<_variant_t *>(pObj->internalRep.otherValuePtr)); + const char *stringRep = bstr; + pObj->length = strlen(stringRep); + pObj->bytes = Tcl_Alloc(pObj->length + 1); + strcpy(pObj->bytes, stringRep); + } + catch (_com_error &) { + pObj->length = 0; + pObj->bytes = Tcl_Alloc(1); + pObj->bytes[0] = '\0'; + } +} + +static int +variantSetFromAny (Tcl_Interp *interp, Tcl_Obj *pObj) +{ + const char *stringRep = Tcl_GetStringFromObj(pObj, 0); + + Tcl_ObjType *pOldType = pObj->typePtr; + if (pOldType != NULL && pOldType->freeIntRepProc != NULL) { + pOldType->freeIntRepProc(pObj); + } + + pObj->typePtr = &Extension::variantType; + pObj->internalRep.otherValuePtr = new _variant_t(stringRep); + return TCL_OK; +} + +Tcl_ObjType Extension::variantType = { + PACKAGE_NAMESPACE "VARIANT", + variantFreeInternalRep, + variantDuplicateInternalRep, + variantUpdateString, + variantSetFromAny +}; + +// Create a Tcl value representing a VARIANT. + +Tcl_Obj * +Extension::newVariantObj (_variant_t *pVar) +{ + Tcl_Obj *pObj = Tcl_NewObj(); + Tcl_InvalidateStringRep(pObj); + pObj->typePtr = &variantType; + pObj->internalRep.otherValuePtr = pVar; + return pObj; +} + +// This Tcl command returns a Tcl value representing a VARIANT. + +int +Extension::variantCmd ( + ClientData, + Tcl_Interp *interp, + int objc, + Tcl_Obj *CONST objv[]) +{ + if (objc < 2 || objc > 3) { + Tcl_WrongNumArgs(interp, 1, objv, "type ?value?"); + return TCL_ERROR; + } + + static char *types[] = { + "empty", + "null", + "i2", + "i4", + "r4", + "r8", + "cy", + "date", + "bstr", + "dispatch", + "error", + "bool", + "variant", + "unknown", + "decimal", + "record", + "i1", + "ui1", + "ui2", + "ui4", + "i8", // VT_I8 and VT_UI8 actually are not valid VARIANT types. + "ui8", + "int", + "uint", + NULL + }; + + int vt; + if (Tcl_GetIndexFromObj(NULL, objv[1], types, "type", 0, &vt) != TCL_OK) { + if (Tcl_GetIntFromObj(interp, objv[1], &vt) != TCL_OK) { + return TCL_ERROR; + } + } + + _variant_t *pVar = new _variant_t; + switch (vt) { + case VT_DISPATCH: + V_VT(pVar) = vt; + V_DISPATCH(pVar) = 0; + break; + + case VT_UNKNOWN: + V_VT(pVar) = vt; + V_UNKNOWN(pVar) = 0; + break; + } + + try { + if (objc == 3) { + *pVar = Tcl_GetStringFromObj(objv[2], 0); + } + + if (vt == VT_DATE) { + pVar->ChangeType(VT_R8); + } + + pVar->ChangeType(vt); + } + catch (_com_error &e) { + return setComErrorResult(interp, e, __FILE__, __LINE__); + } + + Tcl_SetObjResult(interp, newVariantObj(pVar)); + return TCL_OK; +} diff --git a/src/version.h b/src/version.h index 090cd68..5e98760 100644 --- a/src/version.h +++ b/src/version.h @@ -1,9 +1,9 @@ -// $Id: version.h,v 1.3 2002/04/27 18:15:24 cthuang Exp $ +// $Id: version.h,v 1.4 2002/10/01 21:51:32 cthuang Exp $ #ifndef VERSION_H #define VERSION_H #define PACKAGE_MAJOR_VERSION 3 -#define PACKAGE_MINOR_VERSION 8 +#define PACKAGE_MINOR_VERSION 9 #define MAKE_VERSION_STRING0(MAJOR,MINOR) #MAJOR "." #MINOR #define MAKE_VERSION_STRING(MAJOR,MINOR) MAKE_VERSION_STRING0(MAJOR,MINOR) diff --git a/tests/array.test b/tests/array.test new file mode 100644 index 0000000..8a8f49b --- /dev/null +++ b/tests/array.test @@ -0,0 +1,53 @@ +# $Id: array.test,v 1.1 2003/05/12 23:31:03 cthuang Exp $ +# +# This file contains tests for the passing arrays + +if {[lsearch [namespace children] ::tcltest] == -1} { + package require tcltest + namespace import -force ::tcltest::* +} + +test array-1.1 {one-dimensional array} { + package require tcom + + set application [::tcom::ref createobject "Excel.Application"] + $application Visible 1 + + set workbooks [$application Workbooks] + set workbook [$workbooks Add] + set worksheets [$workbook Worksheets] + set worksheet [$worksheets Item [expr 1]] + + set range [$worksheet Range "A1" "C1"] + $range Value [list 1 2 3] + set value [$range Value] + + $workbook Saved 1 + $application Quit + + set value +} {{1.0 2.0 3.0}} + +test array-1.2 {two-dimensional array} { + package require tcom + + set application [::tcom::ref createobject "Excel.Application"] + $application Visible 1 + + set workbooks [$application Workbooks] + set workbook [$workbooks Add] + set worksheets [$workbook Worksheets] + set worksheet [$worksheets Item [expr 1]] + + set range [$worksheet Range "A1" "C2"] + $range Value [list [list 1 2 3] [list 4 5 6]] + set value [$range Value] + + $workbook Saved 1 + $application Quit + + set value +} {{1.0 2.0 3.0} {4.0 5.0 6.0}} + +::tcltest::cleanupTests +return diff --git a/tests/eval.test b/tests/eval.test new file mode 100644 index 0000000..e55972b --- /dev/null +++ b/tests/eval.test @@ -0,0 +1,35 @@ +# $Id: eval.test,v 1.2 2003/04/02 22:57:35 cthuang Exp $ +# +# This file contains tests the robustness of handles under eval. + +if {[lsearch [namespace children] ::tcltest] == -1} { + package require tcltest + namespace import -force ::tcltest::* +} + +test eval-1.1 {eval} { + package require tcom + + for {set i 1} {$i <= 9} {incr i} { + proc testEval$i {} { + } + } + + proc testEval {n} { + set application [::tcom::ref createobject "Excel.Application"] + eval $application Visible 0 + + for {set i 1} {$i <= $n} {incr i} { + eval testEval$i + } + + $application Visible 0 + } + + for {set i 1} {$i <= 9} {incr i} { + testEval $i + } +} {} + +::tcltest::cleanupTests +return diff --git a/tests/foreach.test b/tests/foreach.test index 55ea329..f2935bf 100644 --- a/tests/foreach.test +++ b/tests/foreach.test @@ -1,4 +1,4 @@ -# $Id: foreach.test,v 1.1 2002/03/16 04:53:17 cthuang Exp $ +# $Id: foreach.test,v 1.2 2003/03/07 00:01:40 cthuang Exp $ # # This file contains tests for the ::tcom::foreach command. @@ -26,17 +26,17 @@ test foreach-1.1 {::tcom::foreach} { } } - set cellCount 0 + set addresses {} set range [$worksheet Range "A1:C3"] ::tcom::foreach cell $range { - incr cellCount + lappend addresses [$cell Address] } $workbook Saved 1 $application Quit - set cellCount -} {9} + set addresses +} {{$A$1} {$B$1} {$C$1} {$A$2} {$B$2} {$C$2} {$A$3} {$B$3} {$C$3}} ::tcltest::cleanupTests return diff --git a/tests/namedarg.test b/tests/namedarg.test index 6b461d6..21f718f 100644 --- a/tests/namedarg.test +++ b/tests/namedarg.test @@ -1,4 +1,4 @@ -# $Id: namedarg.test,v 1.1 2002/06/21 02:38:50 cthuang Exp $ +# $Id: namedarg.test,v 1.2 2003/04/02 22:57:35 cthuang Exp $ # # This file contains tests invoking methods through IDispatch with named # arguments. @@ -34,7 +34,7 @@ test namedarg-1.1 {named arguments, ChartWizard} { set chart [$charts Add] $chart -namedarg ChartWizard \ Source $sourceRange \ - Gallery [expr -4102] \ + Gallery [expr 5] \ PlotBy [expr 1] \ CategoryLabels [expr 1] \ SeriesLabels [expr 0] \ -- 2.23.0