Marechal. Método GetHRForException (Exception)
A documentação de referência da API tem uma nova casa. Visite o navegador da API no docs. microsoft para ver a nova experiência.
Converte a exceção especificada em um HRESULT.
Assembly: mscorlib (em mscorlib. dll)
Parâmetros.
A exceção para converter em um HRESULT.
Valor de retorno.
O HRESULT mapeado para a exceção fornecida.
GetHRForException também configura uma interface IErrorInfo para a exceção que pode ser obtida chamando a função COM GetErrorInfoNEEDGUID. Você pode usar essa função para retornar um valor HRESULT em uma implementação de classe gerenciada de uma interface COM onde você aplica o atributo PreserveSigAttribute. Ter o método atribuído pegar todas as exceções e usar o método GetHRForException para retornar o valor HRESULT apropriado. Permitir que uma exceção se propague fora do método produz um comportamento incorreto. (Na verdade, o tempo de execução da linguagem comum não consegue passar uma exceção para um cliente COM que chama esse método através de uma tabela v.)
Observe que o método GetHRForException define a interface IErrorInfo do segmento atual. Isso pode causar resultados inesperados para métodos como os métodos ThrowExceptionForHR que padrão para usar o IErrorInfo do segmento atual se ele estiver configurado.
requer confiança total para o chamador imediato. Este membro não pode ser usado por código parcialmente confiável ou transparente.
Marshal. GetHRForException Method.
Converte a exceção especificada em um HRESULT.
Parâmetros.
Valor de retorno.
O HRESULT mapeado para a exceção fornecida.
GetHRForException também configura uma interface IErrorInfo para a exceção que pode ser obtida chamando o método GetErrorInfo COM API. Você pode usar esse método para retornar um valor HRESULT em uma implementação de classe gerenciada de uma interface COM onde você aplica o System. Runtime. InteropServices. PreserveSigAttribute. Tenha o método atribuído pegar todas as exceções e usar GetHRForException para retornar o valor HRESULT apropriado. Permitir que uma exceção se propague fora do método produz um comportamento incorreto. (Na verdade, o tempo de execução da linguagem comum não consegue passar uma exceção para um cliente COM chamando esse método através de uma tabela v.) Para obter informações adicionais sobre a interface IErrorInfo e os métodos COM GetErrorInfo, consulte a Biblioteca MSDN.
Nota Este método usa SecurityAction. LinkDemand para evitar que seja chamado de código não confiável; apenas o chamador imediato é necessário para ter a permissão SecurityPermissionAttribute. UnmanagedCode. Se o seu código pode ser chamado a partir de código parcialmente confiável, não passe a entrada do usuário para métodos de classe Marshal sem validação. Para limitações importantes ao usar o membro LinkDemand, veja Demand vs. LinkDemand.
Requisitos.
Plataformas: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, família Windows Server 2003.
Marshal. GetHRForException Method.
Converte a exceção especificada em um HRESULT.
Parâmetros.
Valor de retorno.
O HRESULT mapeado para a exceção fornecida.
GetHRForException também configura uma interface IErrorInfo para a exceção que pode ser obtida chamando o método GetErrorInfo COM API. Você pode usar esse método para retornar um valor HRESULT em uma implementação de classe gerenciada de uma interface COM onde você aplica o System. Runtime. InteropServices. PreserveSigAttribute. Tenha o método atribuído pegar todas as exceções e usar GetHRForException para retornar o valor HRESULT apropriado. Permitir que uma exceção se propague fora do método produz um comportamento incorreto. (Na verdade, o tempo de execução da linguagem comum não consegue passar uma exceção para um cliente COM chamando esse método através de uma tabela v.) Para obter informações adicionais sobre a interface IErrorInfo e os métodos COM GetErrorInfo, consulte a Biblioteca MSDN.
Nota Este método usa SecurityAction. LinkDemand para evitar que seja chamado de código não confiável; apenas o chamador imediato é necessário para ter a permissão SecurityPermissionAttribute. UnmanagedCode. Se o seu código pode ser chamado a partir de código parcialmente confiável, não passe a entrada do usuário para métodos de classe Marshal sem validação. Para limitações importantes ao usar o membro LinkDemand, veja Demand vs. LinkDemand.
Requisitos.
Plataformas: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, família Windows Server 2003.
Classe Marshal.
A documentação de referência da API tem uma nova casa. Visite o navegador da API no docs. microsoft para ver a nova experiência.
Fornece uma coleção de métodos para alocar memória não gerenciada, copiando blocos de memória não gerenciados e conversão gerenciada em tipos não gerenciados, bem como outros métodos diversos usados ao interagir com o código não gerenciado.
Assembly: mscorlib (em mscorlib. dll)
Incrementa a contagem de referência na interface especificada.
Aloca um bloco de memória de tamanho especificado do alocador de memória de tarefa COM.
Aloca memória da memória não gerenciada do processo usando o número especificado de bytes.
Aloca a memória da memória não gerenciada do processo usando o ponteiro para o número especificado de bytes.
Indica se os wrappers invocáveis em tempo de execução (RCWs) de qualquer contexto estão disponíveis para limpeza.
Obtém um ponteiro de interface identificado pelo moniker especificado.
Altera a força do identificador COM Wrapper (CCW) de um objeto.
Notifica o tempo de execução para limpar todos os Enrolados chamáveis do tempo de execução (RCWs) alocados no contexto atual.
Copia dados de uma matriz de número inteiro não assinada de 8 bits gerenciada para um ponteiro de memória não gerenciado.
Copia dados de uma matriz de caracteres unidimensional gerenciada para um ponteiro de memória não gerenciado.
Copia dados de uma matriz de números de ponto flutuante de duas precisões de duas dimensões geridas para um ponteiro de memória não gerenciado.
Copia dados de uma matriz de número inteiro assinada de 16 bits gerenciada e unidimensional para um ponteiro de memória não gerenciado.
Copia dados de uma matriz de número inteiro assinada de 32 bits gerenciada e unidimensional para um ponteiro de memória não gerenciado.
Copia dados de uma matriz de número inteiro assinada de 64 bits administrada de forma unidimensional para um ponteiro de memória não gerenciado.
Copia dados de um ponteiro de memória não gerenciado para uma matriz de número inteiro não assinada de 8 bits gerenciada.
Copia dados de um ponteiro de memória não gerenciado para uma matriz de caracteres gerenciados.
Copia dados de um ponteiro de memória não gerenciado para uma matriz de número de ponto flutuante de dupla precisão gerenciada.
Copia dados de um ponteiro de memória não gerenciado para uma matriz de número inteiro assinada de 16 bits gerenciada.
Copia dados de um ponteiro de memória não gerenciado para uma matriz de número inteiro assinada de 32 bits gerenciada.
Copia dados de um ponteiro de memória não gerenciado para uma matriz de número inteiro assinada de 64 bits gerenciada.
Copia dados de um ponteiro de memória não gerenciado para uma matriz de IntPtr gerenciada.
Copia dados de um ponteiro de memória não gerenciado para uma matriz de números de ponto flutuante de precisão única gerenciada.
Copia dados de uma matriz IntPtr unidimensional e gerenciada para um ponteiro de memória não gerenciado.
Copia os dados de uma matriz de números de ponto flutuante de uma única precisão, gerenciada e unidimensional, para um ponteiro de memória não gerenciado.
Agrega um objeto gerenciado com o objeto COM especificado.
[Suportado no Framework 4.5.1 e versões posteriores]
Agrega um objeto gerenciado do tipo especificado com o objeto COM especificado.
Envolve o objeto COM especificado em um objeto do tipo especificado.
[Suportado no Framework 4.5.1 e versões posteriores]
Envolve o objeto COM especificado em um objeto do tipo especificado.
Libera todas as subestruturas que o bloco de memória não gerenciado especificado aponta para.
[Suportado no Framework 4.5.1 e versões posteriores]
Libera todas as subestruturas de um tipo especificado ao qual o bloco de memória não gerenciado especificado.
Libera todas as referências para um wrapper de tempo de execução (RCW), definindo sua contagem de referência para 0.
Libera um bloco de memória alocado pelo alocador de memória de tarefa COM não gerenciado.
Libera memória previamente alocada a partir da memória não gerenciada do processo.
Retorna o identificador globalmente exclusivo (GUID) para o tipo especificado ou gera um GUID usando o algoritmo usado pelo Exportador de biblioteca de tipos (Tlbexp. exe).
Retorna um identificador programático (ProgID) para o tipo especificado.
Obtém uma instância em execução do objeto especificado da tabela de objetos em execução (ROT).
Retorna um ponteiro para uma interface IUnknown que representa a interface especificada no objeto especificado. O acesso à interface de consulta personalizada é ativado por padrão.
Retorna um ponteiro para uma interface IUnknown que representa a interface especificada no objeto especificado. O acesso personalizado à interface de consulta é controlado pelo modo de personalização especificado.
[Suportado no Framework 4.5.1 e versões posteriores]
Retorna um ponteiro para uma interface IUnknown que representa a interface especificada em um objeto do tipo especificado. O acesso à interface de consulta personalizada é ativado por padrão.
Retorna um ponteiro de interface que representa a interface especificada para um objeto, se o chamador estiver no mesmo contexto que esse objeto.
Recupera os dados referenciados pela chave especificada a partir do objeto COM especificado.
Recupera o slot da tabela de funções virtuais (v-table ou VTBL) para um System. Reflection especificado. Tipo MemberInfo quando esse tipo é exposto ao COM.
Converte um ponteiro de função não gerenciado para um delegado.
[Suportado no Framework 4.5.1 e versões posteriores]
Converte um ponteiro de função não gerenciado para um delegado de um tipo especificado.
Recupera o último slot na tabela de funções virtual (tabela V ou VTBL) de um tipo quando exposto a COM.
Recupera um código que identifica o tipo da exceção que ocorreu.
Converte o código de erro HRESULT especificado em um objeto de Exceção correspondente.
Converte o código de erro HRESULT especificado em um objeto de Exceção correspondente, com informações de erro adicionais transmitidas em uma interface IErrorInfo para o objeto de exceção.
Recupera uma descrição independente do computador de uma exceção e informações sobre o estado que existia para o segmento quando a exceção ocorreu.
Converte um delegado em um ponteiro de função que pode ser chamado de código não gerenciado.
[Suportado no Framework 4.5.1 e versões posteriores]
Converte um delegado de um tipo especificado em um ponteiro de função que pode ser chamado de código não gerenciado.
Retorna o identificador de instância (HINSTANCE) para o módulo especificado.
Converte a exceção especificada em um HRESULT.
Retorna o HRESULT correspondente ao último erro incorrido pelo código Win32 executado usando Marshal.
Retorna uma interface IDispatch a partir de um objeto gerenciado.
Retorna um ponteiro da interface IDispatch de um objeto gerenciado, se o chamador estiver no mesmo contexto que esse objeto.
Retorna uma interface IUnknown de um objeto gerenciado.
Retorna uma interface IUnknown de um objeto gerenciado, se o chamador estiver no mesmo contexto que esse objeto.
Retorna o código de erro retornado pela última função não gerenciada que foi chamada usando invocação da plataforma que possui o DllImportAttribute. SetLastError flag set.
Obsoleto. Obtém um ponteiro para uma função gerada em tempo de execução que organiza uma chamada de código gerenciado para não gerenciado.
Recupera um objeto MemberInfo para o slot da tabela de funções virtual (v-table ou VTBL) especificado.
Converte um objeto em COM VARIANT.
[Suportado no Framework 4.5.1 e versões posteriores]
Converte um objeto de um tipo especificado em um COM VARIANT.
Retorna uma instância de um tipo que representa um objeto COM por um ponteiro para sua interface IUnknown.
Converte um COM VARIANT para um objeto.
[Suportado no Framework 4.5.1 e versões posteriores]
Converte um COM VARIANT para um objeto de um tipo especificado.
Converte uma matriz de COM VARIANTs em uma série de objetos.
[Suportado no Framework 4.5.1 e versões posteriores]
Converte uma matriz de COM VARIANTs em uma matriz de um tipo especificado.
Obtém o primeiro slot na tabela de funções virtual (tabela-v ou VTBL) que contém métodos definidos pelo usuário.
Obsoleto. Converte um cookie de fibra no correspondente System. Threading. Instância de thread.
Retorna um objeto gerenciado de um tipo especificado que representa um objeto COM.
Converte um objeto ITypeInfo não gerenciado em um sistema gerenciado. Digite o objeto.
Retorna o tipo associado ao identificador de classe especificado (CLSID).
Recupera o nome do tipo representado por um objeto ITypeInfo.
Obsoleto. Recupera o nome do tipo representado por um objeto ITypeInfo.
Recupera o identificador da biblioteca (LIBID) de uma biblioteca de tipos.
Obsoleto. Recupera o identificador da biblioteca (LIBID) de uma biblioteca de tipos.
Recupera o identificador da biblioteca (LIBID) que é atribuído a uma biblioteca de tipos quando foi exportado da montagem especificada.
Recupera o LCID de uma biblioteca de tipos.
Obsoleto. Recupera o LCID de uma biblioteca de tipos.
Recupera o nome de uma biblioteca de tipos.
Obsoleto. Recupera o nome de uma biblioteca de tipos.
Recupera o número da versão de uma biblioteca de tipos que será exportada da montagem especificada.
Cria um objeto de preenchimento exclusivo Runtime Callable Wrap (RCW) para uma determinada interface IUnknown.
Obsoleto. Obtém um ponteiro para uma função gerada em tempo de execução que organiza uma chamada de código gerenciado não gerenciado.
Indica se um objeto especificado representa um objeto COM.
Indica se um tipo é visível para clientes COM.
Calcule o número de bytes na memória não gerenciada que são necessários para manter os parâmetros para o método especificado.
Retorna o deslocamento do campo do formulário não gerenciado da classe gerenciada.
[Suportado no Framework 4.5.1 e versões posteriores]
Retorna o deslocamento de campo do formulário não gerenciado de uma classe gerenciada especificada.
Executa tarefas de configuração de método único sem chamar o método.
Executa uma verificação pré-link para todos os métodos em uma classe.
Copia todos os caracteres até o primeiro caractere nulo de uma seqüência ANSI não gerenciada para uma String gerenciada e amplia cada caractere ANSI para Unicode.
Aloca uma Cadeia de caracteres gerenciada, copia um número especificado de caracteres de uma cadeia ANSI não gerenciada para ela e amplia cada caractere ANSI para Unicode.
Aloca uma String gerenciada e copia todos os caracteres até o primeiro caractere nulo de uma string armazenada na memória não gerenciada nele.
Aloca uma Cadeia de caracteres gerenciada e copia o número especificado de caracteres de uma cadeia armazenada na memória não gerenciada nele.
Aloca uma Cadeia de caracteres gerenciada e copia uma string binária (BSTR) armazenada na memória não gerenciada nele.
Aloca uma Cadeia de caracteres gerenciada e copia todos os caracteres até o primeiro caractere nulo de uma seqüência Unicode não gerenciada para ela.
Aloca uma Cadeia de caracteres gerenciada e copia um número especificado de caracteres de uma seqüência Unicode não gerenciada para ela.
Dados Marshals de um bloco de memória não gerenciado para um objeto gerenciado.
Dados Marshals de um bloco de memória não gerenciado para um objeto gerenciado recentemente alocado do tipo especificado.
[Suportado no Framework 4.5.1 e versões posteriores]
Dados Marshals de um bloco de memória não gerenciado para um objeto gerenciado recentemente alocado do tipo especificado por um parâmetro de tipo genérico.
[Suportado no Framework 4.5.1 e versões posteriores]
Dados Marshals de um bloco de memória não gerenciado para um objeto gerenciado do tipo especificado.
Solicita um ponteiro para uma interface especificada a partir de um objeto COM.
Lê um único byte da memória não gerenciada.
Lê um único byte em um determinado deslocamento (ou índice) da memória não gerenciada.
Lê um único byte em um determinado deslocamento (ou índice) da memória não gerenciada.
Lê um inteiro assinado de 16 bits da memória não gerenciada.
Lê um inteiro assinado de 16 bits em um determinado deslocamento da memória não gerenciada.
Lê um inteiro assinado de 16 bits em um determinado deslocamento da memória não gerenciada.
Lê um inteiro assinado de 32 bits da memória não gerenciada.
Lê um inteiro assinado de 32 bits em um determinado deslocamento da memória não gerenciada.
Lê um inteiro assinado de 32 bits em um determinado deslocamento da memória não gerenciada.
Lê um inteiro assinado de 64 bits da memória não gerenciada.
Lê um inteiro assinado de 64 bits em um determinado deslocamento da memória não gerenciada.
Lê um inteiro assinado de 64 bits em um determinado deslocamento da memória não gerenciada.
Lê um número inteiro de tamanho nativo do processador da memória não gerenciada.
Lê um inteiro de tamanho nativo do processador em um determinado deslocamento da memória não gerenciada.
Lê um processador numero inteiro nativo da memória não gerenciada.
Redimensiona um bloco de memória previamente alocado com AllocCoTaskMem.
Redimensiona um bloco de memória previamente alocado com AllocHGlobal.
Decreta a contagem de referência na interface especificada.
Decrementa a contagem de referência do wrapper de tempo de execução (RCW) associado ao objeto COM especificado.
Obsoleto. Libera o cache de threads.
Aloca uma string binária não gerenciada (BSTR) e copia o conteúdo de um objeto SecureString gerenciado nela.
Copia o conteúdo de um objeto SecureString gerenciado para um bloco de memória alocado do alocador de tarefas COM não gerenciado.
Copia o conteúdo de um objeto SecureString gerenciado para um bloco de memória alocado do alocador de tarefas COM não gerenciado.
Copia o conteúdo de um SecureString gerenciado em memória não gerenciada, convertendo-se em formato ANSI ao copiar.
Copia o conteúdo de um objeto SecureString gerenciado em memória não gerenciada.
Define os dados referenciados pela chave especificada no objeto COM especificado.
Retorna o tamanho não gerenciado de um objeto em bytes.
Retorna o tamanho de um tipo não gerenciado em bytes.
[Suportado no Framework 4.5.1 e versões posteriores]
Retorna o tamanho de um tipo não gerenciado em bytes.
[Suportado no Framework 4.5.1 e versões posteriores]
Retorna o tamanho não gerenciado de um objeto de um tipo especificado em bytes.
Aloca um BSTR e copia o conteúdo de um String gerenciado para ele.
Copia o conteúdo de uma String gerenciada para um bloco de memória alocado do alocador de tarefas COM não gerenciado.
Copia o conteúdo de uma String gerenciada para um bloco de memória alocado do alocador de tarefas COM não gerenciado.
Copia o conteúdo de uma String gerenciada para um bloco de memória alocado do alocador de tarefas COM não gerenciado.
Copia o conteúdo de uma String gerenciada em memória não gerenciada, convertendo-se em formato ANSI à medida que copia.
Copia o conteúdo de uma String gerenciada em memória não gerenciada, convertendo-se em formato ANSI, se necessário.
Copia o conteúdo de uma String gerenciada em memória não gerenciada.
Dados Marshals de um objeto gerenciado para um bloco de memória não gerenciado.
[Suportado no Framework 4.5.1 e versões posteriores]
Dados Marshals de um objeto gerenciado de um tipo especificado para um bloco de memória não gerenciado.
Lança uma exceção com um valor de HRESULT com falha específica.
Lança uma exceção com uma falha específica HRESULT, com base na interface IErrorInfo especificada.
Obtém o endereço do elemento no índice especificado dentro da matriz especificada.
[Suportado no Framework 4.5.1 e versões posteriores]
Obtém o endereço do elemento no índice especificado em uma matriz de um tipo especificado.
Grava um valor de byte único na memória não gerenciada.
Grava um valor de byte único na memória não gerenciada em um deslocamento especificado.
Grava um valor de byte único na memória não gerenciada em um deslocamento especificado.
Grava um caractere como um valor inteiro de 16 bits na memória não gerenciada.
Grava um valor inteiro de 16 bits na memória não gerenciada.
Grava um valor inteiro assinado de 16 bits na memória não gerenciada em um deslocamento especificado.
Grava um valor inteiro assinado de 16 bits na memória não gerenciada em um deslocamento especificado.
Grava um valor inteiro assinado de 16 bits na memória não gerenciada em um deslocamento especificado.
Grava um valor inteiro assinado de 16 bits na memória não gerenciada em um deslocamento especificado.
Grava um valor inteiro assinado de 32 bits para a memória não gerenciada.
Grava um valor inteiro assinado de 32 bits na memória não gerenciada em um deslocamento especificado.
Grava um valor inteiro assinado de 32 bits para a memória não gerenciada em um deslocamento especificado.
Grava um valor inteiro assinado de 64 bits para a memória não gerenciada em um deslocamento especificado.
Grava um valor inteiro assinado de 64 bits para a memória não gerenciada.
Grava um valor inteiro assinado de 64 bits para a memória não gerenciada em um deslocamento especificado.
Grava um valor inteiro de tamanho nativo do processador na memória não gerenciada em um deslocamento especificado.
Grava um valor inteiro de tamanho nativo do processador em memória não gerenciada.
Grava um valor inteiro de tamanho nativo do processador na memória não gerenciada.
Libera um ponteiro BSTR que foi alocado usando o método SecureStringToBSTR.
Libera um ponteiro de cadeia não gerenciado que foi alocado usando o método SecureStringToCoTaskMemAnsi.
Libera um ponteiro de cadeia não gerenciado que foi alocado usando o método SecureStringToCoTaskMemUnicode.
Libera um ponteiro de cadeia não gerenciado que foi alocado usando o método SecureStringToGlobalAllocAnsi.
Libera um ponteiro de cadeia não gerenciado que foi alocado usando o método SecureStringToGlobalAllocUnicode.
Representa o tamanho de caractere padrão no sistema; o padrão é 2 para sistemas Unicode e 1 para sistemas ANSI. Este campo é só de leitura.
Representa o tamanho máximo de um tamanho de conjunto de caracteres de byte duplo (DBCS), em bytes, para o sistema operacional atual. Este campo é só de leitura.
Os métodos estáticos definidos na classe Marshal são essenciais para trabalhar com o código não gerenciado. A maioria dos métodos definidos nesta classe geralmente são usados por desenvolvedores que desejam fornecer uma ponte entre os modelos de programação gerenciados e não gerenciados. Por exemplo, o método StringToHGlobalAnsi copia caracteres ANSI de uma string especificada (no heap gerenciado) para um buffer no heap não gerenciado. Ele também aloca a pilha alvo do tamanho certo.
O tempo de execução de linguagem comum fornece recursos de empacotamento específicos. Para obter detalhes sobre o comportamento de marshaling, consulte Interop Marshaling.
Os métodos de leitura e gravação na classe Marshal suportam o acesso alinhado e não alinhado.
O exemplo a seguir mostra como usar vários métodos definidos pela classe Marshal.
Disponível desde 8.
Disponível desde 1.1.
Disponível desde 2.0.
Windows Phone Silverlight.
Disponível desde 7,0.
Disponível desde 8.1.
Qualquer público estático (Shared no Visual Basic) membros desse tipo são thread-safe. Todos os membros da instância não são garantidos para serem seguros por thread.
Classe Marshal.
Fornece uma coleção de métodos para alocar memória não gerenciada, copiando blocos de memória não gerenciados e conversão gerenciada em tipos não gerenciados, bem como outros métodos diversos usados ao interagir com o código não gerenciado.
Para obter uma lista de todos os membros desse tipo, consulte Membros do Marechal.
Segurança de linha.
Qualquer público estático (Shared no Visual Basic) membros desse tipo são thread-safe. Todos os membros da instância não são garantidos para serem seguros por thread.
Os métodos estáticos (Shared in Visual Basic) definidos na classe Marshal são essenciais para trabalhar com código não gerenciado. A maioria dos métodos definidos aqui são geralmente utilizados por desenvolvedores avançados que criam agentes personalizados que precisam fornecer uma ponte entre os modelos de programação gerenciados e não gerenciados. Por exemplo, o método StringToHGlobalAnsi copia os caracteres ANSI de uma string especificada (no heap gerenciado) para um buffer no heap não gerenciado. Ele também aloca o heap do alvo do tamanho certo, como o seguinte código C # mostra:
O tempo de execução de linguagem comum fornece recursos de empacotamento específicos. Para obter detalhes sobre o comportamento de marshaling, consulte Interop Marshaling.
A classe Marshal compreende muitos membros diversos. A tabela a seguir atribui cada membro à categoria que melhor descreve seu uso.
Requisitos.
Plataformas: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, família Windows Server 2003, Compact Framework.
No comments:
Post a Comment