gpt4 book ai didi

c - 为什么 PSTR 类型在不同的 visual studio 项目类型上有不同的行为?

转载 作者:行者123 更新时间:2023-12-04 12:01:26 29 4
gpt4 key购买 nike

我有以下代码可以枚举设备并将其描述写入控制台:

#include <windows.h>
#include <setupapi.h>

#include <stdio.h>
#include <tchar.h>

#ifdef DEBUG
#undef DBG
#define DBG 1
#endif

#if DBG
#define OOPS() Oops(__FILE__, __LINE__)
#else
#define OOPS()
#endif

#define ALLOC(dwBytes) GlobalAlloc(GPTR,(dwBytes))

#define REALLOC(hMem, dwBytes) GlobalReAlloc((hMem), (dwBytes), (GMEM_MOVEABLE|GMEM_ZEROINIT))

#define FREE(hMem) GlobalFree((hMem))

#define CHECKFORLEAKS()


_Success_(return == TRUE)
BOOL
GetDeviceProperty(
_In_ HDEVINFO DeviceInfoSet,
_In_ PSP_DEVINFO_DATA DeviceInfoData,
_In_ DWORD Property,
_Outptr_ LPTSTR *ppBuffer
)
{
BOOL bResult;
DWORD requiredLength = 0;
DWORD lastError;

if(ppBuffer == NULL)
{
return FALSE;
}

*ppBuffer = NULL;

bResult = SetupDiGetDeviceRegistryProperty(DeviceInfoSet,
DeviceInfoData,
Property,
NULL,
NULL,
0,
&requiredLength);
lastError = GetLastError();

if((requiredLength == 0) || (bResult != FALSE && lastError != ERROR_INSUFFICIENT_BUFFER))
{
return FALSE;
}

*ppBuffer = ALLOC(requiredLength);

if(*ppBuffer == NULL)
{
return FALSE;
}

bResult = SetupDiGetDeviceRegistryProperty(DeviceInfoSet,
DeviceInfoData,
Property,
NULL,
(PBYTE)*ppBuffer,
requiredLength,
&requiredLength);
if(bResult == FALSE)
{
FREE(*ppBuffer);
*ppBuffer = NULL;
return FALSE;
}

return TRUE;
}

void
EnumerateAllDevices(
)
{
HDEVINFO deviceInfo = NULL;

// Getting all present devices
deviceInfo = SetupDiGetClassDevs(NULL,
NULL,
NULL,
(DIGCF_ALLCLASSES | DIGCF_PRESENT));

if(deviceInfo != INVALID_HANDLE_VALUE)
{
ULONG index;
DWORD error;

error = 0;
index = 0;

while(error != ERROR_NO_MORE_ITEMS)
{

BOOL success;
SP_DEVINFO_DATA infoData;
ZeroMemory(&infoData, sizeof(SP_DEVINFO_DATA));
PSTR DeviceDescName = NULL;
infoData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);

success = SetupDiEnumDeviceInfo(deviceInfo,
index,
&infoData);

index++;

if(success == FALSE)
{
error = GetLastError();

if(error != ERROR_NO_MORE_ITEMS)
{
//OOPS();
}
}
else
{
BOOL bResult;

bResult = GetDeviceProperty(deviceInfo,
&infoData,
SPDRP_DEVICEDESC,
&DeviceDescName);
if(bResult == FALSE)
{
//OOPS();
break;
}

printf("DeviceDescName = %s\n", DeviceDescName);
}
}
}
}

int _tmain(int argc, _TCHAR* argv[])
{
EnumerateAllDevices();
return 0;
}

从代码中可以看出,DeviceDescName 是 PSTR。出于某种原因,这非常适合一种项目类型 Windows 驱动程序应用程序。在这里,我看到完整的设备名称 DeviceDescName,例如“High Definition Audio Controller”。

相同的代码不适用于其他控制台应用程序。工具集 v120。在 DeviceDescName 中,我只看到第一个后面的“H”(来自“High Definition Audio Controller”)。可能是什么原因? (你可以试试这个)

最佳答案

这是因为驱动程序项目被编译为 UNICODE 并且 PSTR 指向一个 WCHAR * 而您的控制台应用程序没有被编译为 UNICODEPSTR 呈现为 CHAR *

您可以尝试通过调整设置将您的控制台应用程序编译为 UNICODE,但这可能会导致问题,除非您的代码经过仔细编写并使用了正确的类型 - 听起来好像没有。

另一种方法是对此代码(以及其他类似实例)使用 PWSTR,它始终是一个宽字符串。

关于c - 为什么 PSTR 类型在不同的 visual studio 项目类型上有不同的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32072782/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com