2016-11-12 2 views
3

Я пытаюсь получить UserAgent браузера по умолчанию с помощью ObtainUserAgentString API в Visual Basic 6. Я нашел документацию на MSDN и попытался преобразовать ее в Visual Basic 6, но это не сработало.Как получить строку UserAgent Browser в Visual Basic 6?

С ++ (MSDN)

HRESULT ObtainUserAgentString(
    _In_ DWORD dwOption = 0, 
    _Out_ LPCSTR *pcszUAOut, 
    _Out_ DWORD *cbSize 
); 

Visual Basic 6 API-

Private Declare Function ObtainUserAgentString Lib "Urlmon.dll" (ByVal dwOption As Long, ByRef pcszUAOut As String, ByRef cbSize As Long) As Long 

Private Function BrowserUserAgent() As String 
Dim httpUseragent As String 
Dim szhttpUserAgent As Long 
httpUseragent = Space(512) 
szhttpUserAgent = Len(httpUseragent) 
Call ObtainUserAgentString(0, httpUseragent, szhttpUserAgent) 
BrowserUserAgent = httpUseragent 
End Function 

Private Sub Command1_Click() 
MsgBox BrowserUserAgent 
End Sub 
+1

Помните строки всегда проходили ByRef. Ключевое слово ByVal передает строку C byRef, ByRef передает BStr ByRef. BStr - это Cstr с 4 байтовым заголовком. Поэтому ByVal передает адрес памяти, начиная с 4 байтов в строку. –

+1

Что делать, если машина не используется, т.е. –

+0

Точка, что Urlmon является частью экосистемы IE и не имеет отношения к сторонним браузерам. – Bob77

ответ

3
HRESULT ObtainUserAgentString(
    _In_ DWORD dwOption = 0, 
    _Out_ LPCSTR *pcszUAOut, 
    _Out_ DWORD *cbSize 
); 

Param 2 LongPointerCString. Вы всегда передаете строки C ByVal, которые в действительности передают часть строки C строки B Byring. Если бы это был параметр IN, вам пришлось бы закончить строку с помощью Chr (0), что и есть в реальных C-строках.

Строковые аргументы являются частным случаем. Передача строки по значению означает, что вы передаете адрес первого байта данных в строке; передача строки по ссылке означает, что вы передаете адрес памяти, где хранится другой адрес; второй адрес фактически относится к первому байту данных строки. Как вы определяете, какой подход к использованию объясняется в разделе «Передача строк в процедуру DLL» далее в этой главе.

От Visual Basic Concepts в справке.

+0

Но все динамические переменные String в VB6 основаны на BSTR, который всегда имеет «защитный нуль» за конец допустимых данных: два байта нуля. https://msdn.microsoft.com/en-us/library/windows/desktop/ms221069(v=vs.85).aspx – Bob77

4

Помимо того, что это грубая старая точка доступа ANSI, все, что вам нужно, должно быть документировано.

Option Explicit 

Private Const NOERROR As Long = 0 
Private Const E_OUTOFMEMORY As Long = &H8007000E 

Private Enum UAS_OPTIONSENUM 
    [_UAS_EXACTLEGACY] = &H1000& 
    UAS_DEFAULT = 0 
    UAS_7 = 7 'Compatible mode. 
    UAS_7_LEGACY = 7 Or [_UAS_EXACTLEGACY] 
    UAS_8 = 8 
    UAS_9 = 9 
    UAS_10 = 10 
    UAS_11 = 11 
End Enum 

Private Declare Function ObtainUserAgentString Lib "urlmon" (_ 
    ByVal dwOption As Long, _ 
    ByVal pcszUAOut As Long, _ 
    ByRef cbSize As Long) As Long 

Private Function BrowserUserAgent(_ 
    Optional ByVal Options As UAS_OPTIONSENUM = UAS_DEFAULT) As String 
    Const MAX_BUFFER As Long = 2048 
    Dim Size As Long 
    Dim Buffer() As Byte 
    Dim HRESULT As Long 

    Do 
     Size = Size + 128 
     ReDim Buffer(Size - 1) 
     HRESULT = ObtainUserAgentString(Options, VarPtr(Buffer(0)), Size) 
    Loop While HRESULT = E_OUTOFMEMORY And Size < MAX_BUFFER 
    If HRESULT = NOERROR Then 
     BrowserUserAgent = StrConv(LeftB$(Buffer, Size - 1), vbUnicode) 
    Else 
     Err.Raise &H8004D000, _ 
        , _ 
        "ObtainUserAgentString error &H" & Hex$(HRESULT) 
    End If 
End Function 

Private Sub Form_Load() 
    AutoRedraw = True 
    Print BrowserUserAgent() 
    Print BrowserUserAgent(UAS_7) 
    Print BrowserUserAgent(UAS_7_LEGACY) 
    Print BrowserUserAgent(UAS_8) 
    Print BrowserUserAgent(UAS_11) 
End Sub 

Screenshot

Смежные вопросы