Pergunta

I geraram um objeto ATL COM usando VS2008 eo código contém referências a uma definição chamada _MERGE_PROXYSTUB (porque eu escolhi a opção 'Mesclar procuração / ramal' quando eu inicialmente correu o assistente.)

O que é o ponto de um proxy / stub? Se eu não selecionar a opção da fusão quando eu fico um MyControlPS.DLL separada em vez? - quando isso seria já usou

FWIW o controle parece registrar e funcionam bem se eu remover todo o código cercado pelas define _MERGE_PROXYSTUB. A compilação de depuração nem sequer definir _MERGE_PROXYSTUB e ainda funciona OK.

Assim, posso fazer sem um proxy / stub?

Foi útil?

Solução

Você precisa de um / stub proxy se você quer que seu objeto COM a ser chamado a partir de um aplicativo usando um modelo de segmentação diferente do seu objeto COM.

Por exemplo, temos um plug-in que é carregado por um aplicativo que usa um modelo de segmentação particular (não lembro qual), mas nosso objeto COM é multithreaded apartment (MTA) - para que o proxy / stub é necessária para marshall os dados entre os objetos quando uma chamada de função é feita, enquanto ainda aderindo às regras do modelo de segmentação.

Se essas regras são quebradas, então COM será ou lançar uma exceção ou retornar uma falha HRESULT, como RPC_E_WRONG_THREAD

Se você não marcar a opção proxy / stub junção, então o Visual Studio produz um projeto separado para o proxy / stubs que recebem de construção em uma dll separada. Isso torna as coisas mais difíceis para a implantação, se forem necessários, mas basicamente você pode simplesmente ignorá-los se você não são afetados por enfiar questões modelo.

Assim que você pode fazer sem proxy / stubs se a aplicação chamar o objeto COM é usando o mesmo modelo de segmentação como seu objeto

Larry Osterman fornece uma introdução legível para modelos de segmentação em seu blog.

Outras dicas

Além disso, se as interfaces contêm somente os tipos digite-friendly-biblioteca (BSTR, variante, etc.) e aparecem no bloco de biblioteca do seu IDL, você pode optar por tê-los "biblioteca de tipos marshalled" o que significa que um sistema fornecido proxy / stub usa o meta-dados a partir da biblioteca tipo.

Quando as interfaces são colocados dentro do bloco de biblioteca e DllRegisterServer é personalizado para registrar a biblioteca de tipos (passe TRUE para XxxModule :: DllRegisterServer, se bem me lembro) suas interfaces será comandada pelo sistema, se necessário, como descrito por John Sibly.

Nesse ponto, o proxy / stub é nem mesmo usado, então _MERGE_PROXYSTUB não tem efeito.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top