<p>下面是<code>URL_COMPONENTS</code>结构的实现,它将所有字符串缓冲区设置为固定大小,默认为512个字符。你知道吗</p>
<pre class="lang-python prettyprint-override"><code>from ctypes import *
from ctypes.wintypes import *
wininet = WinDLL('wininet', use_last_error=True)
class URL_COMPONENTS(Structure):
_fields_ = (("dwStructSize", DWORD),
("lpszScheme", LPWSTR),
("dwSchemeLength", DWORD),
("nScheme", INT),
("lpszHostName", LPWSTR),
("dwHostNameLength", DWORD),
("nPort", INT),
("lpszUserName", LPWSTR),
("dwUserNameLength", DWORD),
("lpszPassword", LPWSTR),
("dwPasswordLength", DWORD),
("lpszUrlPath", LPWSTR),
("dwUrlPathLength", DWORD),
("lpszExtraInfo", LPWSTR),
("dwExtraInfoLength", DWORD))
def __init__(self, bufsize=512):
self.dwStructSize = sizeof(self)
fields = iter(self._fields_)
for name, dtype in fields:
if dtype == LPWSTR:
buf = (c_wchar * bufsize)()
setattr(self, name, cast(buf, LPWSTR))
name, dtype = next(fields)
setattr(self, name, bufsize)
</code></pre>
<pre class="lang-python prettyprint-override"><code>if __name__ == '__main__':
url = LPCWSTR("http://user:password@www.host.com:8080/url-path?key=value")
url_length = len(url.value)
flags = 0
url_components = URL_COMPONENTS()
if not wininet.InternetCrackUrlW(url, url_length, flags,
byref(url_components)):
raise WinError(get_last_error())
for name, dtype in url_components._fields_:
print '%s: %s' % (name, getattr(url_components, name))
</code></pre>
<p><strong>输出:</strong></p>
<pre class="lang-none prettyprint-override"><code>dwStructSize: 104
lpszScheme: http
dwSchemeLength: 4
nScheme: 3
lpszHostName: www.host.com
dwHostNameLength: 12
nPort: 8080
lpszUserName: user
dwUserNameLength: 4
lpszPassword: password
dwPasswordLength: 8
lpszUrlPath: /url-path
dwUrlPathLength: 9
lpszExtraInfo: ?key=value
dwExtraInfoLength: 10
</code></pre>