Como criptografar uma seqüência de caracteres no Visual Basic 6.0 e como descriptografar a seqüência de caracteres no Visual Basic .NET ou no Visual Basic 2005

IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.

Clique aqui para ver a versão em Inglês deste artigo: 821762
Sumário
Este artigo descreve como criptografar uma seqüência de caracteres usando o Microsoft Visual Basic 6.0. Ela também descreve como descriptografar a seqüência de caracteres usando o Visual Basic. NET. Além disso, este artigo aborda o Microsoft Windows APIs que são usadas no código para o processo de criptografia e para o processo de descriptografia.
INTRODUÇÃO
Este artigo passo a passo descreve como criptografar uma seqüência de caracteres usando CryptoAPI no Microsoft Visual Basic 6.0. Ela também descreve como descriptografar a seqüência de caracteres usando as classes CryptoServiceProvider no Microsoft Visual Basic .NET ou no Microsoft Visual Basic 2005. Este artigo descreve o código para o processo de criptografia no Visual Basic 6.0. Ele também aborda o código para o processo de descriptografia no Visual Basic .NET ou no Visual Basic 2005.

O código de criptografia do processo e o código de descriptografia do processo ter seguintes estruturas:
  • código de processo de criptografia - quando você desenvolver código de criptografia usando o Visual Basic 6.0, o código é estruturada no grupo de um projeto chamado EncryptGroup. Esse grupo de projeto contém os seguintes projetos individuais:
    • CryptWrap.vbp - The CryptWrap.vbp projeto contém um arquivo classe Visual Basic é denominado clsCryptoAPI.cls.
    • Encrypt.vbp - The Encrypt.vbp projeto contém um formulário que é chamado frmEncFiles.frm.
  • código de processo de descriptografia - quando você desenvolver o código de descriptografia usando Visual Basic .NET ou no Visual Basic 2005, o código é estruturado de uma solução que é chamada DecryptInVBNET. Essa solução contém um projeto de aplicativo Microsoft Windows chamado DecryptInVBNET.vbproj. Este projeto contém um Windows Form chamado Form1.vb.
back to the top

Requisitos

Este artigo pressupõe que você esteja familiarizado com os seguintes tópicos:
  • Criptografia
  • Usar APIs no Visual Basic 6.0
  • Usando as classes CryptoServiceProvider no Visual Basic .NET ou no Visual Basic 2005
A lista a seguir descreve o hardware recomendado, software, infra-estrutura de rede e service packs que você precisa:
  • Microsoft Windows Server 2003, Microsoft Windows 2000 ou Microsoft Windows XP
  • Microsoft Visual Basic 6.0 e Microsoft Visual Basic .NET e Microsoft Visual Basic 2005
back to the top

Código para criptografia e descriptografia

Este artigo descreve o código que é incluído no pacote do CryptographySample.exe.

O seguinte arquivo está disponível para download no Centro de download da Microsoft:
Para obter informações adicionais sobre como baixar arquivos de suporte da Microsoft, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
119591Como obter arquivos de suporte da Microsoft a partir de serviços online
Microsoft examinou esse arquivo em busca de vírus. Microsoft utilizou o mais recente software de detecção de vírus que estava disponível na data em que o arquivo foi publicado. O arquivo é armazenado em servidores com segurança avançada que ajudam a evitar qualquer alteração não autorizada no arquivo.

Observação Para usar o código de exemplo baixado, execute as etapas em "Instructions to run the code" seção.

back to the top

Criptografia no Visual Basic 6.0

Esta seção descreve as etapas importantes no processo de criptografia. Ela também descreve o código do Visual Basic que é usado para essas etapas.

back to the top

DLL de CryptWrap

A DLL CryptWrap está incluída com o código que você baixou na seção "Code for encryption and for decryption". A DLL CryptWrap é um wrapper que envolve as chamadas API. A DLL CryptWrap consta o projeto de CryptWrap.vbp está no grupo de projeto EncryptGroup.

O processo de criptografia requer DLL CryptWrap. O projeto criptografar usa a DLL CryptWrap para chamar as funções que executam a criptografia real.

back to the top

DLL de CryptoWrap

