Строки в VB на самом деле, за кулисами, указатели двойных слов (4 байта, или длинная). Некоторое время я думал, что мог бы объявить Name как String, так как это просто поместило бы туда указатель и работало бы правильно (как при передаче строк VB в вызовы API). Тем не менее, я предполагаю, что завершения приложений, которые я получил, заключаются в том, что это строка в стиле C, а не строка в стиле VB, и VB ищет в ячейке памяти перед началом строки значение длины и получает случайное значение. мусор и взрывается. Это разумное предположение?
Мой вызов DnsQuery работает, когда я использую, возвращает тип DNS RR DNS_PTR_DATA или DNS_A_DATA, но когда я пытаюсь DNS_TXT_DATA, он взрывается. Может кто-то еще заметит, что я делаю не так? Посмотрите на Дело DNS_TYPE_TEXT и посмотрите мои комментарии ниже.
RetVal = DnsQuery(DnsName,
QueryType, DNS_QUERY_BYPASS_CACHE,
pServers, pDnsRecord, 0)
If RetVal = 0 Then
pNext = pDnsRecord
Do While pNext <> 0
CopyMemory DnsRecord, pNext, Len(DnsRecord)
Select Case DnsRecord.wType
Case DNS_TYPE_A
Ptr = inet_ntoa(DnsRecord.ptrData)
TempString = String(lstrlen(Ptr), 0)
CopyMemory ByVal TempString, Ptr, Len(TempString)
Case DNS_TYPE_PTR, DNS_TYPE_NS, DNS_TYPE_CNAME,
DNS_TYPE_DNAME, DNS_TYPE_MB,
DNS_TYPE_MD, DNS_TYPE_MF,
DNS_TYPE_MG, DNS_TYPE_MR
Ptr = DnsRecord.ptrData
TempString = String$(lstrlen(Ptr), 0)
CopyMemory ByVal TempString, Ptr, Len(TempString)
Case DNS_TYPE_TEXT, DNS_TYPE_HINFO, DNS_TYPE_ISDN,
DNS_TYPE_TEXT, DNS_TYPE_X25
Dim TextData As Dns_Txt_Data
Ptr = DnsRecord.ptrData
CopyMemory VarPtr(TextData), Ptr, Len(TextData)
Stop
Case Else
TempString = "unhandled resource record type"
End Select
If Not FullRecord Then
DnsLookup = " " & TempString
Exit Do
Else
DnsLookup = DnsLookup & " " & vbCrLf &
DnsTypeNameFromCode(DnsRecord.wType)
& " " & TempString
End If
pNext = DnsRecord.pNext
Loop
Теперь, когда я ставлю точку останова на строку CopyMemory и проверяю значение Ptr, я ожидаю что-то в миллионах или выше, указывая, что это указатель, только я получаю значение 1 (что объясняет, почему все взрывается, когда я пытаюсь скопировать из этого места памяти). Мне кажется, это указывает на то, что вместо указателя на ожидаемую структуру DNS_TXT_DATA я получаю количество строк. Когда я проверяю Other (0) - Other (3), все они имеют значения, которые заставляют меня подозревать, что следующие четыре байта являются указателями. Так что же дает? Почему эта структура просто входит "в строку", а остальные входят как указатели на начало структуры?