Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > GetVolumeNameForVolumeMountPoint трабл


Автор: necroo 21.5.2012, 16:34
народ , в мсдн есть код для монтирования дисков .. но в проге под винапи чёт не робит
Код

    case IDC_BUTTON1:
            {
                char zsd[3];
                for(int i=0;i<3;i++)zsd[i]=szd[i];
        TCHAR Buf[BUFSIZE];
        BOOL bFlag;
        bFlag = GetVolumeNameForVolumeMountPoint(LPCSTR(zsd),"E:\\",BUFSIZE);
        bFlag = SetVolumeMountPoint(LPCSTR(zsd),"E:\\");
            } break;

в мсдн пишут , что бфлаг если успех  >0  , но у меня выводит значение 0 .. и что не перепробывал  smile 
не помогает .. помогите плз

zsd=C:/
перешла из комбо бокса в котором 
szd=C:/./ - тоесть корневой каталог 
 smile  smile 

Автор: feodorv 21.5.2012, 16:41
Цитата(necroo @  21.5.2012,  17:34 Найти цитируемый пост)
                char zsd[3];
                for(int i=0;i<3;i++)zsd[i]=szd[i];

Тут как-то не то со строкой. Строка должна заканчиваться символом '\0':
Код

                char zsd[4];
                for(int i=0;i<3;i++) zsd[i]=szd[i];
                zsd[3] = '\0';   


Добавлено через 4 минуты и 43 секунды
Цитата(necroo @  21.5.2012,  17:34 Найти цитируемый пост)
GetVolumeNameForVolumeMountPoint(LPCSTR(zsd),"E:\\",BUFSIZE);

Жуть smile Второй параметр - указатель на буфер, а Вы функции подсовываете статическую строку, да ещё и утверждаете, что там есть место на BUFSIZE символов!!!

Добавлено через 5 минут и 31 секунду
Кроме того:
Цитата
If the function fails, the return value is zero. To get extended error information, call GetLastError.


Добавлено через 8 минут и 33 секунды
Цитата(necroo @  21.5.2012,  17:34 Найти цитируемый пост)
       bFlag = SetVolumeMountPoint(LPCSTR(zsd),"E:\\");

Ну и это не правильно (уж извините))). См. SetVolumeMountPoint доку smile 

Автор: necroo 21.5.2012, 17:16
ща я гляну .. этот код я прост переделывал .. замест Е:/ была переменная Buf которой присваивается значение куда монтировать .. ща поправлю..

Добавлено через 3 минуты и 51 секунду
fedorv
тип так ?
Код

case IDC_BUTTON1:
            {
                int test;
                 char zsd[4];
                for(int i=0;i<3;i++) zsd[i]=szd[i];
                zsd[3] = '\0';  
        TCHAR Buf[BUFSIZE];
        BOOL bFlag;
        bFlag = GetVolumeNameForVolumeMountPoint(LPCSTR(zsd),Buf,BUFSIZE);
        bFlag = SetVolumeMountPoint(LPCSTR(zsd),Buf);
        MessageBox (NULL, "Монтирование успешно", "Mount", MB_OK);
            } break;

Автор: feodorv 21.5.2012, 17:35
Цитата(necroo @  21.5.2012,  18:16 Найти цитируемый пост)
тип так ?

Типа того))) Тока я не понял, монтирование идёт себя в себя???
Цитата(necroo @  21.5.2012,  18:16 Найти цитируемый пост)
        bFlag = GetVolumeNameForVolumeMountPoint(LPCSTR(zsd),Buf,BUFSIZE);
        bFlag = SetVolumeMountPoint(LPCSTR(zsd),Buf);

Может, в "E:\\"? А то оно куда-то делось)))

Автор: necroo 21.5.2012, 18:25
тоесть над 
    bFlag = SetVolumeMountPoint(LPCSTR(<что монтировать?>),<куда монтировать?>,BUFSIZE);

Автор: feodorv 21.5.2012, 18:55
Цитата(necroo @  21.5.2012,  19:25 Найти цитируемый пост)
   bFlag = SetVolumeMountPoint(LPCSTR(<что монтировать?>),<куда монтировать?>,BUFSIZE);

