回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我正在尝试使用WinINet库中的<a href="https://msdn.microsoft.com/en-us/library/windows/desktop/aa384376%28v=vs.85%29.aspx" rel="nofollow">InternetCrackUrl</a>函数解析url。你知道吗</p>
<p>这个函数的“return”值是通过lpUrlComponents参数完成的,该参数有一个<a href="https://msdn.microsoft.com/en-us/library/windows/desktop/aa385420%28v=vs.85%29.aspx" rel="nofollow">defined structure</a>。你知道吗</p>
<p>我现在的问题是,我的结构化类只检索数值字段<code>DWORD</code>和<code>INT</code>中的值,但是所有字母数字字段/所有指针<code>LPCWSTR</code>都是空的(输出在代码块的末尾)。你知道吗</p>
<p><em>我知道有问题的参数应该是指向变量的指针。我认为那是错误的部分。</em></p>
<p>我做错什么了?你知道吗</p>
<p><strong>编辑:</strong>我在代码块末尾添加了使其正常工作所必需的几行代码。这已经在Win8.1和XP上进行了测试。你知道吗</p>
<pre><code>from ctypes import *
from ctypes.wintypes import *
dll = windll.wininet
url = LPCWSTR("http://user:password@www.host.com:8080/url-path?key=value")
url_length = DWORD(len(url.value))
flags = DWORD()
class URL_COMPONENTS(Structure):
_fields_ = [
("dwStructSize", DWORD),
("lpszScheme", LPCWSTR),
("dwSchemeLength", DWORD),
("nScheme", INT),
("lpszHostName", LPCWSTR),
("dwHostNameLength", DWORD),
("nPort", INT),
("lpszUserName", LPCWSTR),
("dwUserNameLength", DWORD),
("lpszPassword", LPCWSTR),
("dwPasswordLength", DWORD),
("lpszUrlPath", LPCWSTR),
("dwUrlPathLength", DWORD),
("lpszExtraInfo", LPCWSTR),
("dwExtraInfoLength", DWORD),
]
url = LPCWSTR("http://user:password@www.host.com:8080/url-path?key=value")
url_length = DWORD(len(url.value))
flags = DWORD()
url_components = URL_COMPONENTS()
dll.InternetCrackUrlW.restype = c_bool
print "Output of initial question:"
print dll.InternetCrackUrlW(url, url_length, flags, byref(url_components))
for field in url_components._fields_:
print field[0], getattr(url_components, field[0])
print "\nOutput of working:"
# Give the those lengths a nonzero value. == 0 do nothing, != 0 do something
url_components.dwHostNameLength = DWORD(-1)
dll.InternetCrackUrlW(url, url_length, flags, byref(url_components))
# Now we got the string cut off at the start of the desired element.
print "lpszHostName:", url_components.lpszHostName
# And the length of the content.
print "dwHostNameLength:", url_components.dwHostNameLength
# Just cut it out and you get the desired result.
print "HostName:", url_components.lpszHostName[:url_components.dwHostNameLength]
Output of initial question output:
True
dwStructSize 60
lpszScheme None
dwSchemeLength 0
nScheme 3
lpszHostName None
dwHostNameLength 0
nPort 8080
lpszUserName None
dwUserNameLength 0
lpszPassword None
dwPasswordLength 0
lpszUrlPath None
dwUrlPathLength 0
lpszExtraInfo None
dwExtraInfoLength 0
Output of working:
lpszHostName: www.host.com:8080/url-path?key=value
dwHostNameLength: 12
HostName: www.host.com
</code></pre>