【发布时间】:2017-07-22 11:24:45
【问题描述】:
我正在尝试使用 Windows 驱动程序并使用 Microsoft 的驱动程序代码示例(确切地说是 Minispy)。不幸的是,我对 C++ 非常陌生,尤其是驱动程序开发。
在将用户模式应用程序从 C 转换为 C++ 时(大部分部分现在运行良好),我遇到了一个有趣的转换:
CHAR buffer[1024];
PINSTANCE_FULL_INFORMATION data = (PINSTANCE_FULL_INFORMATION)buffer;
hResult = FilterVolumeInstanceFindFirst(VolumeName,
InstanceFullInformation,
data,
sizeof(buffer) - sizeof(WCHAR),
&bytesReturned,
&volumeIterator);
PWCHAR filtername = PVOID(PUCHAR(data) + data->FilterNameBufferOffset);
filtername[data->FilterNameLength / sizeof(WCHAR)] = L'\0';
if (_wcsicmp(filtername, MINISPY_NAME) == 0) { ...
这部分代码提供编译器错误 C2440: Cannot convert from PVOID to PWCHAR:
filtername = PVOID(PUCHAR(data) + data->FilterNameBufferOffset);
代码在 C 中运行得非常好,但 C++ 不会将该 void 指针“数组”转换为 PWCHAR。
我已经尝试了几个小时,但我无法让它工作。有什么想法吗?
非常感谢!
供参考:
PINSTANCE_FULL_INFORMATION 结构:
https://msdn.microsoft.com/de-de/library/ff548185(v=vs.85).aspx
编译器错误C2440:
【问题讨论】:
-
当然
PVOID不能赋值给c++中的PWCHAR变量。你需要直接投射PWCHAR filtername = (PWCHAR)(PUCHAR(data) + data->FilterNameBufferOffset);或说(PWSTR)RtlOffsetToPointer(data, data->FilterNameBufferOffset)