August 12, 2006
I know this project seems like total vapourware, but there have been some relevant movements recently. Specifically:

1. The next STLSoft 1.9.1 beta will include the new comstl components: bstr, variant and ole_object. bstr is a thin wrapper for BSTR, variant is a thin wrapper for VARIANT. ole_object is scripting driver, that allows you to drive an automation server's scripting interface from C++. A sample from one of the test drivers is included below. The current version of XMLSTL relied on Synesis Software components (BStr and Variant), which brought DLLs into the picture. Getting rid of all that makes a distributable form now much more straightforward.

2. My next book (after Extended STL; http://extendedstl.com/) is going to be about how to make C++ facades and libraries play nice. XMLSTL is going to be one of the cases studies. So I plan to strip it back to nothing and do a complete rewrite, and documenting it as I go. I plan to release it in an incremental fashion during that process, both in order to solicit useful feedback, and to trial the principles that'll be espoused in the new book. This process should start in September, I hope. (There will also be some other case studies carried out, probably including a DbSTL wrapper library for SQLite3.) If anyone wants to volunteer for any of these, just post a note or drop me a line (via http://imperfectcplusplus.com/) and I'll get in touch when the work starts.

Cheers

Matthew


  LPDISPATCH  pdisp;
  HRESULT     hr  = comstl::co_create_instance(L"openrj.com.Database",
&pdisp);
//  HRESULT   hr  =
comstl::co_create_instance(L"{75A04F35-6389-4F9C-9BCA-6FAFFC818BA3}",
&pdisp);

  if(FAILED(hr))
  {
    ::fprintf(stderr, "Failed: %s\n", winstl::error_desc(hr).c_str());
  }
  else
  {
    using comstl::bstr;
    using comstl::ole_object;

    ole_object  database(pdisp, false);

    ole_object  DatabaseFlags =
ole_object::create(L"openrj.com.DatabaseFlags",
comstl::coercion_level::nonDestructiveTruncation);

    LPCOLESTR fileName  =
L"H:\\freelibs\\openrj\\current\\samples\\pets\\pets.orj";

    long      flags     =
DatabaseFlags.get_property<long>(L"ElideBlankRecords");

    database.invoke_method_v(L"OpenFile", fileName, flags);

    stlsoft::ref_ptr<IUnknown>  _Enum =
database.get_property(of_type<stlsoft::ref_ptr<IUnknown> >(),
DISPID_NEWENUM);


    bstr    DocString = database.get_property<bstr>(L"DocString");


    bstr    File    = database.get_property<bstr>(L"File");
    long    NumFields = database.get_property<long>(L"NumFields");
    long    NumRecords  = database.get_property<long>(L"Count");

    { for(long i = 0; i < NumRecords; ++i)
    {
      ole_object  record        = database[i];
      long        Count = record.get_property<long>(L"Count");
      bstr        Comment       = record.get_property<bstr>(L"Comment");

      { for(long j = 0; j < Count; ++j)
      {
        ole_object  field = record[j];
        bstr    Name  = field.get_property<bstr>(L"Name");
        bstr    Value = field.get_property<bstr>(L"Value");
      }}
    }}

    database.invoke_method_v(L"Close");
  }




August 13, 2006
Matthew escreveu:
> I know this project seems like total vapourware, but there have been some relevant movements recently. Specifically:

Mathew, it is 'dryiceware': you see some fumes but in core there is substance!!

Keep going with this nice work :-)