我想从Python调用Windows C++函数WinHttpGetProxyForUrl,这可以吗?

1 投票
2 回答
2507 浏览
提问于 2025-04-15 12:39

微软提供了一种方法,叫做 WinHttpGetProxyForUrl,可以让用户确定在访问某个网址时应该使用哪个代理。

不过,我现在在用Python编程,所以不能直接调用这个函数。不过,我可以使用Win32COM来调用任何带有COM接口的微软服务。

那么,有没有办法从Python中访问这个函数呢?另外一个问题是,我不能在项目中添加除了Python以外的任何东西。这意味着即使有其他方便的方法,我也不能添加C#或C++的解决方案。

我在Windows XP上运行的是带有Win32扩展的Python2.4.4。

更新 0:

这是我目前的代码:

import win32inet
import pprint
hinternet = win32inet.InternetOpen("foo 1.0", 0, "", "", 0)
# Does not work!!!
proxy = win32inet.WinHttpGetProxyForUrl( hinternet, u"http://www.foo.com", 0  )

显然,最后一行是错的,但我找不到任何文档或示例来说明正确的做法!

更新 1:

我打算把这个问题重新提问,因为现在真的和win32com有关了

2 个回答

1

在ActiveState的这个页面上:WINHTTP_AUTOPROXY_OPTIONS 对象提到,WinHttpGetProxyForUrl可以在Win32扩展的win32inet模块中找到。不过现在SourceForge网站出问题了,我无法下载来确认这个信息。

编辑:在问题的“更新0”之后:

你需要传递一个WINHTTP_AUTOPROXY_OPTIONS和一个WINHTTP_PROXY_INFO,具体的文档可以在MSDN上找到:WinHttpGetProxyForUrl函数

1

你可以使用ctypes来调用WinHttp.dll中的函数,这个DLL里包含了'WinHttpGetProxyForUrl'这个功能。不过,要调用它,你需要一个HINTERNET会话变量。接下来我会给你展示第一步,教你如何使用ctypes来调用DLL,这样你就能生成一个HINTERNET变量,然后把它传递给WinHttpGetProxyForUrl。这个部分我就留给你自己去练习,如果你遇到困难,可以把代码发给我,我会帮你解决。

想了解更多关于ctypes的内容,可以去这里看看:http://docs.python.org/library/ctypes.html

import ctypes

winHttp = ctypes.windll.LoadLibrary("Winhttp.dll")

WINHTTP_ACCESS_TYPE_DEFAULT_PROXY=0
WINHTTP_NO_PROXY_NAME=WINHTTP_NO_PROXY_BYPASS=0
WINHTTP_FLAG_ASYNC=0x10000000
# http://msdn.microsoft.com/en-us/library/aa384098(VS.85).aspx
HINTERNET = winHttp.WinHttpOpen("PyWin32", WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, WINHTTP_FLAG_ASYNC)

print HINTERNET

撰写回答