2012-01-28 116 views
0

我想這個VB.NET/C#聲明轉換爲Visual Basic 6.0的一個,遇到了問題(包括在C#版本,轉換爲VB.NET不是問題。):在Visual Basic 6.0中如何做「Public Declare Ansi Function」?

[DllImport("urlmon.dll", CharSet = CharSet.Ansi)] 
private static extern int UrlMkSetSessionOption(
    int dwOption, 
    string pBuffer, 
    int dwBufferLength, 
    int dwReserved); 

正如你可以看到,在Visual Basic/C#我們有CharSet=CharSet.Ansi一部分,我不知道如何在Visual Basic 6.0做的 - 我想在別名... Alias "UrlMkSetSessionOptionA"的末尾添加一個...但沒沒有工作(說can't find DLL entrypoint in urlmon.dll)。如果沒有這個,發送給pBuffer的字符串就會出現亂碼(我無法識別的奇怪字符)。

這是我到目前爲止已經得到了...

Public Declare Sub UrlMkSetSessionOption Lib "urlmon.dll" (ByVal _ 
    dwOption As Long, _ 
    pBuffer As Any, _ 
    ByVal dwBufferLength As Long, _ 
    ByVal dwReserved As Long) 
+1

VB6沒有這個選項,它總是假定ANSI字符串。所以你得到的已經很好,除了Function over Sub。你如何看待胡言亂語很難猜測。我不希望這個API函數現在仍然有效。 – 2012-01-28 19:38:55

+0

@Hans Passant感謝您的評論。你能詳細說明你的意思嗎:「我不希望這個API函數今天仍然有效」?有替代或更新的函數來使用,而不是UrlMkSetSessionOption或?如果是這樣,很樂意聽到它。我試圖更改在我的會話中託管的WebBrowser控件的用戶代理,但WebBrowser控件內置方法不會爲所有請求執行此操作。 InternetSetOption是否可以做到這一點?再次感謝您的寶貴貢獻。 – 2012-01-28 20:54:31

+0

問真正的問題,而不是這一個。沒人能猜到「不要爲所有請求做這件事」可能意味着什麼。 – 2012-01-28 20:59:17

回答

0

我剛剛想通了,該聲明是正確的,並且有一種特殊的方式,它需要被稱爲 - 基本上你需要將字符串傳遞以ByVal - 它,而我嘗試的組合只是隨機工作不同的東西。感謝大家的貢獻。如果聲明爲sub,則這是調用。

UrlMkSetSessionOption URLMON_OPTION_USERAGENT, ByVal strUA, Len(strUA), 0 

我希望這是有用的人 - 當你調用沒有「BYVAL strUA」第二個參數,只是通過「strUA」內部函數必須承擔的ByRef,這意味着它正試圖使用​​變量我們通過它(一個ANSI的Visual Basic 6.0 STRING),當然,當它是這種情況,它爲亂碼作爲最終的類型C函數使用不是ANSI Visual Basic字符串類型。

所以,傳遞,當它以ByVal它只是由值傳遞給它(並不作爲參考),然後可以使用其自己的變量/數據類型的組合,其與串兼容鍵入它使用。我希望能幫助別人。

+1

如果你通過ByRef它將通過VB6自己的內部Unicode BStr。 ByVal調用自動轉換爲ANSI並傳遞一個指向該字符串的指針。 – MarkJ 2012-01-29 08:09:21

+0

實際上,傳遞給ByRef As String參數會創建一個ANSI-copy CHAR數組,並將指向該地址(即通過引用)的指針傳遞給該指針,返回時將ANSI CHAR數據複製並轉換爲Unicode。 ByVal As String與ANSI執行相同的副本,但傳遞ANSI BSTR的第一個字符的指針(通過值)。 – Bob77 2012-01-29 12:34:52

+1

如果您想通過值傳遞實際的Unicode字符串,請聲明參數ByVal As Long並傳遞StrPtr(string)。要通過引用傳遞聲明ByVal As Long並傳遞VarPtr(string),但這在Win32 API中很少使用。 – Bob77 2012-01-29 12:38:27

3

您聲明VB6功能Sub,使編譯器/解釋神色一void功能(也被稱爲程序),而實際功能有一個int返回類型。

,如果你改變你的包含語句這個應該工作:

Public Declare Function UrlMkSetSessionOption Lib "urlmon.dll" (ByVal _ 
    dwOption As Long, _ 
    pBuffer As Any, _ 
    ByVal dwBufferLength As Long, _ 
    ByVal dwReserved As Long) As Long 

這可能是因爲你也有Integer更換的Long所有出現的,但由於我缺乏有經驗的VB6我不確定。

+0

感謝您的回覆。我試着改變一個整型和長返回類型的函數,我甚至嘗試將變量變爲整數+上述所有組合。結果仍然相同。有趣的是,即時通過一個字符串,我沒有改變測試之間的約20個字符長,出來的是一個變化/不同的字符串約3-7個字符長,主要由非關鍵字字符組成。我通過我的表單中的瀏覽器控件訪問whatsmyuseragent.com看到了結果,所以函數正在工作,但是字符串在一路上變成亂碼......? – 2012-01-28 20:49:26

+0

再次感謝你的貢獻[upvoted],但是我已經通過嘗試一些隨機的東西來解決它。如果您對這是什麼感到好奇,請隨時參考我提供的答案。 – 2012-01-28 21:16:49

0
Const URLMON_OPTION_USERAGENT = &H10000001 
Const URLMON_OPTION_USERAGENT_REFRESH = &H10000002 

私人聲明函數UrlMkSetSessionOption庫 「URLMON」(BYVAL dwOption長,BYVAL p緩衝器作爲字符串,BYVAL dwBufferLength長,BYVAL dwReserved長)作爲整數

公共職能ChangeUserAgent

(Optional ByVal MyUserAgent As String = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36") 

Call UrlMkSetSessionOption(URLMON_OPTION_USERAGENT_REFRESH, vbNullString, 0, 0) 

Call UrlMkSetSessionOption(URLMON_OPTION_USERAGENT, MyUserAgent, LenB(MyUserAgent), 0) 

端功能