2011-04-29 89 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