A DLL CryptoWrap é codificada usando um modelo de projeto de DLL ActiveX. A DLL CryptoWrap estão no arquivo clsCryptoAPI.cls que está no grupo de projeto EncryptGroup.

O código da DLL CryptoWrap contém o seguinte:
  • Declarações de variáveis e constantes que usa a DLL CryptoWrap.
  • Declarações de sub-rotinas e funções para a função de criptografia API do arquivo Advapi32.dll biblioteca em termos de Visual Basic 6.0.
  • Declarações de propriedades, funções e sub-rotinas.
  • Uma senha que é atribuída a uma variável de nível de módulo no código do programa de chamada.

    Observação Essa senha é usada para derivar a chave que a função CryptoEncrypt usa para criptografar a seqüência de caracteres.
A DLL CryptoWrap usa o algoritmo SHA1 para o hash e usa o algoritmo RC2 para criptografia.

back to the top

Declaração de variáveis

Esta seção descreve as variáveis importantes que são declaradas no arquivo clsCryptoAPI.cls.

Juntamente com as variáveis típicas que podem ser usados para seqüência de caracteres de entrada e saída de cadeia de caracteres, algumas outras constantes são declarados no código do processo de criptografia. Outras constantes são usadas para chamar funções da API no projeto CryptWrap.vbp. Descriptions of some of these other constants appear in the following sample code:
    Private Const ALG_CLASS_ANY     As Long = 0    Private Const ALG_TYPE_ANY      As Long = 0    Private Const ALG_CLASS_HASH    As Long = 32768    Private Const ALG_TYPE_BLOCK    As Long = 1536    Private Const ALG_CLASS_DATA_ENCRYPT  As Long = 24576    Private Const ALG_SID_RC2       As Long = 2    Private Const ALG_SID_SHA1      As Long = 4    ' Hash algorithms    Private Const CALG_SHA1         As Long = ALG_CLASS_HASH Or ALG_TYPE_ANY Or ALG_SID_SHA1    ' Block ciphers    Private Const CALG_RC2          As Long = ALG_CLASS_DATA_ENCRYPT Or ALG_TYPE_BLOCK Or ALG_SID_RC2    ' CryptSetProvParam    Private Const PROV_RSA_FULL        As Long = 1    ' used when acquiring the provider    Private Const CRYPT_VERIFYCONTEXT  As Long = &HF0000000    ' Microsoft provider data    Private Const MS_DEFAULT_PROVIDER  As String = _                  "Microsoft Base Cryptographic Provider v1.0"    ' used to specify not to use any salt value while deriving the key    Private Const CRYPT_NO_SALT As Long = &H10
Wincrypt.h o arquivo de cabeçalho no seu computador contém as definições de todas as outras constantes. Você pode usar o arquivo de cabeçalho Wincrypt.h diretamente em seu código de projeto C ou C++. No entanto, no programa em Visual Basic 6.0 que você baixou na seção "Code for encryption and for decryption", as constantes que usa o processo de criptografia são declaradas e são inicializadas no arquivo clsCryptoAPI.cls. Essas constantes são as constantes mesmas que sejam declaradas no arquivo Wincrypt.h no seu computador.

back to the top

Declaração de API no Visual Basic 6.0

