Jump to page: 1 2
Thread overview
COMSTL and DirectShow
Nov 23, 2006
Adi Shavit
Nov 23, 2006
Matthew
Nov 23, 2006
Adi Shavit
Nov 29, 2006
Adi Shavit
Nov 29, 2006
Matthew
Dec 02, 2006
Matthew
Dec 02, 2006
Matthew
Dec 03, 2006
Adi Shavit
Dec 03, 2006
Matthew
Dec 04, 2006
Adi Shavit
Dec 04, 2006
Matthew
Dec 05, 2006
Adi Shavit
Feb 17, 2007
Matthew Wilson
Feb 17, 2007
Adi Shavit
Feb 26, 2007
Matthew Wilson
Mar 07, 2007
Adi Shavit
Mar 07, 2007
Matthew Wilson
Mar 08, 2007
Matthew Wilson
Mar 08, 2007
Adi Shavit
Mar 08, 2007
Adi Shavit
November 23, 2006
Hi,

  I'm trying to use COMSTL with DirectShow, and I'm having compilation problems right from the start.

I took a simple working DirectShow (which is based on COM) program (on
MSVC++ 6.0), and tried adding a single line to see COMSTL in action.

My code snippet:

   //...

    IGraphBuilder *pGraph;
    IMediaEvent *pEvent;

   //...

      using namespace comstl;


      CoInitialize(NULL);

      pGraph= 0;

      if (!FAILED(
             CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC,
                              IID_IGraphBuilder, (void **)&pGraph))) {

      //...

        pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent);

        if (interface_cast_test<IMediaEvent>(pGraph)) //<< COMSTL usage
          int j=0;                                    //dummy code

      //...

uses of interface_case_addref<> give similar problems.

Here's a sample of my errors:

c:\users\adish\gentech\otherlibs\stlsoft\comstl\interface_cast.hpp(302) : error C2259: 'IMediaEvent' : cannot instantiate abstract class due to following members:

c:\users\adish\gentech\libs\iplreader\directx8\include\control.h(662) : see declaration of 'IMediaEvent'

c:\users\adish\gentech\otherlibs\stlsoft\comstl\interface_cast.hpp(515) : see reference to class template instantiation 'stlsoft::comstl_project::interface_cast_base<struct IMediaEvent,struct stlsoft::comstl_project::noaddref_release<struct
IMediaEvent>,struct stlsoft::comstl_project::ignore_interface_cast_exception>' being compiled
        c:\users\adish\tests\cvision2\cvapp.h(79) : see reference to class template instantiation 'stlsoft::comstl_project::interface_cast_test<struct IMediaEvent>' being compiled
c:\users\adish\gentech\otherlibs\stlsoft\comstl\interface_cast.hpp(302) : warning C4259: 'long __stdcall IUnknown::QueryInterface(const struct _GUID &,void ** )' : pure virtual function was not defined
        c:\program files\microsoft visual studio\vc98\include\unknwn.h(109) : see declaration of 'QueryInterface'

c:\users\adish\gentech\otherlibs\stlsoft\comstl\interface_cast.hpp(515) : see reference to class template instantiation 'stlsoft::comstl_project::interface_cast_base<struct IMediaEvent,struct stlsoft::comstl_project::noaddref_release<struct
IMediaEvent>,struct stlsoft::comstl_project::ignore_interface_cast_exception>' being compiled
        c:\users\adish\tests\cvision2\cvapp.h(79) : see reference to class template instantiation 'stlsoft::comstl_project::interface_cast_test<struct IMediaEvent>' being compiled
c:\users\adish\gentech\otherlibs\stlsoft\comstl\interface_cast.hpp(302) : warning C4259: 'unsigned long __stdcall IUnknown::AddRef(void)' : pure virtual function was not defined
        c:\program files\microsoft visual studio\vc98\include\unknwn.h(113) : see declaration of 'AddRef'

c:\users\adish\gentech\otherlibs\stlsoft\comstl\interface_cast.hpp(515) : see reference to class template instantiation 'stlsoft::comstl_project::interface_cast_base<struct IMediaEvent,struct stlsoft::comstl_project::noaddref_release<struct
IMediaEvent>,struct stlsoft::comstl_project::ignore_interface_cast_exception>' being compiled
        c:\users\adish\tests\cvision2\cvapp.h(79) : see reference to class template instantiation 'stlsoft::comstl_project::interface_cast_test<struct IMediaEvent>' being compiled
