Pergunta

Isso eu acho que é relacionado ao meu uso do nlog C ++ API (e minha pergunta sobre o fórum nlog é aqui ); o propósito da minha fazer esta pergunta aqui é conseguir um público maior para o meu problema e talvez também obter algumas idéias mais gerais por trás o fracasso do VB6 IDE para construir no meu cenário particular.

Resumidamente, o problema que estou tendo é que eu estou tendo componentes VB6 construção de problemas que fazem referência não gerenciado C ++ componentes que têm chamadas para C \ C API do nlog ++ (que é definido no NLogC.DLL). Os problemas de construção não estão ocorrendo durante o tempo de compilação, eles estão ocorrendo quando o binário está sendo construído o que sugere para mim que é algum tipo de tipo vinculador problema? Não sei o suficiente sobre como VB6 binários são produzidos para contar. O binário VB6 é produzido, mas ele está corrompido e cai logo após ela é invocada.

Alguém já teve alguma experiências semelhantes com VB6 (não tem de estar relacionado com nlog ou C ++)?

Editar: Obrigado por todas as respostas a este problema bastante obscura. Ainda nenhum progresso, infelizmente; meus achados desde que eu postei isso:

  1. 'Ajustes do Sistema' as opções de compilação não aparecer para ajudar neste problema.
  2. Como adicionar uma referência para o nlog habilitado componente C ++ a partir de um projeto VB6 'em branco' não lançá-lo ou causar problemas de compilação estranhos. Portanto, não é uma questão VB6 'nativo', possivelmente um problema com a interação entre componentes NLog ea vários e bibliotecas 3rd party usados ??por outros componentes referenciados?
  3. Como para C ++ chamando convenções: o nlog habilitado componente C ++ é - tanto quanto eu posso ver - compatível a estas convenções e de fato funciona bem quando referenciado por VB6, desde que ele não está fazendo nenhum chamadas de API NLog. Não tenho certeza se o próprio nlogc.DLL é compatível com VB6, mas eu teria pensado que isso é irrelevante uma vez que as chamadas de API estão sendo feitas a partir do C ++ componente; VB6 não deve saber ou cuidado sobre o que o componente C ++ é referência (que é tão longe como o meu entendimento sobre isto vai ...)

edit2: Gostaria também de salientar que a mensagem de erro obtida durante a compilação é: "Erros durante o carregamento Consulte 'xxx' para obter mais detalhes". Quando eu abrir o arquivo de log, tudo o que há lá dentro é: "Não é possível carregar xxx controle". Curiosamente, todas as referências a esse controle especial desaparece a partir desse projeto particular que resulta em erros de compilação se eu fosse para tentar construir novamente.

Foi útil?

Solução

Got contornar o problema usando interface COM da NLog (NLog.ComInterop.DLL) do meu código não gerenciado C ++. Não é tão fácil de fazer como API do C \ C ++, mas pelo menos não falhar meus componentes VB6.

Outras dicas

Gostaria de tentar ajustar algumas das Compilar opções encontradas no Projeto , Propriedades menu Compilar Painel para ver se eles deu qualquer dicas adicionais sobre o que está acontecendo de errado.

Por exemplo, se você compilar o executável para p-code em vez de código nativo ele ainda falhar na inicialização.

Que mensagem de erro que você ganha quando você executar o seu binário compilado?

Eu duvido que o compilador / vinculador é o problema: as referências de projeto em um projeto VB6 não estão ligados no executável final. A referência de projeto em VB6 é realmente uma referência a uma biblioteca de tipos COM (que pode ou não pode ser incorporado em um arquivo .dll ou outro tipo de arquivo binário). Projectos de referência servem principalmente para dois propósitos:

  1. A informação de tipo extractos IDE das bibliotecas de tipos mencionados que, em seguida, é exibido no localizador de objectos (e no Intellisense suspensa)

  2. em tempo de compilação, o compilador extrai as informações de tipo armazenado nas bibliotecas de referência, incluindo o CLSID de cada classe que você instancia, e incorpora esses dados para o executável. Isso permite que seu executável para criar instâncias de classes contidas nas bibliotecas que você referenciados.

Note que o binário compilado não conectar-se a qualquer código nas bibliotecas de referência, e ele mesmo não conter os nomes dos ficheiros de bibliotecas de referência. O executável final contém apenas outro tipo de informação do e CLSID que ele precisa para instanciar objetos COM em tempo de execução.

É muito mais provável que o problema é com NLog, ou com a forma como você está chamando-o de seu código, em vez de algo errado ido no processo VB6 compilação.

Se você acha que pode ser um problema vinculador, isso deve lançá-lo da mesma maneira:

  1. criar um novo projeto padrão (de qualquer tipo)
  2. adicionar um novo módulo e copiar os -statements "declarar" em que
  3. compilação

Se não lançá-lo é outra coisa.

Ajudaria uma descrição exacta do erro ou uma imagem do que está acontecendo.

Uma coisa a verificar é sempre NLogC.DLL ou o ++ DLL C que você construiu têm a convenção de chamada correto definido. Basicamente, você não pode ter os nomes das funções DLL mutilado ou usar qualquer coisa, mas o STDCALL convenção de chamada. Se a ++ DLL C não foi criado com essas duas coisas em mente, então ele vai deixar de trabalhar com VB6.

MSDN artigo na convenção de chamada.

"Não é possível carregar xxx controle" erros podem ser causados ??por .OCA arquivos que foram criados a partir de uma versão diferente de um .ocx que o utilizado atualmente. Se for esse o caso, apagando os arquivos .OCA ajuda.

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