De modo geral, existem três maneiras de programar entre VB e VC: uma é gerar uma DLL em VC e chamar a DLL em VB; a outra é gerar um controle ActiveX (.ocx) em VC e inseri-lo no VB; outra é criar uma DLL no VC Gerar servidor de automação ActiveX em VB e chamá-lo em VB. Relativamente falando, o primeiro método tem os requisitos mais baixos para programadores de VC, mas requer a cooperação de seus parceiros. Recomendo este método.
Vamos falar primeiro sobre programação VC++. Primeiro gere o projeto Win32 DLL em VC++. Adicione várias funções a este projeto para os usuários VB chamarem. Para que uma função em uma DLL seja chamada pelo VB, ela deve atender a duas condições: uma é que o método de chamada seja stdcall e a outra é que ela seja exportada. Para fazer o primeiro, basta adicionar a palavra-chave __stdcall antes da declaração da função. como:
amostra curta __stdcall (nLen curta, *buffer curto)
Para fazer o segundo, você precisa adicionar as seguintes linhas ao arquivo *.def:
EXPORTAÇÕES
amostra @1
A amostra aqui é o nome da função que você deseja chamar em VB, @1 representa o número da função na DLL e cada função é diferente. Observe que os nomes das funções aqui diferenciam maiúsculas de minúsculas. Quanto à necessidade de transferir uma grande quantidade de dados, você pode fazer isso, usar um array para armazenar os dados em VB, e depois passar o tamanho e o endereço do array para o VC (sobre como programar em VB, irei apresente-o abaixo). Assim como no exemplo acima, nLen é o tamanho do array e buffer é o endereço do array. Com esses dois itens, você pode processá-lo como um array VC. Quanto aos gráficos de saída, você pode gerar o formato WMF ou BMP e deixar o VB chamá-lo. No entanto, acho que também pode ser enviado diretamente para a janela, desde que VB passe os manipuladores de janela hWnd e hDC e a posição de desenho da janela (os sistemas de coordenadas usados por VB e VC devem ser consistentes) para VC. A propriedade AutoRedraw do VB deve ser False e o programa de desenho VC é chamado no evento Paint.
Vamos falar sobre programação VB novamente. O método para o VB chamar DLL é o mesmo que o método para chamar a API do Windows, que geralmente é introduzido nos livros do VB. Para o exemplo acima, primeiro declare a função VC:
Declarar amostra de função Lib "mydll.dll" (ByVal nLen como número inteiro, buffer como número inteiro) como número inteiro
Aqui mydll.dll é o nome da sua dll. Você deve ter notado que os dois parâmetros são declarados de forma diferente, com ByVal adicionado ao primeiro parâmetro. A regra é esta: Se um parâmetro for declarado como um ponteiro ou array no VC, ByVal não será adicionado, caso contrário, ByVal será adicionado. Chamar esta função em VB usa a seguinte sintaxe:
amostra 10, a(0)
O array a() aqui é usado para armazenar dados, e 10 é o comprimento do array. O segundo parâmetro aqui não pode ser a(), mas deve ser o primeiro dos dados a serem passados. Esta é a chave para a programação VB.
Abaixo estão alguns possíveis problemas que você pode encontrar. Um problema é que o VB pode relatar que a dll não pode ser encontrada. Você pode colocar a dll no diretório do sistema e certificar-se de que a instrução Declare do VB está correta. Outro problema é que o VB relata que não consegue encontrar a função necessária. Isso geralmente ocorre porque o arquivo *.def não está definido no VC. A terceira situação é que o VB informa que a conversão não pode ser executada. Isso pode ocorrer porque a palavra-chave __stdcall não foi adicionada no VC ou pode ser que os tipos de parâmetro do VB e do VC sejam inconsistentes. Observe que int no VC é 4. bytes (equivalente a VB Long), enquanto o Integer do VB tem apenas 2 bytes. Deve-se garantir que o número de parâmetros em VB e VC seja o mesmo e que o número de bytes que eles ocupam também seja o mesmo. A última coisa a se prestar atenção é que o array não deve exceder os limites do VC, caso contrário, o programa VB travará.
1. Vantagens de chamar DLL
Como base do sistema operacional Windows, a biblioteca de vínculo dinâmico (DLL) tem desempenho superior de aplicativos:
DLLs estendem os recursos de um aplicativo. Como uma DLL é carregada dinamicamente no espaço de endereço de um processo, um aplicativo pode determinar em tempo de execução quais operações precisam ser executadas e, em seguida, carregar o código apropriado para executar essas operações conforme necessário.
DLLs podem ser escritas em vários idiomas. Por exemplo, VB é usado para escrever a interface do programa aplicativo e C++ é usado para escrever operações subjacentes, como algoritmos e comunicações.
DLLs simplificam o gerenciamento de projetos de software. Se diferentes grupos de trabalho trabalharem em diferentes módulos durante o desenvolvimento do software, o projeto será mais fácil de gerenciar.
DLL ajuda a economizar memória. Se dois ou mais aplicativos usarem a mesma DLL, as páginas da DLL só precisarão ser colocadas na RAM uma vez e todos os aplicativos poderão compartilhar suas páginas individuais.
DLL facilita o compartilhamento de recursos. As DLLs podem conter recursos como modelos de diálogo, cadeias de caracteres, ícones e bitmaps, e vários aplicativos podem usar DLLs para compartilhar esses recursos.
DLL ajuda na localização de aplicativos. Por exemplo, um aplicativo que contém apenas código e nenhum componente de interface do usuário pode carregar uma DLL que contém componentes de interface do usuário localizados.
As DLLs ajudam a resolver diferenças de plataforma. Diferentes versões do Windows estão equipadas com funções diferentes e os desenvolvedores geralmente desejam chamar novas funções. No entanto, se o código-fonte contiver uma chamada para uma nova função e o aplicativo for executado em uma versão do Windows que não fornece essa função, o carregador do sistema operacional se recusará a executar o processo. Se essas novas funções forem salvas em uma DLL, o aplicativo poderá carregá-las em versões mais antigas do Windows e chamar a função com êxito.
2. Encontre o ponto de entrada da DLL
Os usuários que entram em contato com DLLs pela primeira vez geralmente encontram um problema: uma DLL criada em um ambiente VC funciona bem no VC, mas quando chamada em um aplicativo VB, sempre aparece "erro de convenção de chamada" ou "não encontrado". erros de ponto". Isto é causado principalmente pelas seguintes omissões.
Em primeiro lugar, deve-se notar que a declaração da função na DLL e a declaração da função no VB devem ser exatamente iguais em termos de nome, tipo de retorno, tipo de parâmetro, número de parâmetros, etc. capitalização.
Em segundo lugar, a função de entrada deve ser adicionada ao arquivo .def da DLL.
Finalmente, as palavras-chave extern "c" e _stdcall devem ser adicionadas antes da definição da função.
Consulte o exemplo de aplicação para o formato específico.
3. Passando parâmetros de array em DLL
Como a DLL é frequentemente usada para executar algumas operações de baixo nível, os aplicativos geralmente precisam passar uma grande quantidade de dados para a DLL. Em C++, ponteiros são a melhor escolha para operações de array, mas não existe conceito de ponteiros em VB. Isso geralmente pode ser resolvido de duas maneiras.
Primeiro, ao declarar uma DLL em VB, use byref em vez de byval para passar o ponteiro do array para a DLL.
Além disso, ao declarar o array como uma variante, você pode passar o array diretamente para a DLL.
4. Exemplos de aplicação
A seguir, é usado um exemplo específico para ilustrar o processo de chamada de uma DLL criada em um ambiente VC em VB.
Crie uma DLL para processamento de sinais, "SigPro.dll", que contém uma função "Fourier" para cálculos de Fourier.
Declaração em VC:
Adicione o seguinte código a "SigPro.h",
Copie o código do código da seguinte forma:
externo "C"
{
double EXPORT _stdcall Fourier(long int *Sample,int NumSam,int OvertoneOrder,bool SinOrCos);
}
Adicione o seguinte código a "SigPro.cpp",
externo "C"
double EXPORT _stdcall Fourier(long int *Sample,int NumSam,int OvertoneOrder,bool SinOrCos)
{
int eu;
resultado duplo=0,0;
if(SinOrCos==verdadeiro)
{
for(i=0;i<NumSam;i++)
{
resultado=resultado+*(Amostra+i)*cos(OvertoneOrder*i*2*3.1415926/NumSam);
}
}
outro
{
for(i=0;i<NumSam;i++)
{
resultado=resultado+*(Amostra+i)*sin(OvertoneOrder*i*2*3.1415926/NumSam);
}
}
resultado =resultado*2/NumSam;
resultado de retorno;
}
Adicione o seguinte código a "SigPro.def",
EXPORTAÇÕES
Fourier
Instrução de chamada em VB:
Função de declaração pública Fourier Lib "SigPro" (ByRef Sample() As Long, ByVal NumSam As Integer, ByVal OvertoneOrder As Integer, ByVal SinOrCos As Boolean) As Double