VB "Convenção de chamada de DLL inválida" significa quadro de pilha incompatíveis

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: 85108
Este artigo foi arquivado. É oferecido "como está" e não será mais atualizado.
Sumário
Quando você chamar uma função DLL (biblioteca) de vínculo dinâmico do Visual Basic para Windows, o erro "Convenção de chamada de DLL inválida" geralmente é causado por omitindo incorretamente ou incluindo a palavra-chave ByVal a instrução Declare ou a instrução de chamada. A palavra-chave ByVal afeta o tamanho dos dados colocados na pilha. Visual Basic para o Windows verifica a alteração na posição do ponteiro de pilha para detectar esse erro.

Quando Visual Basic para Windows gera o erro de tempo de execução "Incorreto DLL convenção de chamada," a causa mais comum quando chamar funções da API é omitindo a palavra-chave ByVal partir a declaração de função externa ou a chamada propriamente dito. Ele também pode ocorrer devido a incluindo a palavra-chave ByVal quando a função está esperando um ponteiro de 4 bytes para o parâmetro em vez do próprio valor. Isso altera o tamanho (número de bytes) dos valores colocado na pilha de e, após retornar da DLL, Visual Basic para o Windows detecta a alteração na posição do quadro de pilha e gera o erro.
Mais Informações
Há dois convenções de chamada ou protocolos inter-language: a convenção de chamada do Pascal, Basic/FORTRAN e a convenção C de chamada. Visual Basic para Windows usa a convenção, de chamada do Pascal, assim como as funções de API do Microsoft Windows e outros produtos de linguagem Basic do Microsoft. Em convenção Pascal, ele é de responsabilidade do procedimento chamado para ajustar ou limpar a pilha. (Além disso, parâmetros são empurrados para a pilha na ordem do parâmetro mais à esquerda para a extrema direita.) Porque a função DLL é responsável para ajustar a pilha com base no tipo e número de parâmetros espera, Visual Basic para o Windows verifica a posição do ponteiro de pilha ao retorne da função. Se a rotina chamada ajustou a pilha para uma posição inesperada, em seguida, Visual Basic for Windows gera um erro "Convenção de chamada de DLL inválida". Visual Basic for Windows assume uma discrepância de posição de pilha porque a função DLL usa a convenção C de chamada. Com a convenção C de chamada, o programa de chamada é responsável para ajustar a pilha imediatamente após a rotina chamada devolve o controle.

Etapas para reproduzir o problema

Crie uma simples DLL usando Microsoft Quick C para o Windows ou qualquer compilador capaz de criar DLLs do Windows. O exemplo a seguir é em C e escrito para C rápida para Windows:

STACKING.C

#include <windows.h>long far pascal typecheck (long a, float b, short far *c, char far *buff){short retcode;a = a * 3;retcode = MessageBox(NULL, "I am in the DLL", "BOX", MB_OK);return (a);}				

STACKING.DEF

LIBRARY      STACKINGEXETYPE     WINDOWSSTUB        'winstub.exe'STACKSIZE   5120HEAPSIZE    1024DATA PRELOAD MOVEABLE SINGLE        ; ADD THESE TWO LINESCODE PRELOAD MOVEABLE DISCARDABLE   ; TO AVOID WARNINGS.EXPORTS    typecheck   @1     WEP           @2				

Adicione o código a seguir ao módulo de declarações geral em um formulário Visual Basic para Windows:
Declare Function typecheck Lib "d\stacking.dll" (ByVal a As Long,      ByVal b As Single, c As Integer, ByVal s As String) As Long				

Observação: A declaração acima deve ser colocada em uma linha.

No evento Form_Click:
Sub Form_Click ()Dim a As Long   ' Explicitly type the variables.Dim b As SingleDim c As IntegerDim s As Stringa = 3                      ' Initialize the variables.b = 4.5c = 6s = "Hello there! We've been waiting for you!"Print typecheck(a, b, c, s)End Sub				

Executar o programa como escritos acima não irá gerar o erro. Agora adicione a palavra-chave ByVal antes da variável chamada c na declaração do Visual Basic para Windows. Execute o programa. Observe que a função MessageBox aparece uma caixa pela primeira vez, e é a erro caixa exibida até que indica que Visual Basic para o Windows verifica a pilha após retornar para ver se ele foi corretamente ajustado. Porque a DLL esperado um ponteiro de 4 bytes e um valor de 2 bytes recebido, a pilha não ajustou volta para o quadro inicial.

Como outro teste, primeiro remova a palavra-ByVal chave antes da variável 'c' que você adicionou no teste anterior. Declarar o parâmetro ' um como Any ' em vez de As Long. Alterar o tipo da variável 'a' em Form_Click como inteiro. Execute o programa novamente. Usando como qualquer desativa verificação pelo Visual Basic para Windows de tipo. Porque o programa passado um número inteiro ByVal em vez de longa que a DLL esperada, o quadro de pilha está desativado e o erro é gerado.
Referências
"Microsoft BASIC 7.0: guia do programador do" para as versões 7.0 e 7.1, páginas 423-426
2,00 3.00

Aviso: este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 85108 - Última Revisão: 12/04/2015 09:15:11 - Revisão: 2.0

Microsoft Visual Basic 2.0 Standard Edition, Microsoft Visual Basic 3.0 Professional Edition, Microsoft Visual Basic 2.0 Professional Edition, Microsoft Visual Basic 3.0 Professional Edition, Microsoft Visual Basic 1.0 Standard Edition

  • kbnosurvey kbarchive kbmt KB85108 KbMtpt
Comentários