As funções de API importantes que são declaradas no arquivo clsCryptoAPI.cls são as seguintes:
  • GetLastError - A função GetLastError recupera o último valor de código de erro do thread de chamada.

    O código a seguir é um exemplo de função GetLastError :
    Private Declare Function GetLastError Lib "kernel32" () As Long
  • CryptAcquireContext - A função CryptAcquireContext é usado para adquirir um identificador para um recipiente de chave especificado em um provedor de serviços de criptografia especificado (CSP). O parâmetro phProv recebe o identificador para o recipiente de chave especificado. Você pode usar essa alça para chamar outras funções de API.

    O código a seguir é um exemplo de função CryptAcquireContext :
    Private Declare Function CryptAcquireContext Lib "advapi32.dll" _              Alias "CryptAcquireContextA" (ByRef phProv As Long, _              ByVal pszContainer As String, ByVal pszProvider As String, _              ByVal dwProvType As Long, ByVal dwFlags As Long) As Long
  • CryptCreateHash - A função CryptCreateHash é usado para iniciar o hash de um fluxo de dados. A função CryptCreateHash retorna para o chamador um identificador para um objeto de hash do CSP. Esse identificador também pode ser usado em chamadas posteriores para a função CryptHashData para a chave de sessão de hash. O parâmetro phHash recebe o identificador do novo objeto de hash.

    O código a seguir é um exemplo de função CryptCreateHash :
    Private Declare Function CryptCreateHash Lib "advapi32.dll" _              (ByVal hProv As Long, ByVal algid As Long, _              ByVal hkey As Long, ByVal dwFlags As Long, _              ByRef phHash As Long) As Long
  • CryptHashData - A função CryptHashData adiciona dados a um objeto hash especificado. O parâmetro pbData contém os dados a ser hash.

    O código a seguir é um exemplo de função CryptHashData :
    Private Declare Function CryptHashData Lib "advapi32.dll" _              (ByVal hhash As Long, ByVal pbData As String, _              ByVal dwDataLen As Long, ByVal dwFlags As Long) As Long
  • CryptDestroyHash - A função CryptDestroyHash destrói o objeto de hash que o parâmetro hHash faz referência.

    O código a seguir é um exemplo de função CryptDestroyHash :
    Private Declare Function CryptDestroyHash Lib "advapi32.dll" _              (ByVal hhash As Long) As Long
  • CryptReleaseContext - A função CryptReleaseContext é usado para liberar um identificador para um provedor de serviços de criptografia e um recipiente de chave. O parâmetro hProv é o identificador para o CSP. O valor do parâmetro hProv é obtido chamando a função de API CryptAcquireContext .

    O código a seguir é um exemplo de função CryptReleaseContext :
    Private Declare Function CryptReleaseContext Lib "advapi32.dll" _              (ByVal hProv As Long, ByVal dwFlags As Long) As Long
  • CryptDeriveKey - A função CryptDeriveKey gera uma chave criptográfica que é derivada dos dados base. A função CryptDeriveKey sempre gera a mesma chave para os mesmos dados base se você usar o mesmo CSP e os mesmos algoritmos toda vez que você chamar a função CryptDeriveKey para os mesmos dados base.

    Os dados base podem ser uma senha. Pode-se a senha de hash e, em seguida, chamar essa função para obter um identificador para a chave. O parâmetro phKey recebe o identificador para a chave é usada para a criptografia.

    O código a seguir é um exemplo de função CryptDeriveKey :
    Private Declare Function CryptDeriveKey Lib "advapi32.dll" _              (ByVal hProv As Long, ByVal algid As Long, _              ByVal hBaseData As Long, ByVal dwFlags As Long, _              ByRef phKey As Long) As Long
  • CryptDestroyKey - A função CryptDestroyKey libera o identificador que faz referência a parâmetro hKey . O código a seguir é um exemplo de função CryptDestroyKey :
    Private Declare Function CryptDestroyKey Lib "advapi32.dll" _              (ByVal hkey As Long) As Long
  • CryptEncrypt - A função CryptEncrypt é usado para criptografar dados. A chave que contém o módulo CSP designa o algoritmo que é usado para criptografar os dados. O parâmetro hKey faz referência a essa chave. O código a seguir é um exemplo de função CryptEncrypt :
    Private Declare Function CryptEncrypt Lib "advapi32.dll" _              (ByVal hkey As Long, ByVal hhash As Long, ByVal Final As Long, _              ByVal dwFlags As Long, ByVal pbData As String, _              ByRef pdwDataLen As Long, ByVal dwBufLen As Long) As Long
A sub-rotina CopyMemory também está declarada no arquivo clsCryptoAPI.cls. A sub-rotina CopyMemory copia um bloco de memória de um local para outro local. A sub-rotina CopyMemory usa os seguintes parâmetros:
  • dest - O parâmetro de destino é o destino onde o conteúdo é copiado para.
  • origem - O parâmetro de origem é a fonte de onde o conteúdo é copiado do.
  • bytes - O parâmetro de bytes é o tamanho do conteúdo para serem copiados da fonte para o destino.
