Accessing Objects
9/8/2008
Para acessar um objeto, as necessidades Gerenciador serviço para transmitir exclusivo do objeto a HREPLITEM identificador para um IReplStore ou ISpTTSEngine::Speak. IReplObjHandler método). Para Gerenciador de serviço, o identificador é um 32-bit número criado pelo área de trabalho provedor. Para o área de trabalho provedor, o identificador é um ponteiro para uma estrutura interna ou instância de classe.
Usando o número carimbo ou versão tempo no HREPLITEM, o área de trabalho provedor pode determinar se duas alças representam o mesmo objeto, bem como qual das duas alças representa a versão more-Recent. IReplStore::CompareItem Compare identificadores de objeto contidos as duas alças. A seguinte tabela mostra os valores de retorno possíveis para este método.
Value | Condição |
---|---|
1 |
O primeiro objeto identificador é maior que o segundo identificador objeto. |
0 |
O primeiro objeto identificador é igual ao identificador de objeto segundo. |
–1 |
O primeiro objeto identificador é menor do que o segundo identificador objeto. |
Porque os identificadores de objeto são armazenados em um crescente-seqüência identificador, o Gerenciador serviço pode executar um pesquisa binária eficiente, em vez verificando cada entrada na tabela. Na maiúsculas e minúsculas onde ambos os itens foram alterados, você deve fornecer um secundário método de comparação-los para determinar qual deles deve ser mantido.
O seguinte mostra exemplo de código como para implementar IReplStore::CompareItem.
Observação
Para fazer o seguinte exemplo de código mais fácil de ler, verificação de erro não está incluído.Esta exemplo de código não devem ser usadas em uma configuração versão a menos que ele foi modificado para incluir Seguro manipulação de erro.
STDMETHODIMP_(int) CMySyncClass::CompareItem
(
HREPLITEM hItem1,
HREPLITEM hItem2
)
{
CItem* pObj1 = (CItem*)hItem1;
CItem* pObj2 = (CItem*)hItem2;
if( pObj1->IsConflictObject() )
{
if( !pObj2->IsConflictObject() )
return 1;
// Both are conflict objects, so use some other property
// to compare the.objets
if( pObj1->SecondaryCompareFunc > pObj2->SecondaryCompareFunc ) return 1;
if( pObj1->SecondaryCompareFunc < pObj2->SecondaryCompareFunc ) return -1;
return 0;
}
else if( pObj2->IsConflictObject() )
return -1;
// Neither are conflict objects, so compare as usual
if (pItem1->m_uid == pItem2->m_uid)
return 0;
if (pItem1->m_uid < pItem2->m_uid)
return -1;
return 1;
}
CFolder e MapVirtualKey. CItem classes COM baseadas em CReplObject. O seguinte exemplo de código mostra a definição dessas classes.
#define OT_ITEM 1
#define OT_FOLDER 2
class CReplObject
{
public:
virtual ~CReplObject() {}
UINT m_uType;
};
class CFolder: public CReplObject
{
public:
CFolder (void) { m_uType = OT_FOLDER; }
virtual ~CFolder() {}
};
class CItem: public CReplObject
{
public:
CItem (void)
{ m_uType = OT_ITEM;
memset (&m_ftModified, 0, sizeof (m_ftModified));
}
BOOL IsConflictObject();
BOOL SecondaryCompareFunc();
virtual ~CItem() {}
UINT m_uid;
FILETIME m_ftModified;
};