奇怪的VB6构建问题(与nlog相关) 这是我使用Nlog C++ API的问题(我的问题是Nlog论坛);我在这里提出这个问题的目的是为了让更多的人了解我的问题,也许也是为了了解VB6 IDE在我的特定场景中无法构建的原因 简要地说,我所遇到的问题是,我很难建立VB6组件,这些组件引用了非托管C++组件,这些组件调用Nlog的C++ C++ API(在NLog.DLL中定义)。构建问题不是在编译时发生的,而是在构建二进制文件时发生的,这向我表明这是某种链接器类型的问题?我对VB6二进制文件是如何产生的了解还不够。生成了VB6二进制文件,但它已损坏,并在调用后不久崩溃

奇怪的VB6构建问题(与nlog相关) 这是我使用Nlog C++ API的问题(我的问题是Nlog论坛);我在这里提出这个问题的目的是为了让更多的人了解我的问题,也许也是为了了解VB6 IDE在我的特定场景中无法构建的原因 简要地说,我所遇到的问题是,我很难建立VB6组件,这些组件引用了非托管C++组件,这些组件调用Nlog的C++ C++ API(在NLog.DLL中定义)。构建问题不是在编译时发生的,而是在构建二进制文件时发生的,这向我表明这是某种链接器类型的问题?我对VB6二进制文件是如何产生的了解还不够。生成了VB6二进制文件,但它已损坏,并在调用后不久崩溃,vb6,build,nlog,Vb6,Build,Nlog,有没有人有过VB6的类似经验(不一定与nlog或C++有关) 编辑:谢谢大家对这个相当模糊的问题的回答。不幸的是,仍然没有进展;我的发现,因为我发布了以下内容: “调整”编译选项似乎对此问题没有帮助 从“空白”VB6项目中添加对Nlog启用的C++组件的引用不会崩溃或导致奇怪的生成问题。所以这不是“本机”VB6问题,可能是nlog与其他引用组件使用的各种组件和第三方库之间的交互问题 至于C++调用约定:nlog启用的C++组件是——我可以看到——遵从这些约定,并且只要它没有做任何Nlog API

有没有人有过VB6的类似经验(不一定与nlog或C++有关)

编辑:谢谢大家对这个相当模糊的问题的回答。不幸的是,仍然没有进展;我的发现,因为我发布了以下内容:

  • “调整”编译选项似乎对此问题没有帮助
  • 从“空白”VB6项目中添加对Nlog启用的C++组件的引用不会崩溃或导致奇怪的生成问题。所以这不是“本机”VB6问题,可能是nlog与其他引用组件使用的各种组件和第三方库之间的交互问题
  • 至于C++调用约定:nlog启用的C++组件是——我可以看到——遵从这些约定,并且只要它没有做任何Nlog API调用,VB6引用时确实可以工作得很好。不确定NLogCdLL本身是否符合VB6,但我认为这是非物质的,因为API调用是由C++组件制作的;VB6不应该知道或关心C++组件引用什么(这是我对这方面的理解)…<
    edit2:我还应该注意,在构建过程中获得的错误消息是:“加载过程中出错。有关详细信息,请参阅“xxx”。当我打开日志文件时,里面只有:“无法加载控制xxx”。有趣的是,如果我再次尝试构建,对该特定控件的所有引用将从该特定项目中消失,从而导致编译错误。

    我将尝试调整项目属性菜单中的一些编译选项,编译面板,查看它们是否会产生任何关于出错原因的额外提示


    例如,如果将可执行文件编译为p-code而不是本机代码,它在启动时是否仍会崩溃。

    运行编译后的二进制文件时会收到什么错误消息

    我怀疑编译器/链接器是问题所在:VB6项目中的项目引用没有链接到最终的可执行文件中。VB6中的项目引用实际上是对COM类型库的引用(该库可能嵌入在.dll或其他二进制文件类型中,也可能不嵌入)。项目参考主要用于两个目的:

  • IDE从引用的类型库中提取类型信息,然后显示在对象浏览器(以及Intellisense下拉列表)中

  • 在编译时,编译器提取存储在引用库中的类型信息,包括实例化的每个类的CLSID,并将该数据嵌入到可执行文件中。这允许您的可执行文件创建您引用的库中包含的类的实例

  • 请注意,编译后的二进制文件不链接到引用库中的任何代码,甚至不包含引用库的文件名。最终的可执行文件只包含CLSID和其他类型信息,它需要这些信息在运行时实例化COM对象


    更有可能的问题是NLog,或者是如何从代码中调用NLog,而不是VB6编译过程中出现的问题。

    如果您认为这可能是链接器问题,则应该以同样的方式使其崩溃:

  • 创建新的标准项目(任何类型)
  • 添加一个新模块并将“declare”-语句复制到其中
  • 编撰

  • 如果它没有崩溃,那是另外一回事。

    这将有助于准确描述错误或屏幕截图

    <检查一件事是NLogC.DLL或C++的DLL在哪里建立了正确的调用约定。基本上,除了STDCALL调用约定之外,您不能让DLL函数名被破坏或使用任何东西。如果没有用这两个东西来创建C++ DLL,那么它将不能与VB6一起工作。

    通过使用Nlog的COM接口(nlog,COMICOP.DLL)解决了这个问题,我的非托管C++代码。不像C\C++API那样简单,但至少它不会使我的VB6组件崩溃。

    “无法加载控制xxx”错误可能是由.oca文件引起的,这些文件是从不同于当前使用的.ocx版本创建的。如果是这种情况,删除.oca文件会有所帮助。

    不清楚实际错误是什么