当我执行我的代码时,我收到此错误
LPTSTR lpBuffer;
::GetLogicalDriveStrings(1024,lpBuffer);
while(*lpBuffer != NULL)
{
printf("%s\n", lpBuffer); // or MessageBox(NULL, temp, "Test", 0); or whatever
lpBuffer += lstrlen(lpBuffer)+1;
printf("sizeof(lpBuffer) %d\n",lstrlen(lpBuffer));
}
输出
C
sizeof(lpBuffer)3
d
sizeof(lpBuffer)3
电子
sizeof(lpBuffer)3
˚F
sizeof(lpBuffer)0
答案 0 :(得分:0)
lpBuffer指向随机内存。你需要这样的东西:
LPTSTR lpBuffer = new TCHAR[1025];
编辑:将数组大小更正为1025而不是1024,因为length参数是1024.此API需要仔细阅读。
答案 1 :(得分:0)
您应该传递将复制字符串的内存地址。但是,您没有为保留字符分配任何空间。您需要在将空间传递给GetLogicalDriveStrings
函数之前分配空间。您可以在@Windows程序员提供的情况下在堆上分配内存,或者如果在编译时知道字符串的最大长度,您可以使用TCHAR lpBuffer[1024];
在堆栈上分配它。另外,您使用printf
来打印unicode(可能因为它取决于编译器标志)。这不起作用,只打印第一个字符。
答案 2 :(得分:0)
你需要实际传入缓冲区 - 请注意,传入的缓冲区大小需要比缓冲区的实际大小小一个,以便考虑最终终止'\ 0'字符(我不知道)为什么API的设计是这样的。)
以下是您示例的略微修改版本:
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
enum {
BUFSIZE = 1024
};
int _tmain (int argc, TCHAR *argv[])
{
TCHAR szTemp[BUFSIZE];
LPTSTR lpBuffer = szTemp; // point lpBuffer to the buffer we've allocated
szTemp[0] = _T( '\0'); // I'm not sure if this is necessary, but it was
// in the example given for GetLogicalDriveStrings()
GetLogicalDriveStrings( BUFSIZE-1, lpBuffer); // note: BUFSIZE minus 1
while(*lpBuffer != _T('\0'))
{
_tprintf( _T("%s\n"), lpBuffer);
lpBuffer += lstrlen(lpBuffer)+1;
_tprintf( _T("length of lpBuffer: %d\n"),lstrlen(lpBuffer));
}
return 0;
}