Ну да, только BUFSIZE - третий лишний)))

И у Вас теряется значение bFlag, полученное от GetVolumeNameForVolumeMountPoint:
Код

        bFlag = GetVolumeNameForVolumeMountPoint(LPCSTR(zsd),Buf,BUFSIZE);
        if( bflag ) bFlag = SetVolumeMountPoint(LPCSTR(zsd),Buf);
        MessageBox (NULL, bflag ? "Монтирование успешно" : "Монтирование неуспешно", "Mount", MB_OK);

Автор: necroo 21.5.2012, 18:58
Неа .. пишет что неуспешно .. вот(
 
Код

    {
                 char zsd[4];
                for(int i=0;i<3;i++) zsd[i]=szd[i];
                zsd[3] = '\0';
        TCHAR Buf[BUFSIZE];
        BOOL bFlag;
         bFlag = GetVolumeNameForVolumeMountPoint(LPCSTR(zsd),Buf,BUFSIZE);
        if( bFlag ) bFlag = SetVolumeMountPoint(LPCSTR(zsd),Buf);
        MessageBox (NULL, bFlag ? "Монтирование успешно" : "Монтирование неуспешно", "Mount", MB_OK);
            } break;

нулевое значение получает бфлаг .. он вообще как смотрит если оба аргумента истина то 1 возвращает ?

Автор: feodorv 21.5.2012, 19:09
Цитата(necroo @  21.5.2012,  19:58 Найти цитируемый пост)
нулевое значение получает бфлаг .. он вообще как смотрит если оба аргумента истина то 1 возвращает ?

Ага)))

Итого:
Цитата(feodorv @  21.5.2012,  18:35 Найти цитируемый пост)
Тока я не понял, монтирование идёт себя в себя???

Цитата(feodorv @  21.5.2012,  17:41 Найти цитируемый пост)
To get extended error information, call GetLastError.


Автор: necroo 21.5.2012, 19:17
Цитата

Тока я не понял, монтирование идёт себя в себя???

нет .. идёт из комбо бокса , там диск "что монтировать" задаётся ... а монтируется в директорию F:\ допустим ... 

прост раньше с этим дел не имел...
Цитата

To get extended error information, call GetLastError.

эт та же самая беда)

Добавлено через 2 минуты и 42 секунды
вот смотрите комбо бокс
 
Код

case ID_COMBO:
            if(CodeNotify == CBN_SELCHANGE)
            {
                // индекс обновляется раньше, чем текст в ComboBox
                Index = ComboBox_GetCurSel(hWndCtrl);
                n = ComboBox_GetLBTextLen(hWndCtrl, Index)+1;
                pszVolume = new char[n];    // buffer overflow protection
                //SendMessage(hWndCtrl, CB_GETLBTEXT,(WPARAM)Index,(LPARAM)pszVolume);
                ComboBox_GetLBText(hWndCtrl, Index, pszVolume);
            wsprintf(szd,"%s",pszVolume);
            wsprintf(qqq,"(%d) \n",szFile);
            szd[2]='/';
            strcat(szd,"./*");
            WIN32_FIND_DATA fd;
            HANDLE hFile = FindFirstFile(szd,&fd);
            if (hFile != INVALID_HANDLE_VALUE)
            SendDlgItemMessage(hWnd,ID_LIST,LB_ADDSTRING,0,(LPARAM)fd.cFileName);
            SendDlgItemMessage(hWnd,ID_LIST,LB_RESETCONTENT,0,(LPARAM)fd.cFileName);
            SendDlgItemMessage(hWnd,ID_LIST,LB_ADDSTRING,0,(LPARAM)qqq);
            SendDlgItemMessage(hWnd,ID_LIST,LB_RESETCONTENT,0,(LPARAM)qqq);
    while(FindNextFile(hFile,&fd))
    {
        szFile=fd.nFileSizeLow;
        wsprintf(qqq,"%d",szFile);
        if (szFile==0)
        {
            strcat(fd.cFileName," (");
            strcat(fd.cFileName," Каталог )");
        }
            else
            {
        strcat(fd.cFileName," (");
        strcat(qqq," байт)");
        strcat(fd.cFileName,qqq);
            }    
        SendDlgItemMessage(hWnd,ID_LIST,LB_ADDSTRING,0,(LPARAM)fd.cFileName);
    }                FillInfo(hWnd,pszVolume);
                delete []pszVolume;
            } break;
        case IDC_BUTTON1:
            {
                 char zsd[4];
                for(int i=0;i<3;i++) zsd[i]=szd[i];
                zsd[3] = '\0';
        TCHAR Buf[BUFSIZE];
        BOOL bFlag;
        bFlag = GetVolumeNameForVolumeMountPoint(LPCSTR(zsd),Buf,BUFSIZE);
        if( bFlag )
        {
            bFlag = SetVolumeMountPoint(LPCSTR(zsd),"F:\\mnt\\");
        }
            MessageBox (NULL, bFlag ? "Монтирование успешно" : "Монтирование неуспешно", "Mount", MB_OK);
            } break;

