Получение сообщения об ошибке приводит к ошибке.

Страницы: 1
RSS
Получение сообщения об ошибке приводит к ошибке., Trans2quik
 
Здравствуйте, не могу разобраться с получением сообщения об ошибке lpstrErrorMessage из любой функции.
К примеру такой код:

Private Declare Function Connect Lib "TRANS2QUIK.DLL" Alias "TRANS2QUIK_CONNECT" _
(QUIK_DirPath As String, ByRef ExtendedErrorCode As Integer, ByRef lpstrErrorMessage As String,
ByRef ErrorMessageSize As UInteger) As Responses

Public Sub Connect1()
   Dim ErrCode As Integer
   Dim ErrMsg As String = vbNullString
   Dim ErrMsgSz As UInteger
   Dim Result As Responses = Connect(QUIK_Path, ErrCode, ErrMsg, ErrMsgSz)
End Sub

Возвращает корректные ответы если не записывает данные в lpstrErrorMessage, но выдаёт исключение "System.AccessViolationException" если библиотека пытается передать lpstrErrorMessage.


Как правильно получать эти сообщения? Заранее спасибо.


Trans2quik 1.3
QUIK 7.12.1.10
Visual Basic .NET
Windows 10 x64
 
Melchin,
Для lpstrErrorMessage и dwErrorMessageSize надо использовать ByVal вместо ByRef.
Скорей всего причина в этом
 
Нет, Сергей. Для переменной lpstrErrorMessage в руководстве пользователя указано: "Тип: указатель на переменную типа Строка", так что тут точно передача по ссылке, иначе как библиотека запишет туда сообщение?

С dwErrorMessageSize — согласен. Но ситуацию это не меняет, сообщения мне не приходят.
 
Melchin,

Делаем ByVal lpstrErrorMessage и всё работает:


Делаем ByRef lpstrErrorMessage и получаем Exeption
 
Спасибо, Сергей. Действительно, ваша рекомендация помогла мне решить проблему, но не полностью. У меня были ещё недочёты в коде, помимо ByRef/ByVal.

Данные переменные:

Dim ErrMsg As String = vbNullString
Dim ErrMsgSz As UInteger

должны иметь другие значения, а именно:

           Dim ErrMsgSz As UInteger = 255
           Dim ErrMsg As New String(" ", ErrMsgSz)

Так как в VB.NET нет типа "строка фиксированной длины".

А вот по поводу ByVal я сильно удивлён и до сих пор не понимаю как это работает. Ведь, судя по MSDN: ByVal — "Указывает, что аргумент передается таким образом, что вызванная процедура или свойство не может изменить значение переменной, представляющей аргумент в вызывающем коде."

Всего хорошего!
Страницы: 1
Читают тему
Наверх