Member 12333593 Ответов: 0

Нужна помощь в портировании кода в VB6, чтобы VB.NET


Я пытаюсь портировать какой-то код vb6 на vb.net и одному объекту в строке кода не присваивается значение до его использования Вот код

Public Function GetFileFullPath(ByVal hFile As Long) As String
    Dim objName         As UNICODE_STRING
    Dim hHeap           As Long
    Dim dwSize          As Long
    Dim dwDriversSize   As Long
    Dim pName           As Long
    Dim ntStatus        As Long
    Dim i               As Long
    Dim strDrives       As String
    Dim strArray()      As String
    Dim strDrive        As String
    Dim strTmp          As String
    Dim strTemp         As String
    
    hHeap = GetProcessHeap
    pName = HeapAlloc(hHeap, HEAP_ZERO_MEMORY, &H1000)
    ntStatus = NtQueryObject(hFile, ObjectNameInformation, pName, &H1000, dwSize)
    If (NT_SUCCESS(ntStatus)) Then
        i = 1
        Do While (ntStatus = STATUS_INFO_LEN_MISMATCH)
            pName = HeapReAlloc(hHeap, HEAP_ZERO_MEMORY, pName, &H1000 * i)
            ntStatus = NtQueryObject(hFile, ObjectNameInformation, pName, &H1000, ByVal 0)
            i = i + 1
        Loop
    End If
    HeapFree hHeap, 0, pName
    strTemp = String$(512, Chr$(0))
    lstrcpyW strTemp, pName + Len(objName)


В самой последней строке objName не был инициализирован, и тогда я получаю предупреждение: "objName используется до того, как ему было присвоено значение.

Как вы думаете, автор имел в виду Len(pName) ?

спасибо

Что я уже пробовал:

У меня есть функция, которая использует objName. Большая его часть включена в пост.

Richard Deeming

Из того, что я вижу, NtQueryObject[^] не является публичным API. Он может быть изменен или удален из Windows без предварительного уведомления.

Основываясь на имени функции, я предполагаю, что вы хотите получить путь к файлу на основе дескриптора файла. Вы, вероятно, должны использовать GetFinalPathNameByHandle[^] чтобы сделать это. (Получение имени файла из дескриптора файла[^])

Если это преобразованный код, то преобразователь сделал очень плохую работу. Существует несколько очевидных проблем с кодом - например, использование On Error ... вместо Try .. Catch, с помощью Long вместо IntPtr для представления ручки и т. д.

Member 12333593

Спасибо. Вы мне очень помогли. И я действительно удалил "On Error" вскоре после того, как опубликовал его, плюс удалил его из своего кода. Я заменю его на try/catch. Спасибо также за long вместо IntPtr.

0 Ответов