Объявление этой функции:
<DllImport("kernel32.dll", EntryPoint:="FormatMessageW", SetLastError:=True, CharSet:=CharSet.Unicode, CallingConvention:=CallingConvention.StdCall)>
Public Shared Function FormatMessage(ByVal dwFlags As Integer,
ByRef lpSource As IntPtr,
ByVal dwMessageId As Integer,
ByVal dwLanguageId As Integer,
ByRef lpBuffer As [String],
ByVal nSize As Integer,
ByRef Arguments As IntPtr) As Integer
End Function
На основании определения здесь: https://pinvoke.net/default.aspx/kernel32/FormatMessage.html
Сценарий
Я в настоящее время PInvoking wininet.dll для выполнения транзакций FTP против сервера. Если возникает ошибка, я получаю код ошибки от Err.LastDllError . У меня есть определенная функция, которая получает ошибку DLL и возвращает сообщение на основе кода ошибки, однако она не работает, как ожидалось. Вот функция, которую я использую, чтобы выдавать ошибки dll:
Private Sub ThrowLastDllError()
Dim iLastErrorID As Integer = Err.LastDllError
Dim iMessageBuffer As IntPtr = Nothing
Dim iModuleHandle As IntPtr = GetModuleHandle("wininet.dll")
Dim sMessageBuffer As String = Nothing
If iLastErrorID > 12000 And iLastErrorID < 12157 Then
FormatMessage(FORMAT_MESSAGE_FROM_HMODULE Or
FORMAT_MESSAGE_IGNORE_INSERTS Or
FORMAT_MESSAGE_ALLOCATE_BUFFER,
iModuleHandle,
iLastErrorID,
0,
sMessageBuffer,
256,
Nothing)
Debugger.Break()
'TODO: Throw exception with error code message here
End If
End Sub
На основе описанной здесь техники: https://docs.microsoft.com/en-us/windows/desktop/wininet/appendix-c-handling-errors Я ожидаю получить некое строковое сообщение на основе кода ошибки для этой конкретной библиотеки DLL, например, если я получу код ошибки 12110 (ERROR_FTP_TRANSFER_IN_PROGRESS. Ссылка : https://support.microsoft.com/en-au/help/193625/info-wininet-error-codes-12001-through-12156) Я ожидал бы получить сообщение обратно (в переменной sMessageBuffer), похожее на следующее, если не то же самое «Запрошенная операция не может быть выполнена на дескрипторе сеанса FTP, потому что операция уже выполняется». Однако sMessageBuffer никогда не присваивается значение и ничего не остается. Я могу только предположить, что каким-то образом неправильно использую эту технику, я пробовал различные способы, описанные на онлайн-форумах и на этом сайте, но у меня ничего не получилось.