и потом уже идёт монтирование ... ну а каталог можно задать

Автор: feodorv 21.5.2012, 19:36
Цитата(necroo @  21.5.2012,  20:17 Найти цитируемый пост)
вот смотрите комбо бокс

Ой, мне кажется, нужно сначала с монтированием разобраться, а уже потом с комбобоксом)))

Если создать пустую директорию c:\1\, то в неё можно замонтировать c:\
Код

#include <windows.h>
#include <stdio.h>

#define BUFSIZE 512

BOOL mount( const char *what, const char *to)
{
  char Buf[BUFSIZE];
  BOOL bFlag;

  bFlag = GetVolumeNameForVolumeMountPoint( what, Buf, BUFSIZE);
  if( !bFlag )
    printf( "Error of GetVolumeNameForVolumeMountPoint, error code %u\n", GetLastError());
  else
  {
    printf( "Name of %s is %s\n", what, Buf);
    bFlag = SetVolumeMountPoint( to, Buf);
    if( !bFlag )
      printf( "Error of SetVolumeMountPoint, error code %u\n", GetLastError());
  }
  MessageBox (NULL, bFlag ? "Монтирование успешно" : "Монтирование неуспешно", "Mount", MB_OK);

  return bFlag;
}

int main( void )
{
  return !mount( "c:\\", "c:\\1\\");
}


В чисто в драйвы монтировать не доводилось  smile

Добавлено через 2 минуты и 28 секунд
Цитата(feodorv @  21.5.2012,  20:36 Найти цитируемый пост)
В чисто в драйвы монтировать не доводилось 

Впрочем:
Цитата

Your application can designate any directory on a volume other than the root as a volume mount point. Instead of making the root directory a volume mount point, your application should create a subdirectory and make that a volume mount point. 

Автор: necroo 21.5.2012, 19:50
чёт странно ... очень даже ... в каком VS компилили?

Автор: feodorv 21.5.2012, 19:55
Цитата(necroo @  21.5.2012,  20:50 Найти цитируемый пост)
чёт странно ... очень даже ...

Что именно?

Цитата(necroo @  21.5.2012,  20:50 Найти цитируемый пост)
в каком VS компилили? 

Эээ, в 6-ом. Другого под рукой нет)))

Makefile:
Код

# Microsoft Developer Studio NMAKE File
!IF "$(CFG)" == "Debug"
!MESSAGE Making debug release!
!ENDIF

!include <ntwin32.mak>

!IF "$(OS)" == "Windows_NT"
NULL=
!ELSE
NULL=nul
!ENDIF

OBJS= aea.obj

CFLAGS= $(cflags) $(cvarsmt) /I.

all: aea.exe

.c.obj:
    $(cc) $(CFLAGS) $<

resource.res: resource.rc
    $(rc) $(rcflags) $(rcvars) resource.rc

aea.exe: $(OBJS)
    $(link) $(lflags) /NODEFAULTLIB:LIBC /out:aea.exe $(OBJS) $(winlibs)

clean:
    -del *.obj
    -del aea.exe

