Pregunta

Creo que esto está relacionado con mi uso de la API nlog C ++ (y mi pregunta en el foro nlog es aquí ); El propósito de hacer esta pregunta aquí es atraer a un público más amplio a mi problema y quizás también obtener algunas ideas más generales detrás de la falla del VB6 IDE para construir en mi escenario particular.

Brevemente, el problema que tengo es que tengo problemas para construir componentes VB6 que hacen referencia a componentes C ++ no administrados que tienen llamadas a la API C \ C ++ de nlog (que se define en NLogC.DLL). Los problemas de compilación no se producen durante el tiempo de compilación, se producen cuando se está construyendo el binario, lo que me sugiere que es algún tipo de problema de tipo vinculador. No sé lo suficiente sobre cómo se producen los binarios VB6 para contar. Se produce el binario VB6, pero está dañado y se bloquea poco después de invocarlo.

¿Alguien ha tenido alguna experiencia similar con VB6 (no tiene que estar relacionado con nlog o C ++)?

editar: Gracias por todas las respuestas a este problema bastante oscuro. Todavía no hay avances lamentablemente; mis hallazgos desde que publiqué esto:

  1. "Ajustar" las opciones de compilación no parece ayudar en este problema.
  2. Agregar una referencia al componente C ++ habilitado para nlog desde un proyecto VB6 'en blanco' no lo bloquea ni causa problemas de compilación extraños. Entonces, ¿no es un problema VB6 'nativo', posiblemente un problema con la interacción entre nlog y los diversos componentes y bibliotecas de terceros utilizados por otros componentes referenciados?
  3. En cuanto a las convenciones de llamadas de C ++: el componente C ++ habilitado para nlog es, por lo que puedo ver, compatible con estas convenciones y, de hecho, funciona bien cuando VB6 hace referencia a él, siempre y cuando no esté haciendo ninguna llamada a la API de nlog. No estoy seguro de si el nlogc.DLL en sí es compatible con VB6, pero habría pensado que eso es irrelevante ya que las llamadas a la API se realizan desde el componente C ++; VB6 no debería saber o importar a qué hace referencia el componente C ++ (eso es lo que yo entiendo al respecto ...)

edit2: También debo tener en cuenta que el mensaje de error obtenido durante la compilación es: " Errores durante la carga. Por favor, consulte "xxx" para detalles ''. Cuando abro el archivo de registro, todo lo que hay allí es: "No se puede cargar el control xxx". Curiosamente, todas las referencias a ese control en particular desaparecen de ese proyecto en particular dando como resultado errores de compilación si tuviera que intentar construir nuevamente.

¿Fue útil?

Solución

Resolví el problema usando la interfaz COM de NLog (NLog.ComInterop.DLL) de mi código C ++ no administrado. No es tan fácil de hacer como la API de C \ C ++, pero al menos no bloquea mis componentes VB6.

Otros consejos

Intentaría ajustar algunas de las opciones de Compilar que se encuentran en el menú Proyecto , Propiedades , panel Compilar para ver si dan pistas adicionales sobre lo que va mal.

Por ejemplo, si compila el ejecutable en p-code en lugar de código nativo , todavía se bloquea en el inicio.

¿Qué mensaje de error aparece cuando ejecuta su binario compilado?

Dudo que el compilador / enlazador sea el problema: las referencias de proyecto en un proyecto VB6 no están vinculadas al ejecutable final. Una referencia de proyecto en VB6 es en realidad una referencia a una biblioteca de tipos COM (que puede o no estar incrustada en un archivo .dll u otro tipo de archivo binario). Las referencias de proyectos sirven principalmente para dos propósitos:

  1. El IDE extrae información de tipo de las bibliotecas de tipos referenciadas que luego muestra en el Explorador de objetos (y en el menú desplegable Intellisense)

  2. En tiempo de compilación, el compilador extrae la información de tipo almacenada en las bibliotecas a las que se hace referencia, incluido el CLSID de cada clase que instancia, e integra estos datos en el ejecutable. Esto permite que su ejecutable cree instancias de clases contenidas en las bibliotecas a las que hizo referencia.

Tenga en cuenta que el binario compilado no enlaza a ningún código en las bibliotecas referenciadas, y ni siquiera contiene los nombres de archivo de las bibliotecas referenciadas. El ejecutable final solo contiene la información del CLSID y de otro tipo que necesita para instanciar objetos COM en tiempo de ejecución.

Es mucho más probable que el problema sea con NLog, o con cómo lo llama desde su código, en lugar de que algo salga mal en el proceso de compilación VB6.

Si cree que podría tratarse de un problema de enlazador, debería bloquearse de la misma manera:

  1. crear un nuevo proyecto estándar (de cualquier tipo)
  2. agregue un nuevo módulo y copie las declaraciones de "declarar" en él
  3. compilar

Si no se bloquea, es otra cosa.

Sería útil una descripción exacta del error o una captura de pantalla de lo que está sucediendo.

Una cosa que debe comprobar es donde NLogC.DLL o la DLL de C ++ que creó tiene la convención de llamada correcta definida. Básicamente, no puede tener los nombres de las funciones DLL destrozados o usar otra cosa que la convención de llamada STDCALL. Si la DLL de C ++ no se ha creado con esas dos cosas en mente, no funcionará con VB6.

Artículo de MSDN sobre convenio de llamadas.

" No se puede cargar el control xxx " Los errores pueden ser causados ??por archivos .oca que se crearon a partir de una versión diferente de un .ocx que la utilizada actualmente. Si ese es el caso, eliminar los archivos .oca ayuda.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top