На основе статьи
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)
Здравствуйте, Аноним, Вы писали:
А> hres = CoCreateInstance( CLSID_MatchCollection, NULL, CLSCTX_INPROC_SERVER, IID_IMatchCollection, (LPVOID *)
А>с RegExp — всё ОК (даже вроде работает — pRegExp->Test по крайней мере возвращает правильные результаты ), а вот когда попытался получить IMatch или IMatchCollection — проблемы, REGDB_E_CLASSNOTREG, записей в реестре нет, только для RegExp.
А>Чего делать-то надо в таком случае?
Если бы ты был внимателен, то увидел бы, как создается, а вернее получается IMatchCollection && IMatchPtr.
Проанализируй еще раз DDX_RegExp, и золотой ключик у те
бя в кармане