помогите начинающему
От: Аноним  
Дата: 13.06.05 14:59
Оценка:
На основе статьи
http://www.thecodeproject.com/string/use_regular_expression_in_your_program.asp
решил задействовать regex из vbscript.dll, в целях использования regexp в крошечной проге на winapi (даже crt обрезан)
Получил idl, однократным #import с опциями получил .tlh, вставил в прогу.
Набросал пробную функцию (грязный рабочий вариант)

int RegExpSearch( LPCTSTR szSearchPattern, LPCTSTR szTextForSearch, LPTSTR szOutBuf, int cbOutBuf, BOOL bReplace)
{

    HRESULT hres;
    static IRegExp * pRegExp = 0;
    static IMatch  * pIMatch = 0;
    static IMatchCollection  * pIMatchCollection = 0;

    VARIANT_BOOL vbMatch = 0;
    VARIANT_BOOL vbIgnoreCase = -1;
    VARIANT_BOOL vbGlobal = -1;


    // create the regex component
    hres = CoCreateInstance( CLSID_RegExp, NULL, CLSCTX_INPROC_SERVER, IID_IRegExp, (LPVOID *)&pRegExp);
        if (!SUCCEEDED(hres)) {        // ошибка создания RegExp компонента
            //vMsgBox("RegExp not created!",0);
ERR:                if (hres==REGDB_E_CLASSNOTREG )        vMsgBox("REGDB_E_CLASSNOTREG",0);
            if (hres==CLASS_E_NOAGGREGATION )    vMsgBox("CLASS_E_NOAGGREGATION",0);
            if (hres==E_NOINTERFACE  )        vMsgBox("E_NOINTERFACE",0);
            return -1;
        }
    hres = CoCreateInstance( CLSID_MatchCollection, NULL, CLSCTX_INPROC_SERVER, IID_IMatchCollection, (LPVOID *)&pIMatchCollection);
    if (!SUCCEEDED(hres)) {    goto ERR; }

        //
        //vMsgBox("RegExp created!",0);

    //
    //// set the regex pattern
    //CComBSTR bstrPattern(_T("[\\S]+[.]tmp"));
    BSTR bszPat = _T("vi(.)o");
    BSTR bszSea = _T("oksdhfosjdfoisdjfpsfjdpsdfkptxest;жаоьлiитявesttt_vito_ttttttghjkhjkhjlhjkljklk\n");

    

    hres =  pRegExp->put_Pattern(bszPat);
//    pRegExp->get_IgnoreCase(&vbIgnoreCase);
//    pRegExp->put_IgnoreCase(FALSE);
//    pRegExp->get_Global(&vbGlobal);
//    pRegExp->put_Global(vbGlobal);

    hres = pRegExp->Test(bszSea, (VARIANT_BOOL *)&vbMatch);
        if (!SUCCEEDED(hres) || !vbMatch) {        
                vMsgBox("RegExp not found!",0);
        }    



    //////////// конец работы
    // освобождаю компоненты
    if (pIMatchCollection)    pIMatchCollection->Release();
    if (pIMatch)    pIMatch->Release();
    if (pRegExp)    pRegExp->Release();

    return 1;
}


с RegExp — всё ОК (даже вроде работает — pRegExp->Test по крайней мере возвращает правильные результаты ), а вот когда попытался получить IMatch или IMatchCollection — проблемы, REGDB_E_CLASSNOTREG, записей в реестре нет, только для RegExp.

Чего делать-то надо в таком случае?


вот на всякий случай приведу .tlh

// Created by Microsoft (R) C/C++ Compiler Version 13.00.9466 (a3b0d9d4).
//
// d:\vcprojects\mark2\mark2\release\vbscript.tlh
//
// C++ source equivalent of Win32 type library vbscript.dll
// compiler-generated file created 06/11/05 at 20:04:03 - DO NOT EDIT!

#pragma once
#pragma pack(push, 8)

#include <comdef.h>

//
// Forward references and typedefs
//