Автор: necroo 21.5.2012, 20:04
прост пытаюсь у себя скомпилить в 5-м .. 
Код

#define _WIN32_WINNT 0x0501
#include <windows.h>
#include <stdio.h>
#define BUFSIZE 512
BOOL mount( const char *what, const char *to)
{
  char Buf[BUFSIZE];
  BOOL bFlag;
  bFlag = GetVolumeNameForVolumeMountPoint(LPCWSTR (what), LPWSTR(Buf), BUFSIZE);
  if( !bFlag )
    printf( "Error of GetVolumeNameForVolumeMountPoint, error code %u\n", GetLastError());
  else
  {
    printf( "Name of %s is %s\n", what, Buf);
    bFlag = SetVolumeMountPoint( LPCWSTR(to),LPWSTR (Buf));
    if( !bFlag )
      printf( "Error of SetVolumeMountPoint, error code %u\n", GetLastError());
  }
  return bFlag;
}
int main( void )
{
  return !mount( "c:\\", "c:\\1\\");
}

выдавал ошибку в what 
Цитата

Error    1    error C2664: 'SetVolumeMountPointW' : cannot convert parameter 1 from 'const char *' to 'LPCWSTR'    c:\users\harry\documents\visual studio 2005\projects\авыыа\авыыа\ропр.cpp    15

а так не возвращает значение ..

feodorv, у вас имеется ICQ ?

Автор: feodorv 21.5.2012, 20:22
Цитата(necroo @  21.5.2012,  21:04 Найти цитируемый пост)
SetVolumeMountPointW

Да у Вас юникодный проект!!! (У меня - простой, неюникодный).
Надо это учесть: TCHAR (вместо char) и всё такое  smile

Добавлено через 12 минут и 56 секунд
Код

#define UNICODE
#include <windows.h>
#include <stdio.h>

#define BUFSIZE 512

BOOL mount( const TCHAR *what, const TCHAR *to)
{
  TCHAR Buf[BUFSIZE];
  BOOL bFlag;

  bFlag = GetVolumeNameForVolumeMountPoint( what, Buf, BUFSIZE);
  if( !bFlag )
    printf( "Error of GetVolumeNameForVolumeMountPoint, error code %u\n", GetLastError());
  else
  {
    printf( "Name of %S is %S\n", what, Buf);
    bFlag = SetVolumeMountPoint( to, Buf);
    if( !bFlag )
      printf( "Error of SetVolumeMountPoint, error code %u\n", GetLastError());
  }
  MessageBox (NULL, bFlag ? __TEXT("Монтирование успешно" ): __TEXT("Монтирование неуспешно"), __TEXT("Mount"), MB_OK);

  return bFlag;
}

int main( void )
{
  return !mount( __TEXT("d:\\"), __TEXT("d:\\1\\"));
}

Автор: necroo 21.5.2012, 20:37
всёравно ругается [code=cpp]
Код

#define _WIN32_WINNT 0x0501
#define UNICODE
#include <windows.h>
#include <stdio.h>
#define BUFSIZE 512
BOOL mount( const TCHAR *what, const TCHAR *to)
{
  TCHAR Buf[BUFSIZE];
  BOOL bFlag;
  bFlag = GetVolumeNameForVolumeMountPoint( what, Buf, BUFSIZE);
  if( !bFlag )
    printf( "Error of GetVolumeNameForVolumeMountPoint, error code %u\n", GetLastError());
  else
  {
    printf( "Name of %S is %S\n", what, Buf);
    bFlag = SetVolumeMountPoint( to, Buf);
    if( !bFlag )
      printf( "Error of SetVolumeMountPoint, error code %u\n", GetLastError());
  }
  MessageBox (NULL, bFlag ? __TEXT("Монтирование успешно" ): __TEXT("Монтирование неуспешно"), __TEXT("Mount"), MB_OK);
  return bFlag;
}
int main( void )
{
  return !mount( __TEXT("d:\\"), __TEXT("d:\\1\\"));
}

пишет параметр задан неверно 
error code 87 ..
у вас всё работает нормально?

