GetLogicalDriveStrings () и char — Где я делаю неправильно

Я хочу найти файл, который может присутствовать на любых дисках, таких как C: \, D: \ и т. Д. Использование GetLogicalDriveStrings Я могу получить список дисков, но когда я добавляю что-то еще для вывода, я получаю null в строке вывода. Вот мой код:

#include "StdAfx.h"#include <windows.h>
#include <stdio.h>
#include <conio.h>

// Buffer length
DWORD mydrives = 100;
// Buffer for drive string storage
char lpBuffer[100];
const char *extFile = "text.ext";

// You may want to try the wmain() version
int main(void)
{
DWORD test;
int i;
test = GetLogicalDriveStrings(mydrives, (LPWSTR)lpBuffer);
if(test != 0)
{
printf("GetLogicalDriveStrings() return value: %d, Error (if any): %d \n", test, GetLastError());
printf("The logical drives of this machine are:\n");
// Check up to 100 drives...
for(i = 0; i<100; i++)
printf("%c%s", lpBuffer[i],extFile);
printf("\n");
}
else
printf("GetLogicalDriveStrings() is failed lor!!! Error code: %d\n", GetLastError());
_getch();
return 0;
}

Я хочу выше вывод как C:\text.ext D:\text.ext ... скорее я получаю text.ext только. я использую Microsoft Visual C++ 2010 Express

3

Решение

GetLogicalDriveStrings() возвращает список с нулевым символом в конце Например, скажем, у вас есть диски A, B и C в вашей машине. Возвращенная строка будет выглядеть так:

A:\<nul>B:\<nul>C:\<nul><nul>

Вы можете использовать следующий код для перебора строк в возвращаемом буфере и печати каждой из них по очереди:

DWORD dwSize = MAX_PATH;
char szLogicalDrives[MAX_PATH] = {0};
DWORD dwResult = GetLogicalDriveStrings(dwSize,szLogicalDrives);

if (dwResult > 0 && dwResult <= MAX_PATH)
{
char* szSingleDrive = szLogicalDrives;
while(*szSingleDrive)
{
printf("Drive: %s\n", szSingleDrive);

// get the next drive
szSingleDrive += strlen(szSingleDrive) + 1;
}
}

Обратите внимание, что подробности о том, как работает функция, включая пример кода, который я беззастенчиво скопировал и вставил, можно найти по читая документы.

5

Другие решения

Вы хотели поместить printf в цикл?

В настоящее время вы устанавливаете extFile 100 раз (просто чтобы быть уверенным ?!)

   for(i = 0; i<100; i++)
extFile = "text.ext";

Вы хотели показать все буквы дисков в цикле:

   for(i = 0; i<100; i++)
{
extFile = "text.ext";
printf("%c%s", lpBuffer[i], extFile); //I guess you mean extFile here?
}
0

DWORD dwSize = MAX_PATH;
WCHAR szLogicalDrives[MAX_PATH] = { 0 };
DWORD dwResult = GetLogicalDriveStrings(dwSize, szLogicalDrives);

CStringArray m_Drives;
m_Drives.RemoveAll();

if (dwResult > 0 && dwResult <= MAX_PATH)
{
WCHAR* szSingleDrive = szLogicalDrives;
while (*szSingleDrive)
{
UINT nDriveType = GetDriveType(szSingleDrive);
m_Drives.Add(CString(szSingleDrive, 2));

// get the next drive
szSingleDrive += wcslen(szSingleDrive) + 1;
}
}
return m_Drives;
0

class DriveList {
protected:

LPTSTR m_driveList;
DWORD m_driveCount;
DWORD m_bufSize = 32 * sizeof(TCHAR);

public:

virtual ~DriveList() {
free(m_driveList);
}

DriveList() {
m_driveList = (LPTSTR)malloc(m_bufSize);
}

int getDriveCount() const {
return m_driveCount;
}

TCHAR operator[] (const int index) const {
return m_driveList[index];
}

void loadDriveList() {
DWORD mask;
if((mask = GetLogicalDrives()) == 0) {
throw;
}

m_driveCount = 0;
for(int x = 0; x <= 25; x++ ) {
if(mask & 1) {
m_driveList[m_driveCount] = TCHAR(65 + x);
m_driveCount += 1;
}
mask >>= 1;
}
}
};
0
По вопросам рекламы [email protected]