struct __declspec(uuid("3f4daca7-160d-11d2-a8e9-00104b365c9f"))/* LIBID */ __VBScript_RegExp_55;
struct __declspec(uuid("3f4daca0-160d-11d2-a8e9-00104b365c9f"))/* dual interface */ IRegExp;
struct __declspec(uuid("3f4daca1-160d-11d2-a8e9-00104b365c9f"))/* dual interface */ IMatch;
struct __declspec(uuid("3f4daca2-160d-11d2-a8e9-00104b365c9f"))/* dual interface */ IMatchCollection;
struct __declspec(uuid("3f4dacb0-160d-11d2-a8e9-00104b365c9f"))/* dual interface */ IRegExp2;
struct __declspec(uuid("3f4dacb1-160d-11d2-a8e9-00104b365c9f"))/* dual interface */ IMatch2;
struct __declspec(uuid("3f4dacb2-160d-11d2-a8e9-00104b365c9f"))/* dual interface */ IMatchCollection2;
struct __declspec(uuid("3f4dacb3-160d-11d2-a8e9-00104b365c9f"))/* dual interface */ ISubMatches;
struct /* coclass */ RegExp;
struct /* coclass */ Match;
struct /* coclass */ MatchCollection;
struct /* coclass */ SubMatches;

//
// Smart pointer typedef declarations
//

_COM_SMARTPTR_TYPEDEF(IRegExp, __uuidof(IRegExp));
_COM_SMARTPTR_TYPEDEF(IMatch, __uuidof(IMatch));
_COM_SMARTPTR_TYPEDEF(IMatchCollection, __uuidof(IMatchCollection));
_COM_SMARTPTR_TYPEDEF(IRegExp2, __uuidof(IRegExp2));
_COM_SMARTPTR_TYPEDEF(IMatch2, __uuidof(IMatch2));
_COM_SMARTPTR_TYPEDEF(IMatchCollection2, __uuidof(IMatchCollection2));
_COM_SMARTPTR_TYPEDEF(ISubMatches, __uuidof(ISubMatches));

//
// Type library items
//

struct __declspec(uuid("3f4daca0-160d-11d2-a8e9-00104b365c9f"))
IRegExp : IDispatch
{
    //
    // Raw methods provided by interface
    //

      virtual HRESULT __stdcall get_Pattern (       /*[out,retval]*/ BSTR * pPattern ) = 0;
      virtual HRESULT __stdcall put_Pattern (       /*[in]*/ BSTR pPattern ) = 0;
      virtual HRESULT __stdcall get_IgnoreCase (    /*[out,retval]*/ VARIANT_BOOL * pIgnoreCase ) = 0;
      virtual HRESULT __stdcall put_IgnoreCase (    /*[in]*/ VARIANT_BOOL pIgnoreCase ) = 0;
      virtual HRESULT __stdcall get_Global (        /*[out,retval]*/ VARIANT_BOOL * pGlobal ) = 0;
      virtual HRESULT __stdcall put_Global (        /*[in]*/ VARIANT_BOOL pGlobal ) = 0;
      virtual HRESULT __stdcall Execute (      /*[in]*/ BSTR sourceString,/*[out,retval]*/ IDispatch * * ppMatches ) = 0;
      virtual HRESULT __stdcall Test (        /*[in]*/ BSTR sourceString,   /*[out,retval]*/ VARIANT_BOOL * pMatch ) = 0;
      virtual HRESULT __stdcall Replace (/*[in]*/BSTR sourceString,/*[in]*/BSTR replaceString,/*[out,retval]*/BSTR * pDestString ) = 0;
};

struct __declspec(uuid("3f4daca1-160d-11d2-a8e9-00104b365c9f"))
IMatch : IDispatch
{
    //
    // Raw methods provided by interface
    //

      virtual HRESULT __stdcall get_Value (  /*[out,retval]*/ BSTR * pValue ) = 0;
      virtual HRESULT __stdcall get_FirstIndex (   /*[out,retval]*/ long * pFirstIndex ) = 0;
      virtual HRESULT __stdcall get_Length (      /*[out,retval]*/ long * pLength ) = 0;
};

struct __declspec(uuid("3f4daca2-160d-11d2-a8e9-00104b365c9f"))
IMatchCollection : IDispatch
{
    //
    // Raw methods provided by interface
    //

      virtual HRESULT __stdcall get_Item (    /*[in]*/ long index,   /*[out,retval]*/ IDispatch * * ppMatch ) = 0;
      virtual HRESULT __stdcall get_Count (   /*[out,retval]*/ long * pCount ) = 0;
      virtual HRESULT __stdcall get__NewEnum (   /*[out,retval]*/ IUnknown * * ppEnum ) = 0;
};

