这个我认为是关系到我使用的时间复杂C++API(和我的问题上的时间复杂论坛是 在这里,);我要求这里的问题是获得一个更广泛的受众以我的问题,也许还得到一些更一般性的想法背后的维生素b6IDE未来建立在我的特别方案。

简单地说,问题是我有的是,我有麻烦建筑物维生素b6件所参考的不受管理C++组有电话要时间复杂的C\C++API(其定义是在NLogC.DLL).生成的问题不是发生在汇编时,他们发生当的二进制正在建立这表明我它是某种连接类型的问题?不知道足够关于如何维生素b6二进制文件所产生的告诉。的维生素b6二进制产生的,但是它是破坏和崩溃之后不久就被援引。

有任何人有任何类似的经验与维生素b6(没有将相关要时间复杂或C++)?

编辑:感谢所有应对这种相当模糊的问题。仍然没有取得进展,不幸的是;我的调查结果,因为我发表这样的:

  1. "调整"的汇编选项没有出现来帮助在这个问题。
  2. 增加一个参考时间复杂的启用C++的组成从一个"空白"维生素b6项目不会崩溃,它或者导致怪异的建立问题。所以它不是一个'当地的维生素b6问题,可能是一个问题之间的相互作用时间复杂和各个组成部分和第3次缔约方图书馆使用的其他引用的组件?
  3. 至于用C++呼吁公约:时间复杂的启用C++组件是-尽我所能看到的符合这些公约并的确正常工作时所引用的维生素b6只要它不是作出任何时间复杂API话。不知道如果nlogc.DLL 本身是维生素b6符合的但我会认为那是无关紧要因为API calls正在作出从C++的组件;维生素b6不应该知道或关心什么C++组件是引用(这是尽我的理解上,这是...)

edit2:我还应该注意到,错误消息的过程中得到的建立是:"过程中的错误的负荷。请参阅"xxx"于细节"。当我带来了日志文件,所有有在有:"不能负载控制xxx"。有趣的是,所有提到,尤其是控制消失,特别是项目导致编译错误,如果我们试图建立。

有帮助吗?

解决方案

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

其他提示

我会尝试调整项目属性菜单,编译面板中的一些编译选项看看他们是否会对出现的问题产生任何额外的暗示。

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

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

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

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

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

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

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

如果你觉得它可能是一个接头的问题,这应该崩溃了同样的方式:

  1. 创建一个新的标准项目(任何)
  2. 添加一个新的模块,并复制的"声明"-的发言到它
  3. 汇编

如果它不会崩溃这是别的东西。

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

要检查的一件事是NLogC.DLL或您构建的C ++ DLL在何处定义了正确的调用约定。基本上你不能破坏DLL函数名称或使用除STDCALL调用约定之外的任何东西。如果没有用这两件事创建C ++ DLL,那么它将无法与VB6一起使用。

关于呼叫约定的MSDN文章。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top