2009-02-22 5 views
13

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

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

Ошибка возникает в выражении функции выхода функции.

+0

Вы вызываете функцию native, объявленную с помощью инструкции «Объявить», правильно? Не могли бы вы поделиться с нами как декларацией, так и звонком? –

+3

Я исправил его ... все, что мне нужно было сделать, это начать доступ с/декомпилировать, а затем перекомпилировать и ошибка исчезла. – Malcolm

+0

Для разрешений на эту ошибку в Excel, см мой пост в: [Runtime Error 49, Bad DLL вызовах] [1] [1]: http://stackoverflow.com/questions/15758834/runtime -error-49-bad-dll-call-convention – pstraton

ответ

18

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

"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 
+1

Желая, чтобы у меня было больше очков для вас за этот ответ. – Andy

+0

Я столкнулся с этой ошибкой при вызове (и снова при возврате из функции) в функцию доступа VBA, которую я написал, а не внешнюю функцию API./декомпилировать и перекомпилировать сделал трюк. Я подозреваю, что большая часть отладки (а не просто работа) рекурсивная функция получила Access confused и/decompile очистила беспорядок. – SebTHU

0

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

21

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

+9

Holy f * спасибо за сообщение, точную проблему у меня было. Я просто разместил xxxx в верхней части каждого модуля, а затем: Debug, Compile VBAProject (который выделит xxxx) ... удалите это -> Debug, Compile VBAProject ... повторите, пока не будет больше ошибок компиляции. – tbone

2

Я столкнулся с этой ошибкой, используя the .NET library for WinSCP от MS Access VBA.

Что произошло:

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

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

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

Что работа заключалась в следующем:

  1. Удалить ссылку на COM-компонент
  2. Добавить ссылку на COM-компонент
  3. Recompile
1

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

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

Для разрешений на эти причины, см мой пост в: Runtime Error 49, Bad DLL calling convention

0

Мы столкнулись некоторые проблемы с VBA, при попытке вызова DLL скомпилированный в Intel Fortran. Оказывается, что вам нужно, чтобы выровнять соглашения о вызовах обратно в контексте «C» с флагом компилятора соглашение о вызовах: ТИВ

Более подробную информацию здесь на Intel website другой полезной резьбы на одной и той же проблемой: Intel Fortran DLL <-> C