我试图将这个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)
答案 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()
结束功能