我有点被这个GetDriveType()接口卡住了。每次这个api返回DRIVE_NO_ROOT_DIR时,我都会像这样传递驱动器号"c:\“等。即使对于我的主驱动器"c:\”,api也会返回相同的东西。
在此之前,我已经调用了GetLogicalDrives()进行检索。
操作系统: WinXP sp3,NTFS文件系统
代码:编译器VS2005
int main() {
bool folder;
String * filename;
char individualdrive[4],alldrives[100];
memset(alldrives,0,100);
GetLogicalDriveStringsA(100,alldrives);
for(int i=0;(i<100)&&(alldrives[i]);i+=4) {
memset(individualdrive,0,4);
strncpy(individualdrive,alldrives+i,4); //extracting individual drive strings.
if(DRIVE_FIXED == GetDriveTypeW((LPCWSTR)individualdrive))
getfile((System::String*)individualdrive, filename,folder); }
return 0; }发布于 2011-04-29 19:30:01
没有代码,我们只能猜测。我的猜测是:
当"C:\\".
\,反之亦然。除非是这种性质的编码错误,否则很难看出API怎么会失败。
在您的问题中添加了代码后,现在很明显,这些要点中的第二个是解释。您正在将ANSI字符串数据传递给Unicode API,这当然会失败。
要解决此问题,最好将所有代码切换为使用Unicode字符串。
除了Unicode/ANSI问题之外,我认为缓冲区处理代码也是可疑的。我不知道你为什么要假设一个驱动器是4个字符。我认为GetLogicalDriveStrings有可能返回未映射的驱动器。
发布于 2011-04-29 19:31:34
您应该传递驱动器的根目录,因此应该是:
GetDriveType( "C:\\" );注意双反斜杠-在C和C++字符串文字中,反斜杠是一个特殊的“转义”字符,它本身必须转义。
下面的代码为我返回3,这意味着固定驱动器:
#include <iostream>
#include <windows.h>
using namespace std;
int main() {
cout << GetDriveType( "C:\\" ) << endl;
}以下代码列出了我的系统上的所有驱动器,以及其类型的数值:
#include <windows.h>
#include <iostream>
using namespace std;
int main() {
const int BUFSIZE = 100;
char buffer[ BUFSIZE ];
DWORD n = GetLogicalDriveStrings( BUFSIZE, buffer );
DWORD i = 0;
while( i < n ) {
int t = GetDriveType( &buffer[i] );
cout << &buffer[i] << " type is " << t << endl;
i += strlen( &buffer[i] ) + 1 ;
}
}制作:
C:\ type is 3
D:\ type is 5
E:\ type is 5
F:\ type is 2
Q:\ type is 3https://stackoverflow.com/questions/5831320
复制相似问题