struct __declspec(uuid("3f4dacb0-160d-11d2-a8e9-00104b365c9f"))
IRegExp2 : IDispatch
{
    //
    // Raw methods provided by interface
    //

      virtual HRESULT __stdcall get_Pattern (        /*[out,retval]*/ BSTR * pPattern ) = 0;
      virtual HRESULT __stdcall put_Pattern (        /*[in]*/ BSTR pPattern ) = 0;
      virtual HRESULT __stdcall get_IgnoreCase (     /*[out,retval]*/ VARIANT_BOOL * pIgnoreCase ) = 0;
      virtual HRESULT __stdcall put_IgnoreCase (     /*[in]*/ VARIANT_BOOL pIgnoreCase ) = 0;
      virtual HRESULT __stdcall get_Global (         /*[out,retval]*/ VARIANT_BOOL * pGlobal ) = 0;
      virtual HRESULT __stdcall put_Global (         /*[in]*/ VARIANT_BOOL pGlobal ) = 0;
      virtual HRESULT __stdcall get_Multiline (      /*[out,retval]*/ VARIANT_BOOL * pMultiline ) = 0;
      virtual HRESULT __stdcall put_Multiline (      /*[in]*/ VARIANT_BOOL pMultiline ) = 0;
      virtual HRESULT __stdcall Execute (        /*[in]*/ BSTR sourceString, /*[out,retval]*/ IDispatch * * ppMatches ) = 0;
      virtual HRESULT __stdcall Test (        /*[in]*/ BSTR sourceString,    /*[out,retval]*/ VARIANT_BOOL * pMatch ) = 0;
      virtual HRESULT __stdcall Replace (/*[in]*/ BSTR sourceString,/*[in]*/ VARIANT replaceVar,/*[out,retval]*/BSTR * pDestString ) = 0;
};

struct __declspec(uuid("3f4dacb1-160d-11d2-a8e9-00104b365c9f"))
IMatch2 : IDispatch
{
    //
    // Raw methods provided by interface
    //

      virtual HRESULT __stdcall get_Value (        /*[out,retval]*/ BSTR * pValue ) = 0;
      virtual HRESULT __stdcall get_FirstIndex (   /*[out,retval]*/ long * pFirstIndex ) = 0;
      virtual HRESULT __stdcall get_Length (       /*[out,retval]*/ long * pLength ) = 0;
      virtual HRESULT __stdcall get_SubMatches (   /*[out,retval]*/ IDispatch * * ppSubMatches ) = 0;
};

struct __declspec(uuid("3f4dacb2-160d-11d2-a8e9-00104b365c9f"))
IMatchCollection2 : IDispatch
{
    //
    // Raw methods provided by interface
    //

      virtual HRESULT __stdcall get_Item (        /*[in]*/ long index, /*[out,retval]*/ IDispatch * * ppMatch ) = 0;
      virtual HRESULT __stdcall get_Count (       /*[out,retval]*/ long * pCount ) = 0;
      virtual HRESULT __stdcall get__NewEnum (    /*[out,retval]*/ IUnknown * * ppEnum ) = 0;
};

struct __declspec(uuid("3f4dacb3-160d-11d2-a8e9-00104b365c9f"))
ISubMatches : IDispatch
{
    //
    // Raw methods provided by interface
    //

      virtual HRESULT __stdcall get_Item (        /*[in]*/ long index,  /*[out,retval]*/ VARIANT * pSubMatch ) = 0;
      virtual HRESULT __stdcall get_Count (     /*[out,retval]*/ long * pCount ) = 0;
      virtual HRESULT __stdcall get__NewEnum (  /*[out,retval]*/ IUnknown * * ppEnum ) = 0;
};

struct __declspec(uuid("3f4daca4-160d-11d2-a8e9-00104b365c9f"))    RegExp;
    // [ default ] interface IRegExp2

struct __declspec(uuid("3f4daca5-160d-11d2-a8e9-00104b365c9f"))    Match;
    // [ default ] interface IMatch2

struct __declspec(uuid("3f4daca6-160d-11d2-a8e9-00104b365c9f"))    MatchCollection;
    // [ default ] interface IMatchCollection2

struct __declspec(uuid("3f4dacc0-160d-11d2-a8e9-00104b365c9f"))    SubMatches;
    // [ default ] interface ISubMatches

//
// Named GUID constants initializations
//

