Click here to Skip to main content
15,903,856 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
I'm trying to use this class as it's part of WinHttpClient, but I get the following errors (It works on Unicode, but then unicode breaks all my code so I figured I'd fix that instead):

C++
Erreur	2	error C2664: 'ATL::REParseError ATL::CAtlRegExp<ATL::CAtlRECharTraits>::Parse(const char *,BOOL)' : impossible de convertir l'argument 1 de 'const wchar_t *' en 'const char *'	c:\users\david\desktop\directx\overlay\Project\RegExp.h	52	1	Output

Erreur	3	error C2664: 'BOOL ATL::CAtlRegExp<ATL::CAtlRECharTraits>::Match(const char *,ATL::CAtlREMatchContext<CharTraits> *,const char **)' : impossible de convertir l'argument 1 de 'const wchar_t *' en 'const char *'	c:\users\david\desktop\directx\overlay\Project\RegExp.h		70	1	Output

Erreur	4	error C2664: 'void ATL::CAtlREMatchContext<CharTraits>::GetMatch(UINT,ATL::CAtlREMatchContext<CharTraits>::MatchGroup *)' : impossible de convertir l'argument 2 de 'const wchar_t **' en 'const char **'	c:\users\david\desktop\directx\overlay\Project\RegExp.h		78	1	Output


	5	IntelliSense : l'argument de type "const wchar_t *" est incompatible avec le paramètre de type "const ATL::CAtlRECharTraitsA::RECHARTYPE *"	c:\users\david\desktop\directx\overlay\Project\RegExp.h		52	32	Output

	6	IntelliSense : l'argument de type "const wchar_t *" est incompatible avec le paramètre de type "const ATL::CAtlRECharTraitsA::RECHARTYPE *"	c:\users\david\desktop\directx\overlay\Project\RegExp.h		70	23	Output

	7	IntelliSense : l'argument de type "const wchar_t **" est incompatible avec le paramètre de type "const ATL::CAtlRECharTraitsA::RECHARTYPE **"	c:\users\david\desktop\directx\overlay\Project\RegExp.h		70	35	Output

	8	IntelliSense : aucune instance de fonction surchargée "ATL::CAtlREMatchContext<CharTraits>::GetMatch [avec CharTraits=ATL::CAtlRECharTraits]" ne correspond à la liste d'arguments
            les types d'arguments sont : (int, const wchar_t **, const wchar_t **)
            le type d'objet est : ATL::CAtlREMatchContext<ATL::CAtlRECharTraits>	c:\users\david\desktop\directx\overlay\Project\RegExp.h		78	7	Output


C++
/**
*  Copyright 2008-2009 Cheng Shi.  All rights reserved.
*  Email: shicheng107@hotmail.com
*/

#ifndef REGEXP_H
#define REGEXP_H

#include <iostream>
#include <string>
#include <vector>
using namespace std;

#pragma warning(push)
#pragma warning(disable: 6385 6011 4127)
#include "atlrx.h"
#pragma warning(pop)

/*
* Parameters
*  [in] regExp: Value of type string which is the input regular expression.
*  [in] caseSensitive: Value of type bool which indicate whether the parse is case sensitive.
*  [in] groupCount: Value of type int which is the group count of the regular expression.
*  [in] source: Value of type string reference which is the source to parse.
*  [out] result: Value of type vecotr of strings which is the output of the parse.
*  [in] allowDuplicate: Value of type bool which indicates whether duplicate items are added to the output result.
*
* Return Value
*  Returns true if the function succeeds, or false otherwise.
*
* Remarks
*  The output result is devided into groups.  User should get the groups according to the group count.  For example:
*  1. RegExp = L"{ab}", source = L"abcabe", then result = L"ab", L"ab".
*  2. RegExp = L"{ab}{cd}", source = L"abcdeabecd", then result = L"ab", L"cd", L"ab", L"cd".
*/
inline bool ParseRegExp(const wstring ®Exp, bool caseSensitive, int groupCount, const wstring &source, vector<wstring> &result, bool allowDuplicate = false)
{
	result.clear();
	if (regExp.size() <= 0)
	{
		return false;
	}
	if (groupCount <= 0)
	{
		return false;
	}
	if (source.size() <= 0)
	{
		return false;
	}
	CAtlRegExp<> re;
	REParseError error = re.Parse(regExp.c_str(), caseSensitive);
	if (error != REPARSE_ERROR_OK)
	{
		return false;
	}
	wchar_t *pSource = new wchar_t[source.size() + 1];
	wchar_t *pSourceEnd = pSource + source.size();
	if (pSource == NULL)
	{
		return false;
	}
	wcscpy_s(pSource, source.size() + 1, source.c_str());
	BOOL bSucceed = TRUE;
	CAtlREMatchContext<> mc;
	const wchar_t *pFrom = pSource;
	const wchar_t *pTo = NULL;
	while (bSucceed)
	{
		bSucceed = re.Match(pFrom, &mc, &pTo);
		if (bSucceed)
		{
			const wchar_t *pStart = NULL;
			const wchar_t *pEnd = NULL;
			vector<wstring> tempMatch;
			for (int i = 0; i < groupCount; i++)
			{
				mc.GetMatch(i, &pStart, &pEnd);
				if (pStart != NULL && pEnd != NULL)
				{
					wstring match(pStart, pEnd - pStart);
					tempMatch.push_back(match);
				}
				else
				{
					break;
				}
			}
			bool bAdd = true;
			if (!allowDuplicate)
			{
				// Check whether this match already exists in the vector.
				for (vector<wstring>::iterator it = result.begin(); it != result.end();)
				{
					bool bEqual = true;
					for (vector<wstring>::iterator tempMatchIt = tempMatch.begin(); tempMatchIt != tempMatch.end(); tempMatchIt++, it++)
					{
						bool bGroupEqual = true;
						if (caseSensitive)
						{
							bGroupEqual = (wcscmp(it->c_str(), tempMatchIt->c_str()) == 0);
						}
						else
						{
							bGroupEqual = (_wcsicmp(it->c_str(), tempMatchIt->c_str()) == 0);
						}
						if (!bGroupEqual)
						{
							bEqual = false;
						}
					}
					if (bEqual)
					{
						bAdd = false;
						break;
					}
				}
			}
			if (bAdd)
			{
				for (vector<wstring>::iterator tempMatchIt = tempMatch.begin(); tempMatchIt != tempMatch.end(); tempMatchIt++)
				{
					result.push_back(*tempMatchIt);
				}
			}
			if (pTo < pSourceEnd)
			{
				pFrom = pTo;
			}
			else
			{
				break;
			}
		}
		else
		{
			break;
		}
	}

	delete[] pSource;

	return true;
}

#endif // REGEXP_H



Does anyone can help me fix that? Tried change wstring by string etc but it didn't work.
Posted
Comments
barneyman 28-Oct-15 22:45pm    
use the TCHAR and _T("" )defines - that will be char or wchar depending on your compile - the Regex and Http libs have both impls

1 solution

You can try to use the W2A or W2CA macro, see ATL and MFC String Conversion Macros[^]
 
Share this answer
 

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900