Отладка плохой DLL, вызывающей ошибку соглашения - PullRequest
16 голосов
/ 22 февраля 2009

Как отладить неверную ошибку соглашения о вызовах DLL в коде MSAccess VBA?

Я внес некоторые изменения в функцию в модуле, а затем получил ошибку. Как отладить его, чтобы найти причину?

Ошибка возникает в операторе Exit функции.

Ответы [ 6 ]

25 голосов
/ 16 февраля 2011

Я видел это в Excel раньше без каких-либо внешних ссылок. Это произошло, как и с вашей проблемой, при вызове функции выхода. В Excel, похоже, нет параметра / decompile, но я исправил его, внеся изменения в один из модулей моего класса, выполнив компиляцию из меню Debug, а затем отменив изменение. Я подозреваю, что по какой-то причине один из моих модулей класса был неправильно скомпилирован, и Excel не перекомпилирует, если не решит, что что-то изменилось.

20 голосов
/ 25 марта 2009

Вы проверили свои ссылки и декомпилировали?

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

См. Также:
http://www.granite.ab.ca/access/decompile.htm
VBScript декомпилировать


Проверить ссылки в коде

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 голосов
/ 06 июня 2014

Я столкнулся с этой ошибкой и использовал библиотеку .NET для WinSCP из MS Access VBA.

То, что произошло, было:

  1. Функция UploadSomething для подключения к серверу SFTP и загрузки файла работала нормально.
  2. В функции UploadSomething изменена опция «возобновить поддержку» с этим кодом: myTransferOptions.ResumeSupport.State = TransferResumeSupportState.TransferResumeSupportState_Off

После изменения код работал как нужно. Однако в коде, который называется UploadSomething, после завершения функции выдается ошибка 49.

Ошибка произошла как при пошаговом выполнении кода с использованием отладчика, так и при выполнении сразу за пределами отладчика. Перекомпиляция проекта для меня не сработала.

Что сработало, так это:

  1. Удалить ссылку на компонент COM
  2. Добавить ссылку на компонент COM
  3. Рекомпилированные
1 голос
/ 20 сентября 2014

В Excel VBA это может быть вызвано одной из следующих проблем:

  1. Несоответствие типа параметра или возвращаемого значения.
  2. Метод объекта (такой как AutoFit), примененный к ошибочному объекту вариант, для которого этот метод недоступен.
  3. Вызов функции внешней библиотеки.
  4. Неработающие ссылки на библиотеки

Решения этих проблем см. В моем сообщении по адресу: Ошибка выполнения 49, Соглашение о неправильном вызове DLL

0 голосов
/ 01 сентября 2015

Мы столкнулись с некоторыми проблемами с VBA при попытке вызвать DLL, скомпилированную в Intel Fortran. Оказывается, вам нужно выровнять соглашения о вызовах обратно в контекст "C" с флагом компилятора соглашение о вызовах: cfv

Больше информации здесь на сайте Intel Еще одна полезная тема по этой же проблеме: Intel Fortran DLL <-> C

0 голосов
/ 13 октября 2009

Я только что получил это в Excel и удивился, если кто-то еще получил это ранее. Мое решение состояло в том, чтобы переместиться по ссылкам на мою собственную DLL и нажать «Compile ».

...