如何在Visual Basic 6.0中执行“公共声明Ansi函数”?

时间:2012-01-28 18:31:57

标签: c# vb.net vb6 urlmon

我试图将这个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中执行 - 我尝试在Alias的末尾添加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)

3 个答案:

答案 0 :(得分:3)

您将VB6函数声明为Sub,使编译器/解释器查找void函数(也称为过程),而实际函数具有int返回类型。

如果您将include语句更改为:

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

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

答案 1 :(得分: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传递时,它只是按值(而不是通过引用)传递它,然后可以使用它自己的变量/数据类型组合,它与它使用的字符串类型兼容。我希望能帮助别人。

答案 2 :(得分:0)

path = browsefunc()

私有声明函数UrlMkSetSessionOption Lib“urlmon”(ByVal dwOption As Long,ByVal pBuffer As String,ByVal dwBufferLength As Long,ByVal dwReserved As Long)as Integer

Public Function ChangeUserAgent

def browsefunc():
    filename = askdirectory()
    pathlabel.config(text=filename)
    return filename
def new_window():
path = browsefunc()

结束功能