Pull to refresh
0
0
Ульяна@uta

User

Send message
Можно добавить Nelisquare — добротный, функциональный и шустрый клиент для Foursquare.
В ovi store его нет, но можно установить или с сайта или с поста-обсуждения на talk.maemo.org

Умеет работать с Molo.me, так что можно удобно и быстро постить в 4sq фотки в стиле инстаграм :)
В последней бете (от 10 декабря 2012) умеет интегрироваться с домашним каналом.
Уведомляет о новых версиях: доступны обновления до стабильных, бета, альфа версий.
Вы или не понимаете что пишете или не знаете какую проблему решаете.
COM_INTERFACE_ENTRY_FUNC(my_left_iid,0,myfunc)

приведет к тому что myfunc вызовется только когда riid интерфейса который пытаются запросить будет соответствовать my_left_iid и проверка его внутри функции всегда будет срабатывать, потому что с другим iid ваша функция не вызовется.

если же вместо второго параметра указывать
offsetofclass(IComInterface3, _ComMapClass)

то будет и проверка компилятора

считаю продолжение диалога бесмысленным.

Переаттестация — отличный способ определить реальный уровень технической грамотности вашего отдела разработки ПО.
ваша параноя вносит ошибки которые вы описали в статье. правильное использование стандартных средств таких ошибок не дает и не требует множественного перечисления интерфесов в разных местах.
«предельно подробная выдача» — это лукавство. Вы в своем методе имеете не больше информации чем внутри ENTRY_FUNC или блайнда.
Читаем первый комментарий, при ошибке в карте будет ошибка компиляции.
в вашем объекте — ваш код, а ваш код включает ваши заголовки, а в ваших заголовках вся ваша параноя и проверки все внутри вашего кода уже есть из шаблонов.
riid будет содержать его, потому что функция не блайнд и он уже проверен, иначе он не попал бы в указанную функцию
if (bBlind || InlineIsEqualGUID(*(pEntries->piid), iid))
{
	if (pEntries->pFunc == _ATL_SIMPLEMAPENTRY) //offset
	{
		ATLASSERT(!bBlind);
		IUnknown* pUnk = (IUnknown*)((INT_PTR)pThis+pEntries->dw);
		pUnk->AddRef();
		*ppvObject = pUnk;
		return S_OK;
	}
	else //actual function call
	{
		HRESULT hRes = pEntries->pFunc(pThis,
			iid, ppvObject, pEntries->dw);
		if (hRes == S_OK || (!bBlind && FAILED(hRes)))
			return hRes;
	}
}
После этого был запрос интерфейса. потому что мы в фунции запроса интерфейса.

Хотите узнать удачным ли он был? блайнд функция в конец, попали в неё, запрашиваемый интерфес не нашли.
*) в myfunc_3 вернуть надо не E_NOINTERFACE, а S_FALSE для продолжения обработки
riid содержит тот интерфейс который хотят запросить, проверок на «идентификатор интерфейса» никаких не надо, всё проверено до этого и именно потому попало в нужную вам функцию.

>>Где же здесь что-либо похожее не вызов InternalQueryInterface()?
файл atlcom.h хоть раз в жизни открывали? до atlbase.inl проходили?
То что вы описываете называется велосипедостроением и не знанием основ работы COM.

хотите ослеживать всё — вставьте в начало карты блайнд функцию, сохраняйте всё что угодно.

BEGIN_COM_MAP(CYetOtherImplementor)
	//следим за всеми интерфейсами, даже теми которые мы не поддерживаем
	COM_INTERFACE_ENTRY_FUNC_BLIND(0,myfunc)  //самый первый элемент в карте
...
	//размещаем выше нужного интерфейса если нужно следить только за ним
	//COM_INTERFACE_ENTRY_FUNC(__uuidof(IComInterface3),0,myfunc_3) 
...
	COM_INTERFACE_ENTRY(IComInterface1)
	COM_INTERFACE_ENTRY(IComInterface3)
...
	COM_INTERFACE_ENTRY(IComInterface10)
...
END_COM_MAP()

static HRESULT WINAPI myfunc(void* pv, REFIID riid, LPVOID* ppv, DWORD_PTR dw)
{
	//do some loggin for params
	//riid -> clsid -> bstr, progid
	return E_NOINTERFACE; //заставить работать далее по карте
}

static HRESULT WINAPI myfunc_3(void* pv, REFIID riid, LPVOID* ppv, DWORD_PTR dw)
{
	//do some loggin for params	
	//riid always == __uuidof(IComInterface3)
	return E_NOINTERFACE; //заставить работать далее по карте
}
Никакой, я говорю про принцип.

Для того чтобы отследить все запросы определенного интерфейса делаем так:

было:
BEGIN_COM_MAP(CYetOtherImplementor)
...
     COM_INTERFACE_ENTRY(IComInterface3)
...
END_COM_MAP()

стало:
BEGIN_COM_MAP(CYetOtherImplementor)
...
     COM_INTERFACE_ENTRY_FUNC(IID_IComInterface3,offsetofclass(IComInterface3, _ComMapClass),myfunc)
...
END_COM_MAP()

static HRESULT WINAPI myfunc(void* pv, REFIID riid, LPVOID* ppv, DWORD_PTR dw)
{
	//do some loggin for params

	//default behavior
	IUnknown* pUnk = (IUnknown*)((INT_PTR)pv+dw);
	pUnk->AddRef();
	*ppv = pUnk;
	return S_OK;
}
Реализуйте логику логирования в своем хуке, но не переделывайте логику получения интерфейса. Вызовите далее по цепочке стандартный InternalQueryInterface, как это делает COM_INTERFACE_ENTRY_CHAIN
а зачем прописывать всё вручную? варианты со стандарными решения защищающими от копипасты по каким-то причинам не проходят?
BEGIN_COM_MAP(CYetOtherImplementor)
	//COM_INTERFACE_ENTRY(IComInterface2) //активируйте и получите ошибку
	COM_INTERFACE_ENTRY(IComInterface3)
	COM_INTERFACE_ENTRY(IComInterface4)
....
	COM_INTERFACE_ENTRY(IComInterface10)
END_COM_MAP()

Если попытаетесь использовать интерфейс которого нет в базовых у CYetOtherImplementor будет вам предупреждение
Мы для одного журнала правили просто поправили в шрифте длинное тире и дефис.
Да, решение очень хорошее, конечно, опционально.

> Остается ответить на вопрос, зачем нужно оставить форму ввода нового отзыва на странице с товаром, хотя ею никто не будет пользоваться.
О крупных недостатках обычно с большим удовольствием сообщают. И если продают / перепродают.

Information

Rating
Does not participate
Location
Москва, Москва и Московская обл., Россия
Date of birth
Registered
Activity