调试错误的DLL调用约定错误

时间:2009-02-22 08:37:37

标签: vba ms-access dll access-vba

如何在MSAccess VBA代码中调试错误的DLL调用约定错误?

我对模块中的函数进行了一些更改,然后得到了错误。如何调试它以找到原因?

错误发生在函数的Exit函数语句中。

6 个答案:

答案 0 :(得分:25)

在没有任何外部引用的情况下,我在Excel中看到了这一点。与您的问题一样,它发生在Exit Function调用上。 Excel似乎没有/ decompile选项,但是我通过在我的一个类模块中进行更改,从Debug菜单执行编译,然后撤消更改来修复它。我怀疑我的一个类模块由于某种原因而编译错误,除非它认为某些内容发生了变化,否则Excel不会重新编译。

答案 1 :(得分:20)

您是否检查了参考文献并进行了反编译?

"C:\Program Files\Microsoft Office\Office\MSACCESS.EXE" 
                                "d:\My Documents\access\mayapp.mdb" /decompile

另见:
http://www.granite.ab.ca/access/decompile.htm
VBScript Decompile


检查代码中的引用

Dim ref As Reference
Dim sMsg As String

''Available since 2010
If BrokenReference Then
    For Each ref In References
        ''Available since at least 2000
        If ref.IsBroken Then
            sMsg = sMsg & "Ref Name: " & ref.Name
            'Also, if required
            'sMsg = sMsg & vbCrLf & "Built In: " & ref.BuiltIn
            'sMsg = sMsg & vbCrLf & "Full Path: " & ref.FullPath
            'sMsg = sMsg & vbCrLf & "GUID: " & ref.Guid
            'sMsg = sMsg & vbCrLf & "Kind: " & ref.Kind
            'sMsg = sMsg & vbCrLf & "Major (version number): " & ref.Major
            'sMsg = sMsg & vbCrLf & "Minor (version number): " & ref.Minor
            sMsg = sMsg & vbCrLf & "=================================" & vbCrLf
        End If
    Next
    MsgBox sMsg
End If

答案 2 :(得分:2)

我使用MS Access VBA中的the .NET library for WinSCP体验并解决了此错误。

发生的事情是:

  1. 用于连接SFTP服务器并上传文件的函数UploadSomething正常工作。
  2. 在功能UploadSomething内更改了"恢复支持"使用此代码的选项:myTransferOptions.ResumeSupport.State = TransferResumeSupportState.TransferResumeSupportState_Off
  3. 更改后,代码按预期工作。但是在调用 UploadSomething的代码中,函数完成后抛出了错误49.

    使用调试器单步执行代码和在调试器外部执行时都会发生错误。重新编译该项目并不适合我。

    这是什么工作:

    1. 删除对COM组件的引用
    2. 添加对COM组件的引用
    3. 重新编译

答案 3 :(得分:1)

在Excel VBA中,这可能是由以下任何问题引起的:

  1. 参数或返回值类型不匹配。
  2. 应用于错误对象的对象方法(如AutoFit) 该方法不可用的变体。
  3. 调用外部库函数。
  4. 破损的图书馆参考
  5. 有关这些原因的解决方法,请参阅我的帖子:Runtime Error 49, Bad DLL calling convention

答案 4 :(得分:0)

我刚刚在Excel中得到了这个,并想知道是否有其他人以前得到过它。我的解决方案是移动对我自己的DLL的引用,然后单击“编译<项目>”。

答案 5 :(得分:0)

在尝试调用在英特尔Fortran中编译的DLL时,我们遇到了一些VBA问题。事实证明,您需要将调用约定与#34; C"上下文与编译器标志 调用约定:cfv

Intel website的更多信息 关于同一问题的另一个有用的线索:Intel Fortran DLL <-> C