2

私のコンピューターの例では、望ましい出力は "C: E: F: H: N:" です。それが可能であることは知っていますが、それを行う最も簡単な方法は何ですか? QueryDosDevice 出力のポタリング

#ifndef UNICODE
#define UNICODE
#endif


#include <Windows.h>
#include <fstream>
#include <iostream>

const int REPORT_LENGTH = 5000;

int main(void)
{
    TCHAR targetPath[REPORT_LENGTH];

    std::ofstream oFile;

    oFile.open("dos device query.txt");

    QueryDosDevice(NULL,targetPath,REPORT_LENGTH);

    for(int i=0; i<REPORT_LENGTH;i++)
    if (targetPath[i]=='\0')(targetPath[i]='\n');



    for(int i=0; i<REPORT_LENGTH; i++)
    oFile<<static_cast<char>(targetPath[i]);

    oFile.close();

    return 0;
}

時間とリソースの膨大な無駄になります。また、関数GetLogicalDriveStringsは私を大いに裏切りました。

#include <Windows.h>

int main()
{
    TCHAR buffer[50];

    GetLogicalDriveStrings(50,buffer);

    MessageBox(0,buffer,"Drives in the system",MB_OK); 


    return 0;
}

「C:\」ボリュームのみが表示されます。

4

2 に答える 2

4

文字列への連結ではありませんが、の例GetLogicalDrives(OPと読者への演習として残されています;)):

#include <stdio.h>
#include <tchar.h>
#include <Windows.h>

int __cdecl _tmain(int argc, _TCHAR *argv[])
{
    // Get the bit mask of drive letters
    DWORD drives = ::GetLogicalDrives();
    // Go through all possible letters from a to z
    for(int i = 0; i < 26; i++)
    {
        // Check if the respective bit is set
        if(drives & (1 << i))
        {
            // ... and if so, print it
            _tprintf(TEXT("Drive %c: exists\n"), _T('A') + i);
        }
    }
    return 0;
}
于 2012-05-22T22:20:28.097 に答える
3

GetLogicalDriveStrings()が進むべき道です。正しく使用する必要があります。すべてのドライブ文字列を含む単一の文字列を返すと想定していますが、そうではありません。ドライブごとに 1 つの文字列の配列を返すため、代わりに配列をループする必要があります。

#include <windows.h> 

int main() 
{ 
    TCHAR buffer[(4*26)+1] = {0}; 
    GetLogicalDriveStrings(sizeof(buffer) / sizeof(TCHAR), buffer); 

    for (LPTSTR lpDrive = buffer; *lpDrive != 0; lpDrive += 4)
        MessageBox(NULL, lpDrive, "Drive in the system", MB_OK);

    return 0; 
} 
于 2012-05-23T01:17:40.757 に答える