0

我正在尝试将此 VB.NET / C# 声明转换为 Visual Basic 6.0,但遇到了问题(包括 C# 版本,转换为 VB.NET 没问题):

[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 中执行此操作 - 我尝试在别名名称末尾添加 A ... 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)
4

3 回答 3

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

可能您还必须替换所有出现的Longwith Integer,但由于我缺乏 VB6 的经验,我不确定。

于 2012-01-28T19:13:10.163 回答
0

我刚刚发现声明是正确的,并且需要以一种特殊的方式调用它——基本上你需要将字符串作为 ByVal 传递——它只是在我尝试不同事物的组合时随机工作。感谢大家的贡献。如果声明为子,则这是调用。

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

我希望这对某人有用 - 当您调用没有“ByVal strUA”的第二个参数并且只传递“strUA”时,内部函数必须假定 ByRef,这意味着它正在尝试使用我们传递给它的变量(ANSI Visual Basic 6.0 STRING),当然,当它这样做时,它最终会像 C 函数使用的字符串类型不是 ANSI Visual Basic 字符串类型一样乱码。

因此,当将它作为 ByVal 传递时,它只是通过值(而不是通过引用)传递它,然后可以使用与它使用的字符串类型兼容的自己的变量/数据类型组合。我希望这对某人有所帮助。

于 2012-01-28T21:13:44.253 回答
0
Const URLMON_OPTION_USERAGENT = &H10000001
Const URLMON_OPTION_USERAGENT_REFRESH = &H10000002

Private Declare Function UrlMkSetSessionOption Lib "urlmon" (ByVal dwOption As Long, ByVal pBuffer As Long, ByVal dwBufferLength As Long, ByVal dwReserved As Long) As Long

公共函数 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)

结束功能

于 2017-01-12T13:12:06.190 回答