O código a seguir é um exemplo da sub-rotina CopyMemory :
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _              (dest As Any, source As Any, ByVal bytes As Long)
back to the top

Funções importantes

Esta seção descreve algumas funções importantes são declaradas no arquivo clsCryptoAPI.cls.

O programa de criptografar chama a função de criptografar para criptografar uma seqüência de caracteres. O código a seguir é um exemplo de função criptografar :
Public Function Encrypt(Optional intHashType As Integer = 1, _                            Optional intCipherType As Integer = 1) As Boolean      Encrypt = CryptoEncrypt(intHashType, intCipherType)End Function
esta função tem dois parâmetros opcionais. O parâmetro intHashType Especifica o algoritmo de hash a ser usado para derivar a chave. O parâmetro intCipherType Especifica o tipo de codificação que o programa de criptografar usa para criptografar a seqüência de caracteres.

Observação O tipo de codificação é também conhecido como o algoritmo de criptografia .

Como esses parâmetros são opcionais, eles são inicializados para seus valores padrão. Portanto, se o programa de chamada não fornecer os valores para esses parâmetros, a função Encrypt usa os valores padrão.

A função Encrypt chama a função CryptoEncrypt . A função CryptoEncrypt é uma função particular da DLL CryptoWrap que executa a criptografia real. O código a seguir é um exemplo de função CryptoEncrypt :
Private Function CryptoEncrypt(intHashType As Integer, _                                   intCipherType As Integer) As Boolean
A função CryptoEncrypt é a principal função na DLL CryptoWrap. A função CryptoEncrypt criptografa a seqüência de caracteres.

back to the top

Processo de criptografia

As etapas a seguintes descrevem o processo de criptografia:
  1. A função CryptoEncrypt inicia o processo de criptografia, chamando a função GetProvider .

    Observação A função GetProvider é uma função particular.
  2. A função GetProvider chama a função CryptAcquireContext API para obter o identificador do CSP.
  3. A função GetProvider chama a função CryptCreateHash API para obter um identificador do objeto hash.
  4. A função CryptHashData API hashes o texto de senha usando a alça de que a função GetProvider obtida na etapa 3.
  5. A função CryptoEncrypt chama a função CryptDeriveKey API e, em seguida, o uso de função CryptDeriveKey API as alças de que a função GetProvider obtido nas etapas 2 e 3 para derivar a chave de criptografia.
  6. A função CryptoEncrypt chama a função CryptDestroyHash API para destruir o objeto de hash.
  7. Uma declaração de variável inicialização aloca espaço suficiente para o buffer onde a seqüência criptografada será armazenada. Por exemplo, a seguinte seqüência de caracteres será alocar espaço suficiente:
    lngEnctBuffLen=lngEncDataLength*2
  8. A função CryptoEncrypt chama a função CryptEncrypt API. A entrada para a função CryptEncrypt API é a chave que a função de API CryptDeriveKey derivada na etapa 5 e a seqüência que você deseja criptografar.
  9. A função CryptEncrypt API armazena a seqüência criptografada substituindo a seqüência de entrada no buffer.
  10. A função CryptoEncrypt chama a função CryptDestroyKey API para destruir a chave.
  11. A função CryptoEncrypt chama a função CryptDestroyHash API para destruir o objeto de hash.
back to the top

Criptografar o programa

O programa de criptografar está incluído com o código que você baixou na seção "Code for encryption and for decryption". O programa de criptografar cria a interface do usuário para o processo de criptografia. Ele usa a DLL CryptWrap para criptografar seqüências de caracteres. O programa de criptografar estiver sendo o projeto de criptografar faz parte o EncryptGroup grupo de projeto.

back to the top

Interface do usuário

A interface de usuário do programa criptografar contém as seguintes caixas de texto:
  • Digite Caminho\Nomedoarquivo completo para um arquivo criptografar
  • nome e o local do arquivo criptografado

    Observação Essa caixa de texto é somente leitura.
A interface do usuário do programa criptografar também contém botões a seguir:
  • criptografar
  • Sair
Depois de digitar as informações corretas na caixa ENTER caminho\nome_do_arquivo completo para criptografar um arquivo , o caminho do arquivo onde será armazenada a seqüência criptografada aparece na caixa nome e local do arquivo criptografado .