Автор: feodorv 21.5.2012, 20:37
Цитата(necroo @  21.5.2012,  21:04 Найти цитируемый пост)
feodorv, у вас имеется ICQ ? 

Нэту  smile

Добавлено через 3 минуты и 3 секунды
Цитата(necroo @  21.5.2012,  21:37 Найти цитируемый пост)
всёравно ругается 


Цитата(necroo @  21.5.2012,  21:37 Найти цитируемый пост)
BOOL mount( TCHAR what, TCHAR to)

Как это? Куда указатели делись?

Цитата(necroo @  21.5.2012,  21:37 Найти цитируемый пост)
LPCWSTR(what)

Давайте этого не делать, а то Вы не видите существа проблемы  smile 

Цитата(necroo @  21.5.2012,  21:37 Найти цитируемый пост)
  mount( "c:\\", "c:\\1\\");

Где __TEXT(...)???

Автор: necroo 21.5.2012, 20:47
просто значение у bFlag=-858993460 а с этим наверн непорядок

Автор: feodorv 21.5.2012, 20:50
Цитата(necroo @  21.5.2012,  21:47 Найти цитируемый пост)
просто значение у bFlag=-858993460 а с этим наверн непорядок 

Смотря, как выводите...

Там я драйв d: подсунул, у Вас такой есть?
У Вас все драйвы в NTFS отформатированы?

Добавлено @ 20:51
Цитата(necroo @  21.5.2012,  21:37 Найти цитируемый пост)
у вас всё работает нормально?

Да, правда у меня win XP.

Автор: necroo 21.5.2012, 20:53
у меня win7 ... системные диски C: D: в нтфс а сьёмный в фат32

Автор: feodorv 21.5.2012, 21:01
Цитата(necroo @  21.5.2012,  21:53 Найти цитируемый пост)
системные диски C: D: в нтфс

Супер. А Вы директорию c:\1\ или d:\1\ создали (руками)?

Автор: necroo 21.5.2012, 21:02
нет) сейчас попробую
теперь ошибка 
Цитата

ERROR_ACCESS_DENIED
5 (0x5)
Отказано в доступе.

жесть)

Добавлено через 2 минуты и 7 секунд
попробую ща с д диском сделать .. т.к. доступ только для администратора ...
Цитата

грёбаный windows 7

Автор: feodorv 21.5.2012, 21:06
Цитата(necroo @  21.5.2012,  22:02 Найти цитируемый пост)
доступ только для администратора ...

В общем, да. И я под администратором всё делал...

Автор: necroo 21.5.2012, 21:10
теперь дело за малым) работает ... сейчас буду запихивать в свою программу)

Автор: feodorv 21.5.2012, 21:39
Цитата(necroo @  21.5.2012,  22:10 Найти цитируемый пост)
работает ... 

Мои поздравления! smile 
Не забывайте про юникод  smile 

Автор: necroo 21.5.2012, 22:07
спасибо) но на этом думаю помощь не ограничивается  smile уж понимаю что вопрос не такой сурьёзный)

Автор: necroo 21.5.2012, 22:27
feodorv
а как переделать C:// в C:\\ блин ....  smile  smile 

Автор: feodorv 22.5.2012, 09:30
Цитата(necroo @  21.5.2012,  23:27 Найти цитируемый пост)
а как переделать C:// в C:\\ блин .... 

В смысле:
Код

if( zsd[2] == __TEXT('/') ) zsd[2] = __TEXT('\\');

???

Автор: necroo 22.5.2012, 17:57
фууууууххх !!!! спс за помощь запилил в прогу работает) дело теперь за малым) вощем мне бы 
переменной "to" задать значение сменное какоенить ... тоесть там комбобокс или тип того .. но и создать директорию )
Код

case IDC_BUTTON1:
            {
                BOOL mount; 
                {
                    char zsd[4];
                    for(int i=0;i<3;i++) zsd[i]=szd[i];
                    zsd[3] = '\0';
                    TCHAR Buf[BUFSIZE];
                    BOOL bFlag;
                    if( zsd[2] == __TEXT('/') ) zsd[2] = __TEXT('\\');
                    what=zsd;
                    bFlag = GetVolumeNameForVolumeMountPoint( what, Buf, BUFSIZE);
                    to="c:\\1\\";
                    bFlag = SetVolumeMountPoint( to, Buf);
                    MessageBox (NULL, bFlag ? __TEXT("Монтирование успешно" ): __TEXT("Монтирование неуспешно"), __TEXT("Mount"), MB_OK);
                }
            } break;