c:\users\adish\gentech\otherlibs\stlsoft\comstl\interface_cast.hpp(302) : warning C4259: 'unsigned long __stdcall IUnknown::Release(void)' : pure virtual function was not defined
        c:\program files\microsoft visual studio\vc98\include\unknwn.h(115) : see declaration of 'Release'

c:\users\adish\gentech\otherlibs\stlsoft\comstl\interface_cast.hpp(515) : see reference to class template instantiation 'stlsoft::comstl_project::interface_cast_base<struct IMediaEvent,struct stlsoft::comstl_project::noaddref_release<struct
IMediaEvent>,struct stlsoft::comstl_project::ignore_interface_cast_exception>' being compiled
        c:\users\adish\tests\cvision2\cvapp.h(79) : see reference to class template instantiation 'stlsoft::comstl_project::interface_cast_test<struct IMediaEvent>' being compiled
c:\users\adish\gentech\otherlibs\stlsoft\comstl\interface_cast.hpp(302) : warning C4259: 'long __stdcall IDispatch::GetTypeInfoCount(unsigned int *)' : pure virtual function was not defined
        c:\program files\microsoft visual studio\vc98\include\oaidl.h(2697) : see declaration of 'GetTypeInfoCount'

c:\users\adish\gentech\otherlibs\stlsoft\comstl\interface_cast.hpp(515) : see reference to class template instantiation 'stlsoft::comstl_project::interface_cast_base<struct IMediaEvent,struct stlsoft::comstl_project::noaddref_release<struct
IMediaEvent>,struct stlsoft::comstl_project::ignore_interface_cast_exception>' being compiled
        c:\users\adish\tests\cvision2\cvapp.h(79) : see reference to class template instantiation 'stlsoft::comstl_project::interface_cast_test<struct IMediaEvent>' being compiled
c:\users\adish\gentech\otherlibs\stlsoft\comstl\interface_cast.hpp(302) : warning C4259: 'long __stdcall IDispatch::GetTypeInfo(unsigned int,unsigned long,struct ITypeInfo ** )' : pure virtual function was not defined
        c:\program files\microsoft visual studio\vc98\include\oaidl.h(2700) : see declaration of 'GetTypeInfo'

c:\users\adish\gentech\otherlibs\stlsoft\comstl\interface_cast.hpp(515) : see reference to class template instantiation 'stlsoft::comstl_project::interface_cast_base<struct IMediaEvent,struct stlsoft::comstl_project::noaddref_release<struct
IMediaEvent>,struct stlsoft::comstl_project::ignore_interface_cast_exception>' being compiled
        c:\users\adish\tests\cvision2\cvapp.h(79) : see reference to class template instantiation 'stlsoft::comstl_project::interface_cast_test<struct IMediaEvent>' being compiled
c:\users\adish\gentech\otherlibs\stlsoft\comstl\interface_cast.hpp(302) : warning C4259: 'long __stdcall IDispatch::GetIDsOfNames(const struct _GUID &,unsigned short ** ,unsigned int,unsigned long,long *)' : pure virtual function was not defined
        c:\program files\microsoft visual studio\vc98\include\oaidl.h(2705) : see declaration of 'GetIDsOfNames'

c:\users\adish\gentech\otherlibs\stlsoft\comstl\interface_cast.hpp(515) : see reference to class template instantiation 'stlsoft::comstl_project::interface_cast_base<struct IMediaEvent,struct stlsoft::comstl_project::noaddref_release<struct
IMediaEvent>,struct stlsoft::comstl_project::ignore_interface_cast_exception>' being compiled
        c:\users\adish\tests\cvision2\cvapp.h(79) : see reference to class template instantiation 'stlsoft::comstl_project::interface_cast_test<struct IMediaEvent>' being compiled
c:\users\adish\gentech\otherlibs\stlsoft\comstl\interface_cast.hpp(302) : warning C4259: 'long __stdcall IDispatch::Invoke(long,const struct _GUID &,unsigned long,unsigned short,struct tagDISPPARAMS *,struct tagVARIANT *,struct tagEXCEPINFO *,unsign
ed int *)' : pure virtual function was not defined
        c:\program files\microsoft visual studio\vc98\include\oaidl.h(2712) : see declaration of 'Invoke'