Para iniciar o processo de criptografia, clique em criptografar . Após o processo de criptografia tiver concluído, você recebe uma caixa de mensagem que indica se o processo de criptografia foi bem-sucedido.

Para fechar o programa de criptografar, clique em Sair .

back to the top

Função importante

A função a seguir é declarada no arquivo de programa criptografar frmEncFiles.frm:
Private Sub Encrypt_File()
esta função é chamada quando você clicar em criptografar . Essa chamada de função faz o seguinte:
  • Cria um objeto da classe clsCryptoAPI na DLL CryptoWrap.
  • Executa as tarefas validação básica, como verificar a existência do arquivo.
  • Inicializa o campo de senha e o campo InputData do objeto de classe clsCryptoAPI .
  • Chama a função Encrypt do objeto de classe clsCryptoAPI .

    Observação No objeto de classe clsCryptoAPI , o parâmetro intHashType é definido como o SHA1 algoritmo valor 4 e o parâmetro intCipherType é definido como o valor de algoritmo RC2 2 .
  • Preenche o campo OutputData do objeto de classe clsCryptoAPI .
O programa recebe a seqüência criptografada e, em seguida, armazena no arquivo de saída. Você recebe em seguida, uma caixa de mensagem que indica se o processo de criptografia foi bem-sucedido.

back to the top

Programa DecryptInVBNET

O programa DecryptInVBNET está incluído com o código que você baixou na seção "Code for encryption and for decryption". O programa DecryptInVBNET cria a interface do usuário para a descriptografia. Ele também usa o Microsoft Visual Studio .NET ou o Microsoft Visual Studio 2005 CSPs para o processo de descriptografia.

back to the top

Interface do usuário

A interface de usuário do programa DecryptInVBNET contém as seguintes caixas de texto:
  • Digite Caminho\Nomedoarquivo completo para um arquivo descriptografar
  • nome e o local do arquivo descriptografado

    Observação Essa caixa de texto é somente leitura.
A interface do usuário do programa DecryptInVBNET também contém botões a seguir:
  • descriptografar
  • Sair
Depois de digitar as informações corretas na caixa Digite caminho\nome_do_arquivo completo para um arquivo descriptografar , o caminho do arquivo onde será armazenada a seqüência descriptografada aparece na caixa nome e local do arquivo descriptografado .

Para iniciar o processo de descriptografia, clique em descriptografar . Depois de concluir o processo de descriptografia, uma caixa de mensagem que indica se o processo de descriptografia foi bem-sucedido é exibida.

Para fechar o programa DecryptInVBNET, clique em Sair .

back to the top

Função importante

A função a seguir é declarada no arquivo de programa DecryptInVBNET Form1.vb:
Private Sub Decrypt_File()
esta função é chamada quando você clicar em descriptografar . Essa chamada de função faz o seguinte:
  • Cria um objeto da classe CspParameter . Esse objeto é usado para passar o parâmetro para o CSP que executa cálculos criptográficos.
  • Cria um objeto da classe PasswordDeriveBytes . Este objeto é usado para derivar uma chave de senha especificada.

    Observação Para simplificar, a senha é embutida no programa.
  • Chama o método CryptDeriveKey da classe PasswordDeriveBytes . Esse método retorna a chave como os dados de saída. A chave se baseia em dados de entrada.
Este programa usa o algoritmo SHA1 para o hash e usa o algoritmo RC2 para criptografia. Ele também cria um objeto da classe RC2CryptoServiceProvider . Esse objeto é usado no processo de descriptografia.

O código, em seguida, inicializa a chave e o campo de vetor de inicialização do objeto RC2CryptoServiceProvider . O objeto RC2CryptoServiceProvider é um wrapper para acessar a implementação do CSP do RC2 algoritmo.

O código também chama o método CreateDecryptor . O método CreateDecryptor cria um objeto descriptografador simétrica usando a chave atual e o vetor de inicialização atual.

