散分,在线等待,解决ERROR_INSUFFICIENT_BUFFER返回缓冲区长度与中文字符串冲突问题(200分)

1

142857

Unregistered / Unconfirmed
GUEST, unregistred user!
请看以下代码,代码功能:返回设备的信息,当我拷贝此代码在BCB中运行时,发现程序总在 if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)的代码体中循环,程序陷入,单步跟踪发现只要是英文信息,可以正确执行下去,但是到有中文信息
则不能正确返回,我在
附:buffer 查看值列表:
1。Programmable interrupt controller
2。System timer
3 。Standard 101/102-Key or Microsoft Natural PS/2 Keyboard
4。打印机????铪
程序陷入死循环,此时buffersize返回值为6
因为我使用DELPHI的,项目紧急才让我使用BCB编程,对于其中的LPTR,LocalAlloc
对于C语言只知道皮毛,敢请各位帮帮手,如何解决buffer能够正确返回带有中文信息的字符串?
DWORD DataT;
LPTSTR buffer = NULL;
DWORD buffersize = 0;
buffer =NULL;
buffersize=0;
while (!SetupDiGetDeviceRegistryProperty(
hDevInfo,
&DeviceInfoData,
SPDRP_LOCATION_INFORMATION,
&DataT,
(PBYTE)buffer,
buffersize,
&buffersize))
{
if (GetLastError() ==
ERROR_INSUFFICIENT_BUFFER)
{
// Change the buffer size.
if (buffer) LocalFree(buffer);
buffer = (char*)LocalAlloc(LPTR,buffersize);
//总是跳转不出来,这是为什么呢?在后面加入break ,也不行
}
else
{
// Insert error handling here.
break;
}
}
printf("SPDRP_LOCATION_INFORMATION:[%s]/n",buffer);

源代码:
//HOWTO: Enumerate Hardware Devices by Using SetupDi Calls Q259695
#include <stdio.h>
#include <windows.h>
#include <setupapi.h>
#include <devguid.h>
#include <regstr.h>
#pragma comment(lib,"Setupapi.lib")
void printdata(LPVOID pdata,DWORD datalen,DWORD type);
int main( int argc, char *argv[ ], char *envp[ ] )
{
HDEVINFO hDevInfo;
SP_DEVINFO_DATA DeviceInfoData;
DWORD i;
// Create a HDEVINFO with all present devices.
hDevInfo = SetupDiGetClassDevs(NULL,
0, // Enumerator
0,
DIGCF_PRESENT | DIGCF_ALLCLASSES );

if (hDevInfo == INVALID_HANDLE_VALUE)
{
// Insert error handling here.
return 1;
}

// Enumerate through all devices in Set.

DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
for (i=0;SetupDiEnumDeviceInfo(hDevInfo,i,
&amp;DeviceInfoData);i++)
{
DWORD DataT;
LPTSTR buffer = NULL;
DWORD buffersize = 0;

//
// Call function with null to begin
with,
// then
use the returned buffer size
// to Alloc the buffer. Keep calling until
// success or an unknown failure.
//
while (!SetupDiGetDeviceRegistryProperty(
hDevInfo,
&amp;DeviceInfoData,
SPDRP_DEVICEDESC,
&amp;DataT,
(PBYTE)buffer,
buffersize,
&amp;buffersize))
{
if (GetLastError() ==
ERROR_INSUFFICIENT_BUFFER)
{
// Change the buffer size.
if (buffer) LocalFree(buffer);
buffer = (char*)LocalAlloc(LPTR,buffersize);
}
else
{
// Insert error handling here.
break;
}
}
printf("SPDRP_DEVICEDESC:[%s]/n",buffer);
if (buffer) LocalFree(buffer);
buffer =NULL;
buffersize=0;
while (!SetupDiGetDeviceRegistryProperty(
hDevInfo,
&amp;DeviceInfoData,
SPDRP_LOCATION_INFORMATION,
&amp;DataT,
(PBYTE)buffer,
buffersize,
&amp;buffersize))
{
if (GetLastError() ==
ERROR_INSUFFICIENT_BUFFER)
{
// Change the buffer size.
if (buffer) LocalFree(buffer);
buffer = (char*)LocalAlloc(LPTR,buffersize);
}
else
{
// Insert error handling here.
break;
}
}
printf("SPDRP_LOCATION_INFORMATION:[%s]/n",buffer);

if (buffer) LocalFree(buffer);
buffer =NULL;
buffersize=0;
while (!SetupDiGetDeviceRegistryProperty(
hDevInfo,
&amp;DeviceInfoData,
SPDRP_ADDRESS,
&amp;DataT,
(PBYTE)buffer,
buffersize,
&amp;buffersize))
{
if (GetLastError() ==
ERROR_INSUFFICIENT_BUFFER)
{
// Change the buffer size.
if (buffer) LocalFree(buffer);
buffer = (char*)LocalAlloc(LPTR,buffersize);
}
else
{
// Insert error handling here.
break;
}
}
printf("Length:%d,SPDRP_ADDRESS:",buffersize);

printdata(buffer,buffersize,DataT);
printf("/n");
if (buffer) LocalFree(buffer);
}


if ( GetLastError()!=NO_ERROR &amp;&amp;
GetLastError()!=ERROR_NO_MORE_ITEMS )
{
// Insert error handling here.
return 1;
}

// Cleanup
SetupDiDestroyDeviceInfoList(hDevInfo);

return 0;
}
void printdata(LPVOID pdata,DWORD datalen,DWORD type)
{
if(datalen<=0)
return;
switch(type)
{
case REG_DWORD:
{
PDWORD np=(PDWORD)pdata;
printf("REG_DWORD:%d",np[0]);
}
break;
case REG_SZ:
printf("REG_SZ:%d",(LPCTSTR)pdata);
break;
default:
printf("other format");
break;
}
}
//HOWTO: Force Reenumeration of a Device Tree From an Application Q259697


 
顶部