Я хотел бы вызвать функцию Windows C++ WinHttpGetProxyForUrl из Python - это можно сделать?

Microsoft предоставляет метод как часть WinHTTP, который позволяет пользователю определить, какой прокси должен использоваться для любого заданного URL. Это называется WinHttpGetProxyForUrl.

К сожалению, я программирую на python, поэтому я не могу напрямую получить доступ к этой функции - я могу использовать Win32COM для вызова любой службы Microsoft с интерфейсом COM.

Так есть ли способ получить доступ к этой функции из Python? В качестве дополнительной проблемы я не могу добавить в проект ничего, кроме Python. Это означает, что, однако, удобно добавлять исправления C# или C++.

Я использую Python2.4.4 с расширениями Win32 в Windows XP.

Обновление 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 ответа

Решение

Вы можете использовать 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

Эта страница в ActiveState: WINHTTP_AUTOPROXY_OPTIONS Объект подразумевает, что WinHttpGetProxyForUrl доступно в модуле win32inet расширений Win32. SourceForge в настоящее время не работает, поэтому я не могу загрузить его, чтобы проверить, является ли он или нет.

Изменить после "Обновление 0" в вопросе:

Вам нужно пройти WINHTTP_AUTOPROXY_OPTIONS и WINHTTP_PROXY_INFO как описано здесь на MSDN: функция WinHttpGetProxyForUrl.

Другие вопросы по тегам