Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> GetVolumeNameForVolumeMountPoint трабл, Проблемка с вложением 
:(
    Опции темы
necroo
Дата 21.5.2012, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 10.5.2012

Репутация: нет
Всего: нет



народ , в мсдн есть код для монтирования дисков .. но в проге под винапи чёт не робит
Код

    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 
PM MAIL   Вверх
feodorv
Дата 21.5.2012, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



Цитата(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 


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
necroo
Дата 21.5.2012, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 10.5.2012

Репутация: нет
Всего: нет



ща я гляну .. этот код я прост переделывал .. замест Е:/ была переменная 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;

PM MAIL   Вверх
feodorv
Дата 21.5.2012, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



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

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

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

Это сообщение отредактировал(а) feodorv - 21.5.2012, 17:36


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
necroo
Дата 21.5.2012, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 10.5.2012

Репутация: нет
Всего: нет



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

Это сообщение отредактировал(а) necroo - 21.5.2012, 18:32
PM MAIL   Вверх
feodorv
Дата 21.5.2012, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



Цитата(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);



--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
necroo
Дата 21.5.2012, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 10.5.2012

Репутация: нет
Всего: нет



Неа .. пишет что неуспешно .. вот(
 
Код

    {
                 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 возвращает ?

Это сообщение отредактировал(а) necroo - 21.5.2012, 18:58
PM MAIL   Вверх
feodorv
Дата 21.5.2012, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



Цитата(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.




--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
necroo
Дата 21.5.2012, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 10.5.2012

Репутация: нет
Всего: нет



Цитата

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

нет .. идёт из комбо бокса , там диск "что монтировать" задаётся ... а монтируется в директорию 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;

и потом уже идёт монтирование ... ну а каталог можно задать
PM MAIL   Вверх
feodorv
Дата 21.5.2012, 19:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



Цитата(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. 



--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
necroo
Дата 21.5.2012, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 10.5.2012

Репутация: нет
Всего: нет



чёт странно ... очень даже ... в каком VS компилили?
PM MAIL   Вверх
feodorv
Дата 21.5.2012, 19:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



Цитата(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



--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
necroo
Дата 21.5.2012, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 10.5.2012

Репутация: нет
Всего: нет



прост пытаюсь у себя скомпилить в 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 ?
PM MAIL   Вверх
feodorv
Дата 21.5.2012, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



Цитата(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\\"));
}



--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
necroo
Дата 21.5.2012, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 10.5.2012

Репутация: нет
Всего: нет



всёравно ругается [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 ..
у вас всё работает нормально?

Это сообщение отредактировал(а) necroo - 21.5.2012, 20:42
PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0615 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.