2011-04-29 94 views
0

我有点卡在这个API GetDriveType()。每次这个API返回我DRIVE_NO_ROOT_DIR,我传递像这样的“C:\”等驱动器字母即使对于我的主驱动器“C:\”该API返回相同的东西。卡住api getdrivetype

我在此之前调用GetLogicalDrives()来检索。

OS: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; } 
+0

我们如何在没有您的代码的情况下提供帮助?你需要发布它,所以我们可以看到你正在尝试的是什么;那么我们可以帮助弄清楚它有什么问题。另外,没有OS“Win sp3”;我们能猜到你的意思是“WinXP SP3”吗? – 2011-04-29 11:23:06

+0

是的,操作系统是WinXp sp3。 – user1835004 2011-05-02 05:17:36

+0

你需要格式化你的代码。在SO编辑器中,用鼠标选择所有代码,然后按编辑器上方的“{}”按钮。 – 2011-05-02 09:59:49

回答

2

没有我们不得不猜测代码。我的猜测是:

  • 你未能逃脱\"C:\\"
  • 您正在将ANSI字符串传递给API的Unicode版本,反之亦然。

很难看到API如何失败,除非它是这种性质的编码错误。


在您的问题中添加了代码后,现在可以清楚地看到第二个项目符号是解释。您正在将ANSI字符串数据传递给Unicode API,这当然会失败。

要解决这个问题,您可能最好将所有代码切换为使用Unicode字符串。

除了Unicode/ANSI问题,我认为缓冲区处理代码是可疑的。我不知道你为什么假设4个字符的驱动器。我认为GetLogicalDriveStrings有可能返回未映射的驱动器。

+0

+ 1出于同样的原因,我在我的评论中提到@unaperson,David。良好的心理调试。 – 2011-04-29 20:58:36

+0

这是代码: – user1835004 2011-05-02 05:18:25

+0

我已经发布了代码和我的问题。 – user1835004 2011-05-02 11:36:48

1

你应该通过驱动器的根目录下,所以这将是:

GetDriveType("C:\\"); 

注意双backslash-的backlslash是C和C++字符串字面一个特殊的“逃逸”的性格,必须自己逃脱。与thier类型数值

#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 ; 
    } 
} 

下面的代码为我返回3,这意味着固定的驱动

生产:

C:\ type is 3 
D:\ type is 5 
E:\ type is 5 
F:\ type is 2 
Q:\ type is 3 
+0

好的。我错过了文中的单个'\';希望如果OP发布代码,我会发现它。 +1。 – 2011-04-29 20:57:59

+0

我使用了代码unapersson posted.But相同的结果。这里是代码 – user1835004 2011-05-02 05:43:32

+0

@ glc049你的意思是你编译了我发布的EXACT代码,没有任何变化,它没有打印3? – 2011-05-02 08:39:05