Как персонифицировать описание ошибки вызова метода COM-объекта в скомпилированном приложении? - VB

Узнай цену своей работы

Формулировка задачи:

Здравствуйте! Пример. Вот такой код:
Листинг программы
  1. Private Sub Form_Load()
  2. On Error GoTo ErrorHandler
  3. Dim oShell As Object
  4. Set oShell = CreateObject("WScript.Shell")
  5. oShell.CurrentDirectory = "***"
  6. Set oShell = Nothing
  7. Exit Sub
  8. ErrorHandler:
  9. Debug.Print Now & " - " & "frmMain.Form_Load" & " - #" & Err.Number & " " & Err.Description & ". LastDllError = " & Err.LastDllError
  10. Resume Next
  11. End Sub
выдаст в IDE ошибку:

"Method 'CurrentDirectory' of object 'IWshShell3' failed."

Если его скомпилировать, получим:

"Method '~' of object '~' failed."

Понимаю, что не находит описания. Попытался установить в References ссылку на WScript.Shell (Windows Script Host Object (syswow64\wshom.ocx), переписав все так:
Листинг программы
  1. Private Sub Form_Load()
  2. On Error GoTo ErrorHandler
  3. Dim oShell As New WshShell
  4. oShell.CurrentDirectory = "***"
  5. Exit Sub
  6. ErrorHandler:
  7. MsgBox Now & " - " & "frmMain.Form_Load" & " - #" & Err.Number & " " & Err.Description & ". LastDllError = " & Err.LastDllError
  8. Resume Next
  9. End Sub
Но это не решило проблемы. Спасибо за помощь.

Решение задачи: «Как персонифицировать описание ошибки вызова метода COM-объекта в скомпилированном приложении?»

textual
Листинг программы
  1. Private Declare Function FormatMessage Lib "kernel32" Alias "FormatMessageA" (ByVal dwFlags As Long, lpSource As Long, ByVal dwMessageId As Long, ByVal dwLanguageId As Long, ByVal lpBuffer As String, ByVal nSize As Long, Arguments As Any) As Long
  2.  
  3. Public Sub Main()
  4.     On Error GoTo ErrorHandler
  5.  
  6.     CreateObject("WScript.Shell").CurrentDirectory = "***"
  7.  
  8.     Exit Sub
  9. ErrorHandler:
  10.     AppendErrorLogFormat Now, Err, "Engine.Main", "Что-то", "еще"
  11.     Resume Next
  12. End Sub
  13.  
  14. Private Function MessageText(lCode As Long) As String
  15.     On Error Resume Next
  16.     Const FORMAT_MESSAGE_FROM_SYSTEM As Long = &H1000
  17.    
  18.     Dim sRtrnCode   As String
  19.     Dim lRet        As Long
  20.  
  21.     sRtrnCode = Space$(256)
  22.     lRet = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, ByVal 0&, lCode, ByVal 0&, sRtrnCode, ByVal 256&, ByVal 0&)
  23.     If lRet > 0 Then
  24.         MessageText = Left$(sRtrnCode, lRet)
  25.         MessageText = Replace$(MessageText, vbNewLine, vbNullString)
  26.     End If
  27. End Function
  28.  
  29. Public Sub AppendErrorLogFormat(curTime As Date, ByVal ErrObj As ErrObject, ParamArray CodeModule())
  30.     Dim HRESULT     As String
  31.     Dim Other       As String
  32.     Dim ErrNumber   As Long
  33.     Dim ErrDescr    As String
  34.     Dim ErrLastDll  As Long
  35.     Dim i           As Long
  36.    
  37.     ErrNumber = ErrObj.Number           'сохраняю изначальные свойства
  38.    ErrDescr = ErrObj.Description
  39.     ErrLastDll = ErrObj.LastDllError
  40.    
  41.     On Error Resume Next
  42.    
  43.     For i = 1 To UBound(CodeModule)
  44.         Other = Other & CodeModule(i) & " "
  45.     Next
  46.     HRESULT = MessageText(ErrNumber)
  47.     AppendErrorLog _
  48.         curTime & _
  49.         " - " & CodeModule(0) & _
  50.         " - #" & ErrNumber & " " & _
  51.         IIf(Len(HRESULT), "(" & HRESULT & ")", "") & " " & _
  52.         ErrDescr & _
  53.         ". LastDllError = " & ErrLastDll & _
  54.         IIf(Len(Other), ". " & Other, "")
  55. End Sub

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4.167 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут