/*
 * Typelib for hhctrl
 *
 * Copyright 2010 Alexandre Julliard
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 */

#pragma makedep regtypelib

import "unknwn.idl";
import "objidl.idl";
import "oaidl.idl";

[
    helpstring("HHCtrl 4.0 Type Library"),
    version(4.0),
    uuid(adb880a2-d8ff-11cf-9377-00aa003b7a11)
]
library HHCTRLLib
{
    importlib("stdole2.tlb");

    [
        helpstring("IHHCtrl Interface"),
        odl,
        dual,
        oleautomation,
        uuid(adb880a1-d8ff-11cf-9377-00aa003b7a11)
    ]
    interface IHHCtrl : IDispatch
    {
      /* FIXME */
    }

    [
        helpstring("Event interface for HHCtrl"),
        uuid(adb880a3-d8ff-11cf-9377-00aa003b7a11)
    ]
    dispinterface _HHCtrlEvents
    {
        properties:
        methods:
            [id(0)] void Click(BSTR ParamString);
    }

    [
        helpstring("HHCtrl Object"),
        progid("Internet.HHCtrl.1"),
        vi_progid("Internet.HHCtrl"),
        threading(apartment),
        version(1.0),
        uuid(adb880a6-d8ff-11cf-9377-00aa003b7a11)
    ]
    coclass OldHHCtrl1
    {
        [default] interface  IHHCtrl;
        [default, source] dispinterface  _HHCtrlEvents;
    }

    [
        helpstring("HHCtrl Object"),
        progid("Internet.HHCtrl.1"),
        vi_progid("Internet.HHCtrl"),
        threading(apartment),
        version(1.0),
        uuid(41b23c28-488e-4e5c-ace2-bb0bbabe99e8)
    ]
    coclass OldHHCtrl2
    {
        [default] interface IHHCtrl;
        [default, source] dispinterface _HHCtrlEvents;
    }

    [
        helpstring("HHCtrl Object"),
        progid("Internet.HHCtrl.1"),
        vi_progid("Internet.HHCtrl"),
        threading(apartment),
        version(1.0),
        uuid(52a2aaae-085d-4187-97ea-8c30db990436)
    ]
    coclass HHCtrl
    {
        [default] interface IHHCtrl;
        [default, source] dispinterface _HHCtrlEvents;
    }
}
