回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>首先,我发现了以下两个类似的问题:</p>
<p><a href="https://stackoverflow.com/questions/7909090/passing-structure-to-windows-api-in-python-ctypes">Passing Structure to Windows API in python ctypes</a></p>
<p><a href="https://stackoverflow.com/questions/7530473/ctypes-and-passing-a-by-reference-to-a-function">ctypes and passing a by reference to a function</a></p>
<p>第一个问题没有一个公认的答案,我也不认为我是在不同的过程中做任何事情。第二个简单地指出pointer()和byref(),这两个我都试过使用,但都没有用。在</p>
<p>现在,请回答我的问题:</p>
<p>我试图用我自己的prepartinformation调用函数WERReportCreate(它是指向第一个数据值为自身大小的结构的指针)。这在很多方面都失败了,这取决于我如何去做,但我不确定如何正确地去做。这一点很复杂,因为其中一个要求是结构知道它自己的大小,我不知道如何用程序来确定它(尽管如果这是唯一的问题,我想我现在已经猜到了正确的值)。来自WER API的相关信息如下所示:</p>
<pre><code>HRESULT WINAPI WerReportCreate(
__in PCWSTR pwzEventType,
__in WER_REPORT_TYPE repType,
__in_opt PWER_REPORT_INFORMATION pReportInformation,
__out HREPORT *phReportHandle
);
</code></pre>
<p>(完整信息请访问<a href="http://msdn.microsoft.com/en-us/library/windows/desktop/bb513625%28v=vs.85%29.aspx" rel="nofollow noreferrer">http://msdn.microsoft.com/en-us/library/windows/desktop/bb513625%28v=vs.85%29.aspx</a>)</p>
^{pr2}$
<p>(完整信息请访问<a href="http://msdn.microsoft.com/en-us/library/windows/desktop/bb513637%28v=vs.85%29.aspx" rel="nofollow noreferrer">http://msdn.microsoft.com/en-us/library/windows/desktop/bb513637%28v=vs.85%29.aspx</a>)</p>
<p>这是我尝试过的代码:</p>
<pre><code>import ctypes
import ctypes.wintypes
class ReportInfo( ctypes.Structure):
_fields_ = [ ("dwSize", ctypes.wintypes.DWORD),
("hProcess", ctypes.wintypes.HANDLE),
("wzConsentKey", ctypes.wintypes.WCHAR * 64),
("wzFriendlyEventName", ctypes.wintypes.WCHAR * 128),
("wzApplicationName", ctypes.wintypes.WCHAR * 128),
("wzApplicationPath", ctypes.wintypes.WCHAR * ctypes.wintypes.MAX_PATH),
("wzDescription", ctypes.wintypes.WCHAR * 512),
("hwndParent", ctypes.wintypes.HWND) ]
def genReportInfo():
import os
size = 32 #Complete SWAG, have tried many values
process = os.getpid()
parentwindow = ctypes.windll.user32.GetParent(process)
werreportinfopointer = ctypes.POINTER(ReportInfo)
p_werinfo = werreportinfopointer()
p_werinfo = ReportInfo(size, process, "consentkey", "friendlyeventname", "appname", "apppath", "desc", parentwindow)
return p_werinfo
if __name__ == '__main__':
reporthandle = ctypes.wintypes.HANDLE()
res = ctypes.wintypes.HRESULT()
### First pass NULL in as optional parameter to get default behavior ###
p_werinfo = None
res = ctypes.windll.wer.WerReportCreate(u'pwzEventType', 2, p_werinfo, ctypes.byref(reporthandle))
print "Return Code",res,"\nHandle",reporthandle #Return Code 0, reporthandle is correct (verified by submitting report in a different test)
p_werinfo = genReportInfo() # Create our own struct
### Try Again Using Our Own Struct (via 'byref') ###
res = ctypes.windll.wer.WerReportCreate(u'pwzEventType', 2, ctypes.byref(p_werinfo), ctypes.byref(reporthandle))
print "Return Code",res,"\nHandle",reporthandle #Return Code Nonzero, reporthandle is None
### Try Again Using Our Own Struct (directly) ###
res = ctypes.windll.wer.WerReportCreate(u'pwzEventType', 2, p_werinfo, ctypes.byref(reporthandle))
print "Return Code",res,"\nHandle",reporthandle #Exception Occurs, Execution halts
</code></pre>
<p>这是我得到的输出:</p>
<pre><code>Return Code 0
Handle c_void_p(26085328)
Return Code -2147024809
Handle c_void_p(None)
Traceback (most recent call last):
File "test.py", line 40, in <module>
res = ctypes.windll.wer.WerReportCreate(u'pwzEventType', s.byref(reporthandle))
WindowsError: exception: access violation writing 0x0000087C
</code></pre>
<p>事实上,当我传入null时,它是有效的,但当我实际传递my(引用my?)时就不行了structure向我表明我有三个问题之一:我没有正确地创建结构(我不确定wzConsentKey是否正确定义),或者我没有正确地计算出结构的大小(我实际上正在使用结构calcsize用各种选项来获得最初的猜测,随机加减1),否则我就不正确了传递(引用?)结构。在</p>
<p>我在这里遇到了一个死胡同。任何帮助都将不胜感激(以及如何提高我问题的清晰度、格式或质量的建议;这是我的第一篇文章)。在</p>