c:\users\adish\gentech\otherlibs\stlsoft\comstl\interface_cast.hpp(515) : see reference to class template instantiation 'stlsoft::comstl_project::interface_cast_base<struct IMediaEvent,struct stlsoft::comstl_project::noaddref_release<struct
IMediaEvent>,struct stlsoft::comstl_project::ignore_interface_cast_exception>' being compiled
        c:\users\adish\tests\cvision2\cvapp.h(79) : see reference to class template instantiation 'stlsoft::comstl_project::interface_cast_test<struct IMediaEvent>' being compiled
c:\users\adish\gentech\otherlibs\stlsoft\comstl\interface_cast.hpp(302) : warning C4259: 'long __stdcall IMediaEvent::GetEventHandle(long *)' : pure virtual function was not defined

c:\users\adish\gentech\libs\iplreader\directx8\include\control.h(665) : see declaration of 'GetEventHandle'

c:\users\adish\gentech\otherlibs\stlsoft\comstl\interface_cast.hpp(515) : see reference to class template instantiation 'stlsoft::comstl_project::interface_cast_base<struct IMediaEvent,struct stlsoft::comstl_project::noaddref_release<struct
IMediaEvent>,struct stlsoft::comstl_project::ignore_interface_cast_exception>' being compiled
        c:\users\adish\tests\cvision2\cvapp.h(79) : see reference to class template instantiation 'stlsoft::comstl_project::interface_cast_test<struct IMediaEvent>' being compiled
c:\users\adish\gentech\otherlibs\stlsoft\comstl\interface_cast.hpp(302) : warning C4259: 'long __stdcall IMediaEvent::GetEvent(long *,long *,long *,long)' : pure virtual function was not defined

c:\users\adish\gentech\libs\iplreader\directx8\include\control.h(668) : see declaration of 'GetEvent'

c:\users\adish\gentech\otherlibs\stlsoft\comstl\interface_cast.hpp(515) : see reference to class template instantiation 'stlsoft::comstl_project::interface_cast_base<struct IMediaEvent,struct stlsoft::comstl_project::noaddref_release<struct
IMediaEvent>,struct stlsoft::comstl_project::ignore_interface_cast_exception>' being compiled
        c:\users\adish\tests\cvision2\cvapp.h(79) : see reference to class template instantiation 'stlsoft::comstl_project::interface_cast_test<struct IMediaEvent>' being compiled
c:\users\adish\gentech\otherlibs\stlsoft\comstl\interface_cast.hpp(302) : warning C4259: 'long __stdcall IMediaEvent::WaitForCompletion(long,long *)' : pure virtual function was not defined

c:\users\adish\gentech\libs\iplreader\directx8\include\control.h(674) : see declaration of 'WaitForCompletion'

c:\users\adish\gentech\otherlibs\stlsoft\comstl\interface_cast.hpp(515) : see reference to class template instantiation 'stlsoft::comstl_project::interface_cast_base<struct IMediaEvent,struct stlsoft::comstl_project::noaddref_release<struct
IMediaEvent>,struct stlsoft::comstl_project::ignore_interface_cast_exception>' being compiled
        c:\users\adish\tests\cvision2\cvapp.h(79) : see reference to class template instantiation 'stlsoft::comstl_project::interface_cast_test<struct IMediaEvent>' being compiled
c:\users\adish\gentech\otherlibs\stlsoft\comstl\interface_cast.hpp(302) : warning C4259: 'long __stdcall IMediaEvent::CancelDefaultHandling(long)' : pure virtual function was not defined

c:\users\adish\gentech\libs\iplreader\directx8\include\control.h(678) : see declaration of 'CancelDefaultHandling'

c:\users\adish\gentech\otherlibs\stlsoft\comstl\interface_cast.hpp(515) : see reference to class template instantiation 'stlsoft::comstl_project::interface_cast_base<struct IMediaEvent,struct stlsoft::comstl_project::noaddref_release<struct
IMediaEvent>,struct stlsoft::comstl_project::ignore_interface_cast_exception>' being compiled
        c:\users\adish\tests\cvision2\cvapp.h(79) : see reference to class template instantiation 'stlsoft::comstl_project::interface_cast_test<struct IMediaEvent>' being compiled
