tags:

views:

726

answers:

0

Using Matt Curland's Type Library Editor, I wrote a Typelib for Nick Yakowlew's Charset Detector Library. This is a standard DLL (written in Delphi as it happens) and not a COM DLL at all.

Up until this point I had been building ODL and thus TLB files "by hand". The benefit of this was that I could get Intellisense working in Visual Studio 6 (esp. VB6) and also be able to pass widestrings to DLLs without said strings being mangled into ANSI in the process. Once I had generated the TLB from the ODL using MIDL, I had but to register the TLB using regtlib, add a reference to that typelib in VB6 and cut code. And once the binary had been built, I didn't need to have the typelib around.

The typelib made by Curland's tool seems to work a little differently. It forces me to have the typelib registered for the binary to access the DLL. I exported the TLB to IDL and, well it looks a bit different to the ODL I've been writing. For one thing, there are typedefs and structs and enums. Okay, I put those in there via Curland's TLE and they need to remain. But I don't want to have to register the TLB -- I want to do things the old way.

So what do I do to the IDL below, to make it the kind of ODL I'm familiar with, yet maintain the functionality, all without needing the TLB to be registered once the binary has been produced?

// Generated .IDL file (by the OLE/COM Object Viewer)
// 
// typelib filename: chsdet.tlb

[
  uuid(316A83D7-8BF4-490E-BDDE-75EBC332C355),
  version(1.0),
  helpstring("Charset Detector - as the name says - is a stand alone executable module for automatic charset detection of a given text.\r\n\t\r\nIt can be useful for internationalisation support in multilingual applications such as web-script editors or Unicode editors.\r\n\t\r\nGiven input buffer will be analysed to guess used encoding. The result can be used as control parameter for charset conversation procedure.\r\n\t\r\nCharset Detector can be compiled (and hopefully used) for MS Windows (as dll - dynamic link library) or Linux.\r\n\t\r\nBased on Mozilla's i18n component - http://www.mozilla.org/projects/intl/. \r\n\r\nCharset Detector is open source project and distributed under Lesser GPL.\r\nSee the GNU Lesser General Public License for more details - http://www.opensource.org/licenses/lgpl-license.php\r\n\r\nNikolaj Yakowlew \xFFFFFFA9 2006-2008 \r\nTypeLib by Bruce M. Axtens, 2008.")
]
library CHSDET
{
    // TLib :     // Forward declare all types defined in this typelib

    [
      dllname("CHSDET.dll"),
      version(1.0),
      helpstring("Functions in CHSDET.DLL")
    ]
    module CHSDETFunctions {
 [entry(0x60000000), helpstring("Returns rAbout record (qv)")]
 void _stdcall GetAbout([in, out] rAbout* AboutRec);
 [entry(0x60000001), helpstring("Reset detector. Prepares for new analysis.")]
 void _stdcall Reset();
 [entry(0x60000002), helpstring("Analyse given buffer of specified length.

Return value is of eHandleDataErrors, either 
NS_ERROR_OUT_OF_MEMORY (Unable to create internal objects) or NS_OK.

Function can be called more that one time to continue guessing. Charset Detector remembers last state until Reset called.")]
 void _stdcall HandleData(
   [in] BSTR aBuf, 
   [in] short aLen, 
   [out, retval] short* retVal);
 [entry(0x60000003), helpstring("Returns either TRUE (Charset Detector is sure about text encoding.) or FALSE.

NB: If input buffer is smaller then 1K, Charset Detector returns FALSE.")]
 void _stdcall IsDone([out, retval] short* retVal);
 [entry(0x60000004), helpstring("Signal data end. If Charset Detector hasn't sure result (IsDone = FALSE) the best guessed encoding will be set as result.")]
 void _stdcall DataEnd();
 [entry(0x60000005), helpstring("Returns guessed charset as rCharsetInfo record")]
 void _stdcall GetDetectedCharset([out, retval] rCharsetInfo* retVal);
 [entry(0x60000006), helpstring("Returns all supported charsets in form "0x0A Name - CodePage"")]
 void _stdcall GetKnownCharsets(
   [in, out] long* sList, 
   [out, retval] long* retVal);
 [entry(0x60000007), helpstring("Return eBOMKind value matching byte order mark (if any) of input data.")]
 void _stdcall GetDetectedBOM([out, retval] eBOMKind* retVal);
 [entry(0x60000008), helpstring("Remove CodePage from consideration as a possible match")]
 void _stdcall DisableCharsetCP([in] long CodePage);
    };

    typedef [uuid(91694067-30AB-44A9-A210-F5602935475F)]
    struct tagrAbout {
 long lMajor;
 long lMinor;
 long lRelease;
 long sAbout;
    } rAbout;

    typedef [uuid(3C8B7420-D40B-458B-8DE8-9B3D28607396)]
    enum {
 BOM_Not_Found = 0,
 BOM_UCS4_BE = 1,
 BOM_UCS4_LE = 2,
 BOM_UCS4_2143 = 3,
 BOM_UCS4_3412 = 4,
 BOM_UTF16_BE = 5,
 BOM_UTF16_LE = 6,
 BOM_UTF8 = 7
    } eBOMKind;

    typedef [uuid(9B231DEF-93FB-440D-B06B-D760AECE09D0)]
    struct tagrCharsetInfo {
 long Name;
 short CodePage; 
 long Language;
    } rCharsetInfo;

    typedef enum {
 NS_OK = 0,
 NS_ERROR_OUT_OF_MEMORY = -2147024882
    } eHandleDataErrors;
};