我想从Python调用Windows C++函数WinHttpGetProxyForUrl,这可以吗?
微软提供了一种方法,叫做 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:
2 个回答
在ActiveState的这个页面上:WINHTTP_AUTOPROXY_OPTIONS
对象提到,WinHttpGetProxyForUrl
可以在Win32扩展的win32inet模块中找到。不过现在SourceForge网站出问题了,我无法下载来确认这个信息。
编辑:在问题的“更新0”之后:
你需要传递一个WINHTTP_AUTOPROXY_OPTIONS
和一个WINHTTP_PROXY_INFO
,具体的文档可以在MSDN上找到:WinHttpGetProxyForUrl函数。
你可以使用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