c:\users\adish\gentech\otherlibs\stlsoft\comstl\interface_cast.hpp(302) : warning C4259: 'long __stdcall IMediaEvent::RestoreDefaultHandling(long)' : pure virtual function was not defined

c:\users\adish\gentech\libs\iplreader\directx8\include\control.h(681) : see declaration of 'RestoreDefaultHandling'

c:\users\adish\gentech\otherlibs\stlsoft\comstl\interface_cast.hpp(515) : see reference to class template instantiation 'stlsoft::comstl_project::interface_cast_base<struct IMediaEvent,struct stlsoft::comstl_project::noaddref_release<struct
IMediaEvent>,struct stlsoft::comstl_project::ignore_interface_cast_exception>' being compiled
        c:\users\adish\tests\cvision2\cvapp.h(79) : see reference to class template instantiation 'stlsoft::comstl_project::interface_cast_test<struct IMediaEvent>' being compiled
c:\users\adish\gentech\otherlibs\stlsoft\comstl\interface_cast.hpp(302) : warning C4259: 'long __stdcall IMediaEvent::FreeEventParams(long,long,long)' : pure virtual function was not defined

c:\users\adish\gentech\libs\iplreader\directx8\include\control.h(684) : see declaration of 'FreeEventParams'

c:\users\adish\gentech\otherlibs\stlsoft\comstl\interface_cast.hpp(515) : see reference to class template instantiation 'stlsoft::comstl_project::interface_cast_base<struct IMediaEvent,struct stlsoft::comstl_project::noaddref_release<struct
IMediaEvent>,struct stlsoft::comstl_project::ignore_interface_cast_exception>' being compiled
        c:\users\adish\tests\cvision2\cvapp.h(79) : see reference to class template instantiation 'stlsoft::comstl_project::interface_cast_test<struct IMediaEvent>' being compiled

Am I doing something wrong?

Thanks,
Adi
November 23, 2006
"Adi Shavit" <adish@gentech.co.il> wrote in message news:ek3o74$rfu$1@digitaldaemon.com...
> Hi,
>
>    I'm trying to use COMSTL with DirectShow, and I'm having compilation
> problems right from the start.
>
> I took a simple working DirectShow (which is based on COM) program (on
> MSVC++ 6.0), and tried adding a single line to see COMSTL in action.
>
> My code snippet:
>
>     //...
>
>      IGraphBuilder *pGraph;
>      IMediaEvent *pEvent;
>
>     //...
>
>        using namespace comstl;
>
>
>        CoInitialize(NULL);
>
>        pGraph= 0;
>
>        if (!FAILED(
>               CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC,
>                                IID_IGraphBuilder, (void **)&pGraph))) {
>
>        //...
>
>          pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent);
>
>          if (interface_cast_test<IMediaEvent>(pGraph)) //<< COMSTL usage
>            int j=0;                                    //dummy code
>
>        //...
>
> uses of interface_case_addref<> give similar problems.
>
> Here's a sample of my errors:
>
> c:\users\adish\gentech\otherlibs\stlsoft\comstl\interface_cast.hpp(302) : error C2259: 'IMediaEvent' : cannot instantiate abstract class due to following members:
>

<snip>

> Am I doing something wrong?

I believe you are. The cast is implemented to resemble cast-like syntax/semantics, not smart pointer. Hence, you need to cast to the type you want, i.e. IMediaEvent* not IMediaEvent.

:-)

Matthew




November 23, 2006
Don't know how parse text/html message
November 29, 2006
Hi,

  I've been playing with DirectShow and COMSTL.
Essentially, I took a simple working DirectShow app. and converting it into COMSTL and adding features.

I have some questions/remarks etc. regarding COMSTL, that I'd like to bring up.
I am a complete COM (and DirectShow) novice, so everything I say may be complete non-sense.
Please feel free to tell me so.

Heres what I have so far...