работает ае)

Автор: feodorv 22.5.2012, 18:26
Цитата(necroo @  22.5.2012,  18:57 Найти цитируемый пост)
работает) 

Странно. Юникод кое-где проигнорирован:
Цитата(necroo @  22.5.2012,  18:57 Найти цитируемый пост)
case IDC_BUTTON1:
            {
                BOOL mount; 
                {
                    charTCHAR zsd[4];
                    for(int i=0;i<3;i++) zsd[i]=szd[i];
                    zsd[3] = __TEXT('\0');
                    TCHAR Buf[BUFSIZE];
                    BOOL bFlag;
                    if( zsd[2] == __TEXT('/') ) zsd[2] = __TEXT('\\');
                    what=zsd;
                    bFlag = GetVolumeNameForVolumeMountPoint( what, Buf, BUFSIZE);
                    to=__TEXT("c:\\1\\");
                    bFlag = SetVolumeMountPoint( to, Buf);
                    MessageBox (NULL, bFlag ? __TEXT("Монтирование успешно" ): __TEXT("Монтирование неуспешно"), __TEXT("Mount"), MB_OK);
                }
            } break;

szd и what тоже должны быть типа TCHAR. Или Вы отказались от юникода? smile

Добавлено через 2 минуты и 16 секунд
Цитата(necroo @  22.5.2012,  18:57 Найти цитируемый пост)
но и создать директорию )

А если директория уже существует, то нужно проверить, что она пуста. Иначе монтирование не состоится...

Автор: necroo 22.5.2012, 23:01
директорию через CreateDirectory ?

Автор: feodorv 22.5.2012, 23:56
Цитата(necroo @  23.5.2012,  00:01 Найти цитируемый пост)
директорию через CreateDirectory ? 

Создать, да, но только если директория уровнем повыше существует. А если нет - то и её тоже:
Код

BOOL myCreateDirectory( const char *dirName )
{
  char *dir, *ptr, cc;
  int len = lstrlen( dirName ), i;
  BOOL success = TRUE;
  DWORD attrs, errorCode;

  SetLastError( 0 );
  if( (dir = (char *) HeapAlloc( GetProcessHeap(), 0, len+1)) == NULL )
    return FALSE;
  CopyMemory( dir, dirName, len+1);

  ptr = dir;
  if( ptr[0] == '\0' || ((ptr[0] == '\\' || ptr[0] == '/') && ptr[1] == '\0') )
  {
    HeapFree( GetProcessHeap(), 0, dir);
    return TRUE;
  }

  if( ptr[0] == '/' ) ptr[0] = '\\';
  if( ptr[0] == '\\' ) ptr++;

  for( ;; )
  {
    while( *ptr != '\0' && *ptr != '\\' && *ptr != '/' ) ptr++;
    if( *ptr == '/' ) *ptr = '\\';
    cc = *ptr;
    *ptr = '\0';

    if( (attrs = GetFileAttributes( dir )) == INVALID_FILE_ATTRIBUTES )
    {
      if( GetLastError() != ERROR_FILE_NOT_FOUND ) success = FALSE;
      if( success && !CreateDirectory( dir, NULL) ) success = FALSE;
    }
    else if( (attrs & FILE_ATTRIBUTE_DIRECTORY) == 0 )
    {
      SetLastError( ERROR_FILE_EXISTS );
      success = FALSE;
    }

    if( !success || cc == '\0' ) break;
    *ptr ++ = cc;
    if( *ptr == '\0' ) break;
  }

  errorCode = GetLastError();
  HeapFree( GetProcessHeap(), 0, dir);
  SetLastError( errorCode );

  return success;
}


Добавлено через 1 минуту и 3 секунды
Приведён код без учёта юникода.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)