2016-11-12 27 views
3

我想要獲得默認瀏覽器的UserAgent使用ObtainUserAgentString API Visual Basic 6。我在MSDN上找到了這個文檔,並試圖將它轉換爲Visual Basic 6,但它不起作用。如何在Visual Basic 6中獲取瀏覽器的UserAgent字符串?

C++(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

記住的字符串始終按地址傳遞。關鍵字ByVal傳遞一個C字符串byRef,ByRef傳遞一個BStr ByRef。 BStr是一個帶有4個字節頭的Cstr。因此,ByVal將開始4個字節的內存地址傳遞給字符串。 – 2016-11-12 06:36:03

+1

如果機器未使用,該怎麼辦?即 –

+0

要點Urlmon是IE生態系統的一部分,與第三方瀏覽器沒有任何關係。 – Bob77

回答

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

參數2是LongPointerCString。你總是傳遞C字符串ByVal,它實際上傳遞B字符串ByRef的C字符串部分。如果它是一個IN參數,你將不得不用一個Chr(0)來結束字符串,這是真正的C字符串。

字符串參數是一種特殊情況。按值傳遞字符串表示您傳遞字符串中第一個數據字節的地址;通過引用傳遞字符串意味着您傳遞存儲另一個地址的內存地址;第二個地址實際上是指字符串的第一個數據字節。您如何確定使用哪種方法在本章後面的「將字符串傳遞給DLL過程」主題中進行了說明。

從幫助中的Visual Basic概念。

+0

但是,VB6中的所有動態字符串變量都基於BSTR,它總是有一個超過有效數據結尾的「guard null」:兩個零字節。 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

相關問題