1. I guess this is no surprise but the documentation is horrible!
I use a combination of reading the source, searching the source for text and Google [Code Search]) for various versions of the documentation. The auto generated docs are often disconnected and it is hard to reach some module/functions/classes even from the project main page.
For example, there are 2 pages for interface_ptr<> one is essentially empty (the latest one [http://tinyurl.com/y39cfw]) and the other contains the docs (a version I found on through Google [http://tinyurl.com/uwa6q])
The CHM has similar problems.
The frame version of the docs. is impossible to use, it take minutes to properly load on my machine (if it doesn't hang).

2. In the spirit of RAII, maybe throw an exception (or report some error) if the interface_ptr<> is initialized with NULL/0. This will save a lot of error checking, and make the code clearer. Or maybe make an alternate type that does this, or a policy...

<heresy alert!>
3. Maybe allow automatic conversion to the underlying pointer type? Passing x.get_interface_ptr() to functions is ugly typing
</heresy alert!>

4. co_create_instance and its kin are undocumented.

5. Functions like co_create_instance and other initialization functions expect an address of a pointer as the second argument. This means that when used with interface_ptr, a temporary bare pointer must be used to be given like so:

      // Create a source filter specified by filename
      interface_ptr<IBaseFilter> pSource; // The interface_ptr<> object
      {
         IBaseFilter* ppSource= NULL; // temporary bare pointer


if(FAILED(pGraph->AddSourceFilter(a2w(c_str_ptr(filename)),0,&ppSource)))
         {
           //...
		   return 0;
         }
         pSource.set(ppSource, false); // setting the smart pointer.
      }

It would be useful to have a method that exposes the internal member so it can be used directly in such functions.
I know it might be dangerous (although there is an option to get the referent anyway) but maybe it should be considered.
	
6. Allow interface_cast_addref<>() to accept interface_ptr arguments instead of just bare pointers.
This would allow more readable code.

7. Consider making the second argument of interface_ptr<> default to false.  It seems to me that this would be in the spirit of RAII too. This would be the case when directly moving the newly received pointer (say from into the interface_ptr<>, without keeping an extra "bare" copy. (This is also related to 5 above).

8. A somewhat more general question.
Do you have any suggestions regarding error checking?
Having:

if(FAILED(...))
{
    ::MessageBox( ...);
    return 0;
}
all over the code is awful.

I think that's enough for now.

Despite this issues, I find COMSTL makes things easier, and certainly resource management is improved.

Thanks,
Adi
November 29, 2006
Adi

Thanks for that.

I'll deal with each point individually over the next few days.


December 02, 2006
> 4. co_create_instance

Have you not seen http://www.synesis.com.au/software/stlsoft/doc-1.9/namespacecomstl.html#19f6baeb98ad4f4636026577579f3d1d ? (Maybe because it's in the doc-1.9 area)

Or are you saying that's not good enough?

FTR: I've enhanced that a bit now, so that the overloads have the following examples:

1. With CLSID
    const CLSID CLSID_pantheios_COM_LoggerManager  = { 0x4E7D5C47, 0x8F96,
0x45DE, { 0x90, 0x5D, 0xAA, 0x3E, 0x9E, 0x59, 0x2D, 0xE3 } };

    IDispatch *logmgr;

if(SUCCEEDED(comstl::co_create_instance(CLSID_pantheios_com_LoggerManager,
&logmgr)))
    {
      logmgr->Release();
    }

2. With string form CLSID
    IDispatch *logmgr;

if(SUCCEEDED(comstl::co_create_instance("{4E7D5C47-8F96-45DE-905D-AA3E9E592D
E3}", &logmgr)))
    {
      logmgr->Release();
    }

3. With ProgId
    IDispatch *logmgr;
    if(SUCCEEDED(comstl::co_create_instance("pantheios.COM.LoggerManager",
&logmgr)))
    {
      logmgr->Release();
    }

> and its kin are undocumented.

What kin? Specifics please.


Cheers

Matthew



December 02, 2006
Correction:

    Example 1: The identifier is CLSID_pantheios_COM_LoggerManager, not
CLSID_pantheios_com_LoggerManager

    Examples 2 & 3: the strings must be prefixed with L

Silly me.


"Matthew" <matthew@hat.stlsoft.dot.org> wrote in message news:ekt3dc$1te6$1@digitaldaemon.com...
> > 4. co_create_instance
>
> Have you not seen
>
http://www.synesis.com.au/software/stlsoft/doc-1.9/namespacecomstl.html#19f6baeb98ad4f4636026577579f3d1d ?
> (Maybe because it's in the doc-1.9 area)
>
> Or are you saying that's not good enough?
>
> FTR: I've enhanced that a bit now, so that the overloads have the
following
> examples:
>
> 1. With CLSID
>     const CLSID CLSID_pantheios_COM_LoggerManager  = { 0x4E7D5C47, 0x8F96,
> 0x45DE, { 0x90, 0x5D, 0xAA, 0x3E, 0x9E, 0x59, 0x2D, 0xE3 } };
>
>     IDispatch *logmgr;
>
> if(SUCCEEDED(comstl::co_create_instance(CLSID_pantheios_com_LoggerManager,
> &logmgr)))
>     {
>       logmgr->Release();
>     }
>
> 2. With string form CLSID
>     IDispatch *logmgr;
>
>
if(SUCCEEDED(comstl::co_create_instance("{4E7D5C47-8F96-45DE-905D-AA3E9E592D
> E3}", &logmgr)))
>     {
>       logmgr->Release();
>     }
>
> 3. With ProgId
>     IDispatch *logmgr;
>     if(SUCCEEDED(comstl::co_create_instance("pantheios.COM.LoggerManager",
> &logmgr)))
>     {
>       logmgr->Release();
>     }
>
> > and its kin are undocumented.
>
> What kin? Specifics please.
>
>
> Cheers
>
> Matthew
>
>
>


December 03, 2006
Don't know how parse text/html message
December 03, 2006
I'll have a go at com_init.

The tutorial *and* sample app are both great ideas. Please remind me of this, if I forget, when we get to the point (within two weeks, hopefully) of declaring COMSTL ready for 1.9.1.

Cheers

> "Adi Shavit" <adish@gentech.co.il> wrote in message
news:ekunsk$qpe$1@digitaldaemon.com...
> Hi Matthew,
>
>
> It'll take me a while to reply to all of your answers, but I will get to
them all (got a busy week).
>
> > Have you not seen
> >
http://www.synesis.com.au/software/stlsoft/doc-1.9/namespacecomstl.html#19f6baeb98ad4f4636026577579f3d1d ?
> > (Maybe because it's in the doc-1.9 area)
> >
> > Or are you saying that's not good enough?
> > Anyway, I guess I either missed this section, looked in the wrong place,
or that I expected a page for each such function. Thanks.
>
>
> <snip>
>
> and its kin are undocumented.
>
> > What kin? Specifics please.
>
> I think I was referring to comstl::com_init which is also documented on
the same page.
>
> I guess what I was saying is that a simple tutorial/sample app to show how
to use the various COMSTL tools would be very informative. Maybe equivalent
long-hand and short-hand versions ( ;-) ) are what I expected.
>
> Adi


December 04, 2006
If you want my silly little DirectShow app, I can send/post that, thoug I guess most COM users would have different uses than DirectShow.

Adi


Matthew wrote:

> I'll have a go at com_init.
>
> The tutorial *and* sample app are both great ideas. Please remind me of
> this, if I forget, when we get to the point (within two weeks, hopefully) of
> declaring COMSTL ready for 1.9.1.
>
> Cheers
>
>   
>> "Adi Shavit" <adish@gentech.co.il> wrote in message
>>     
> news:ekunsk$qpe$1@digitaldaemon.com...
>   
>> Hi Matthew,
>>
>>
>> It'll take me a while to reply to all of your answers, but I will get to
>>     
> them all (got a busy week).
>   
>>> Have you not seen
>>>
>>>       
> http://www.synesis.com.au/software/stlsoft/doc-1.9/namespacecomstl.html#19f6baeb98ad4f4636026577579f3d1d ?
>   
>>> (Maybe because it's in the doc-1.9 area)
>>>
>>> Or are you saying that's not good enough?
>>> Anyway, I guess I either missed this section, looked in the wrong place,
>>>       
> or that I expected a page for each such function. Thanks.
>   
>> <snip>
>>
>> and its kin are undocumented.
>>
>>     
>>> What kin? Specifics please.
>>>       
>> I think I was referring to comstl::com_init which is also documented on
>>     
> the same page.
>   
>> I guess what I was saying is that a simple tutorial/sample app to show how
>>     
> to use the various COMSTL tools would be very informative. Maybe equivalent
> long-hand and short-hand versions ( ;-) ) are what I expected.
>   
>> Adi
>>     
>
>
>   
« First   ‹ Prev
1 2