我有以下结构:
typedef struct _wfs_result
{
REQUESTID RequestID;
HSERVICE hService;
SYSTEMTIME tsTimestamp;
HRESULT hResult;
union {
DWORD dwCommandCode;
DWORD dwEventID;
} u;
LPVOID lpBuffer;
} WFSRESULT, * LPWFSRESULT;
指向结构的指针传递给此函数:
int DLL_EXPORT WFSGetInfo ( HSERVICE hService, DWORD dwCategory, LPVOID
lpQueryDetails, DWORD dwTimeOut, LPWFSRESULT * lppResult)
但是,当我尝试修改函数内部的struct时,它不会让我(不编译) 这就是我试图在函数中访问它的方式:
lppResult->RequestID = 123;
or
(*lppResult).RequestID = 123;
第二个编译,但我在调试器中得到访问冲突。 有什么想法吗?
编辑: 这是我在Codeblocks中遇到的错误:
'RequestID' in 'lppResult', which is of non-class type '_wfs_result**'|
||=== Build failed: 1 error(s), 2 warning(s) (0 minute(s), 0 second(s)) ===|
答案 0 :(得分:2)
第二个没有在Wandbox上用gcc 4.8.2编译这个错误:
错误:请求会员' RequestID' in' * lppResult',它是指针类型' LPWFSRESULT {aka _wfs_result *}' (也许你打算使用' - >'?
由于WFSRESULT
是WFSRESULT**
类型,请尝试以下操作:(*lppResult)->RequestID = 123;
答案 1 :(得分:2)
你有一个指针指针,所以你需要取消引用它两次。 (*lppResult)->RequestID
可行。
但是,在Windows上,这种签名通常意味着被调用的函数需要分配内存并将其分配给lppResult
。在这种情况下,您需要这样做。
答案 2 :(得分:1)
LPWFSRESULT * lppResult
是指向结构指针的指针。通常它意味着它是输出参数。您将指针传递给应存储结果的变量。
变量的类型为WFSRESULT*
,而非WFSRESULT
。这意味着该函数应该为WFSRESULT
分配一个内存,并将一个指向WFSRESULT
结构的指针放入输出变量中。
您的问题是您认为*lppResult
包含有效指针,而实际上它包含垃圾。
您可以通过指针解除引用来避免在堆上创建新对象
int DLL_EXPORT WFSGetInfo ( HSERVICE hService, DWORD dwCategory, LPVOID lpQueryDetails, DWORD dwTimeOut, WFSRESULT & lppResult);
然后你可以毫无问题地传递和修改输出参数。
答案 3 :(得分:0)
LppResult是一个2级指针,这就是你违反访问权限的原因。尝试更多时间。