调用Delphi DLL崩溃VB6 exe与“运行时错误'-2147418113(8000ffff)'方法'〜'对象'〜'失败”,但只在某些机器上!

时间:2010-11-28 18:45:57

标签: delphi dll com vb6 crash

我搜索了几个小时但找不到类似的东西。

撞车有两种风味;一个是“运行时错误'-2147418113(8000ffff)'方法'〜'对象'〜'失败了”,第二种风格是完全崩溃,Windows询问我是否要将此报告给Microsoft。在第二种情况下,我选择调试一次,它显示“App.exe中的未处理异常(OLEAUT32.DLL):0xC0000005:访问冲突。”

“反汇编”屏幕在顶部显示黄色指针:

>> 771148A4  mov ecx, dword ptr [esi]
   771148A6  add ecx, 15h
   771148A9  and ecx, 0FFFFFFF0h
   771148AC  push ecx
   771148AD  push esi
...

在第三方Delphi DLL中调用特定的基本函数时会出现问题,但我无法直接声明DLL是错误的,因为这只发生在我编译的程序可执行文件中。这个dll在数百个其他客户中使用(至少现在)我是唯一遇到此问题的人。在客户的PC或第三方供应商的办公室中编译的相同源代码工作正常。

所以问题归结为:VB6与SP6从完全相同的源代码生成不同的二进制exe文件。在我的电脑上编译的那个在我的电脑上正常工作,我安装了一个干净的虚拟电脑来检查这个,但它不能在任何地方工作;并且在客户或第三方供应商中编制的那个在我的电脑以外的任何地方都能正常工作。

这与Boost描述的问题(see this link)不同,因为IDE和编译的应用程序在所有计算机上的行为方式相同。他们要么工作正常,要么打得非常糟糕。

Public mXApp As XObjects.XApplication

Public Sub Main    
    On Error Resume Next
    Set mXApp = New XObjects.XApplication
    If Err.Number = 0 Then
        MsgBox "Found: " & mXApp.Version & vbCrLf & mXApp.GetAppPath
    Else
        MsgBox "XApp DLL not found. " & Err.Number & ": " & Err.Description
    End If
    Err.Clear
End Sub

Public Sub Login(Byval uid As String,  Byval pwd As String, Byval companyNr as Long)
Dim ok as Boolean
    ok = mXApp.Login(uid, pwd, companyNr)' >> CRASH! Program never gets to the next line.'
    If ok Then
        MsgBox "Login success"
    Else
        MsgBox "Login fails"
    End If
End Sub

请注意,在创建mXApp对象之后,完成两个函数调用-namely Version和GetAppPath-没有任何问题。崩溃发生在Login调用中。 VB IDE对象浏览器将以下三个函数的定义显示为:

Function Version() As String
Function GetAppPath() As String
Function Login(UserName As String, Password As String, FirmNr As Long) As Boolean

是否有人有任何解决方案或(同样有用的)方法可以让供应商在自己的机器中重现此问题?

3 个答案:

答案 0 :(得分:2)

嗯,很难说没有能够看到它的Delphi方面,但是当你在DLL调用中遇到这样的问题时,首先要检查两个标准的东西。

首先,确保VB程序中的DLL函数和导入标题使用相同的调用约定。如果VB将参数放在一个地方并且Delphi DLL在其他地方寻找它们,那么你会得到未定义的行为。

其次,确保您在两侧使用相同的字符串类型。如果这是COM,那么您的字符串类型应该是COM BSTR类型,在Delphi中称为WideString。不知道VB叫什么。如果您传递的DLL类型与预期接收的字符串不同,则会导致数据损坏。

仔细检查这两件事,看看是否有解决办法。

答案 1 :(得分:2)

问题解决了!告诉我仔细检查梅森是对的:

  

...确保DLL功能和   在VB程序中导入它的标题   正在使用相同的调用约定。   如果VB将参数放在一个   地方和Delphi DLL正在寻找   对于他们在其他地方,你得到   未定义的行为。

我的电脑上的DLL和客户中的DLL一直都有些不同。我假设他们有完全相同的界面。但等到我以为我不小心;我不只是假设这一点,在我在这里发布我的问题之前,我已经在注册了两个版本的DLL之后编译了两个不同的可执行文件。

当我以为我尝试过第二个dll时,我错了。我在我的电脑上注册了DLL版本1.1。对象查看器显示了问题中的声明。我编译了可执行文件并测试过。然后没有退出IDE ,我注册了dll版本1.2并再次编译,假设VB编译器在编译期间将读取dll接口。那么这个假设是错误的。事实证明,IDE必须重新启动。

问题解决后,dll的供应商告诉我有一个可选的新参数,但他们之前没有提到它,假设这不会有问题,因为它是可选的

以下是导致崩溃的区别:

Function Login(UserName As String, Password As String, FirmNr As Long, [PeriodNr As Long]) As Boolean

答案 2 :(得分:1)

确保您正在加载正确的DLL。来自SysInternals的Process Explorer将向您显示任何应用程序正在使用的DLL(将其配置为在下部窗格中显示DLL)。也许你在不知不觉中加载了不同版本的DLL。 你可以在这里直接运行它: http://live.sysinternals.com/点击procexp.exe