Finalmente, o método TransformFinalBlock da classe ICryptoTransform faz a descriptografia atribuindo o valor do parâmetro entrada como seqüência de caracteres criptografada e oferecendo o comprimento da seqüência de caracteres criptografada. Após o método TransformFinalBlock for concluída, você recebe uma caixa de mensagem que indica se o processo de descriptografia foi bem-sucedido. Se o processo de descriptografia foi bem-sucedido, o programa grava a seqüência descriptografada no arquivo de saída.

back to the top

Instruções para executar o código

Consulte a seção "Code for encryption and for decryption" para obter informações sobre como baixar e salvar os arquivos de programa para a pasta C:\ no computador.

Criptografar o programa

  1. Abra o grupo de projeto EncryptGroup no Visual Basic 6.0. Para fazer isso, clique duas vezes no arquivo EncryptGroup.vbg . O arquivo EncryptGroup.vbg está localizado no C:\CryptographySample\EncryptInVB6 pasta.
  2. No menu Executar do Visual Basic 6.0, clique em Start With Full Compile . Aparece um Windows Form que é denominado Form1. Form1 é a interface do usuário para o programa de criptografar.
  3. Na caixa ENTER caminho\nome_do_arquivo completo para criptografar um arquivo , digite o caminho do arquivo que você deseja criptografar. Para usar o arquivo de exemplo que acompanha o programa de criptografar, digite o seguinte:
    c:\CryptographySample\input.txt
  4. Pressione TAB. O nome do arquivo onde será armazenada a seqüência criptografada aparece na caixa nome e local do arquivo criptografado .

    Observação Neste exemplo, o caminho do arquivo criptografado é C:\CryptographySample\Input.enc.
  5. Clique em criptografar . O criptografar arquivos caixa de mensagem será exibida.
  6. Clique em OK .
  7. Clique em Sair para fechar o aplicativo.
A seqüência criptografada aparece no arquivo C:\CryptographySample\Input.enc.

back to the top

Programa DecryptInVBNET

  1. Abra a solução DecryptInVBNET no Microsoft Visual Studio .NET 2002. Para fazer isso, clique duas vezes DecryptInVBNET.sln arquivo. O arquivo DecryptInVBNET.sln está localizado na pasta C:\CryptographySample\DecryptInVBNET.

    Observação Se você estiver usando o Microsoft Visual Studio .NET 2003 ou Microsoft Visual Studio 2005, você receberá uma caixa de diálogo solicita que você atualizar o projeto e a solução para o Microsoft Visual Studio .NET 2003 ou Microsoft Visual Studio 2005. Clique em Sim .
  2. No menu Debug no Visual Studio .NET ou no Visual Studio 2005, clique em Iniciar . Aparece um Windows Form que é denominado Form1. Form1 é a interface do usuário para o DecryptInVBNET programa.
  3. Na caixa ENTER caminho\nome_do_arquivo completo para descriptografar um arquivo , digite o caminho do arquivo que você deseja descriptografar. Para usar o arquivo de exemplo que acompanha o programa DecryptInVBNET, digite o seguinte:
    c:\CryptographySample\input.ENC
  4. Pressione TAB. O nome do arquivo onde será armazenada a seqüência descriptografada aparece na caixa nome e local do arquivo descriptografado .

    Observação Neste exemplo, o caminho do arquivo descriptografado é C:\CryptographySample\Input.dec.
  5. Clique em descriptografar . A caixa de mensagem DecryptInVBNET será exibida.
  6. Clique em OK .
  7. Clique em Sair para fechar o aplicativo.
A seqüência descriptografada aparece no arquivo C:\CryptographySample\Input.dec.

back to the top
Referências
Para obter mais informações, visite os seguintes sites do Microsoft Developer Network (MSDN) da:Para obter informações adicionais, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
277786Criptografar/descriptografar dados entre sistemas
back to the top

Aviso: este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 821762 - Última Revisão: 05/18/2007 05:22:45 - Revisão: 2.9

Microsoft Visual Basic 2005, Microsoft Visual Basic .NET 2003 Standard Edition, Microsoft Visual Basic .NET 2002 Standard Edition, Microsoft Visual Basic 6.0 Professional Edition

  • kbmt kbvs2005applies kbvs2005swept kbhowtomaster kbprovider kbcrypt kbapi KB821762 KbMtpt
Comentários