extern "C" const GUID __declspec(selectany) LIBID_VBScript_RegExp_55 =    {0x3f4daca7,0x160d,0x11d2,{0xa8,0xe9,0x00,0x10,0x4b,0x36,0x5c,0x9f}};
extern "C" const GUID __declspec(selectany) IID_IRegExp                =    {0x3f4daca0,0x160d,0x11d2,{0xa8,0xe9,0x00,0x10,0x4b,0x36,0x5c,0x9f}};
extern "C" const GUID __declspec(selectany) IID_IMatch                =    {0x3f4daca1,0x160d,0x11d2,{0xa8,0xe9,0x00,0x10,0x4b,0x36,0x5c,0x9f}};
extern "C" const GUID __declspec(selectany) IID_IMatchCollection    =   {0x3f4daca2,0x160d,0x11d2,{0xa8,0xe9,0x00,0x10,0x4b,0x36,0x5c,0x9f}};
extern "C" const GUID __declspec(selectany) IID_IRegExp2            =   {0x3f4dacb0,0x160d,0x11d2,{0xa8,0xe9,0x00,0x10,0x4b,0x36,0x5c,0x9f}};
extern "C" const GUID __declspec(selectany) IID_IMatch2                =   {0x3f4dacb1,0x160d,0x11d2,{0xa8,0xe9,0x00,0x10,0x4b,0x36,0x5c,0x9f}};
extern "C" const GUID __declspec(selectany) IID_IMatchCollection2    =   {0x3f4dacb2,0x160d,0x11d2,{0xa8,0xe9,0x00,0x10,0x4b,0x36,0x5c,0x9f}};
extern "C" const GUID __declspec(selectany) IID_ISubMatches            =   {0x3f4dacb3,0x160d,0x11d2,{0xa8,0xe9,0x00,0x10,0x4b,0x36,0x5c,0x9f}};
extern "C" const GUID __declspec(selectany) CLSID_RegExp            =   {0x3f4daca4,0x160d,0x11d2,{0xa8,0xe9,0x00,0x10,0x4b,0x36,0x5c,0x9f}};
extern "C" const GUID __declspec(selectany) CLSID_Match                =   {0x3f4daca5,0x160d,0x11d2,{0xa8,0xe9,0x00,0x10,0x4b,0x36,0x5c,0x9f}};
extern "C" const GUID __declspec(selectany) CLSID_MatchCollection    =   {0x3f4daca6,0x160d,0x11d2,{0xa8,0xe9,0x00,0x10,0x4b,0x36,0x5c,0x9f}};
extern "C" const GUID __declspec(selectany) CLSID_SubMatches        =   {0x3f4dacc0,0x160d,0x11d2,{0xa8,0xe9,0x00,0x10,0x4b,0x36,0x5c,0x9f}};

#pragma pack(pop)
Re: помогите начинающему
От: ssm  
Дата: 13.06.05 15:21
Оценка:
Здравствуйте, Аноним, Вы писали:

А>    hres = CoCreateInstance( CLSID_MatchCollection, NULL, CLSCTX_INPROC_SERVER, IID_IMatchCollection, (LPVOID *)


А>с RegExp — всё ОК (даже вроде работает — pRegExp->Test по крайней мере возвращает правильные результаты ), а вот когда попытался получить IMatch или IMatchCollection — проблемы, REGDB_E_CLASSNOTREG, записей в реестре нет, только для RegExp.


А>Чего делать-то надо в таком случае?


Если бы ты был внимателен, то увидел бы, как создается, а вернее получается IMatchCollection && IMatchPtr.
Проанализируй еще раз DDX_RegExp, и золотой ключик у те бя в кармане
http://www.rsdn.org/File/13021/angler.gif
Re[2]: помогите начинающему
От: Аноним  
Дата: 13.06.05 20:48
Оценка: -1
Здравствуйте, ssm, Вы писали:

ssm>Здравствуйте, Аноним, Вы писали:


ssm>
А>>    hres = CoCreateInstance( CLSID_MatchCollection, NULL, CLSCTX_INPROC_SERVER, IID_IMatchCollection, (LPVOID *)
ssm>


А>>с RegExp — всё ОК (даже вроде работает — pRegExp->Test по крайней мере возвращает правильные результаты ), а вот когда попытался получить IMatch или IMatchCollection — проблемы, REGDB_E_CLASSNOTREG, записей в реестре нет, только для RegExp.


А>>Чего делать-то надо в таком случае?


ssm>Если бы ты был внимателен, то увидел бы, как создается, а вернее получается IMatchCollection && IMatchPtr.

ssm>Проанализируй еще раз DDX_RegExp, и золотой ключик у те бя в кармане

разобрался, спасибо!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.