Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.12.2011, 01:54   #1
sVasilich
Форумчанин
 
Аватар для sVasilich
 
Регистрация: 16.12.2009
Сообщений: 224
По умолчанию Работа с CreateFile

(В продолжение темы http://programmersforum.ru/showthread.php?t=181233 . Думаю, что лучше создать новую, так как там вместо вопроса ересь)

в таком варианте в zf корректно записывается хендл файла.
Код:
HANDLE zf=CreateFile("c:\\test\\1_1.zip",GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
Подскажите, как правильно передать в CreateFile в качестве первого параметра значение типа CString?

Так:
Код:
for(CurPosition=CopyList.begin();CurPosition<CopyList.end();CurPosition++)
{
  HANDLE zf=CreateFile(*CurPosition,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
...
zf равно 0xffffffff

так:
Код:
for(CurPosition=CopyList.begin();CurPosition<CopyList.end();CurPosition++)
  {
     char*buf=new char[(*CurPosition).GetLength()];
     strcpy(buf,*CurPosition);
     HANDLE zf = CreateFile(buf, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
тоже самое.

Вот объявление CopyList:
Код:
std::vector<CString > CopyList;
Данные в CopyList попадают так (в данном случае, попадает только один элемент):
Код:
CopyList.push_back(BSDBInterface.GetValue("Copy","file_name","id_copy",this->csCopyID));
Вот код BSDBInterface.GetValue(), вдруг ещё здесь ошибка:
Код:
CString CDBInterface::GetValue(CString tablename, CString valuename, CString idname, CString idvalue)
{
  CString rezult="";
  char sql[100];
  sprintf(sql,"SELECT %s FROM %s WHERE %s=%s",valuename,tablename,idname,idvalue);
  if(Query(CRecordset::snapshot, sql, CRecordset::readOnly)) //выполняет запрос к БД
  {
     CDBVariant var;
     mBSRS.MoveFirst(); //mBSRS типа CRecordset
     mBSRS.GetFieldValue((short)0,var);
     char szBuf[100] = {0};
					
     short b = var.m_dwType;
     switch (b)
     {
        case 4:
           sprintf(szBuf,"%d",var.m_lVal);
           break;
        case 11:
           sprintf(szBuf,"%s\n",(CString)*var.m_pstringW); //записываем что нашли в буфер
           break;
     }
     rezult = *(new CString(szBuf)); //создаём новый CString
     CloseRS(); //закрываем CRecordset
   }
   return rezult; // и возвращаем
}
Да, если написать
Код:
for(CurPosition=CopyList.begin();CurPosition<CopyList.end();CurPosition++)
{
   CString tmp = "c:\\test\\1_1.zip";
   HANDLE zf=CreateFile(tmp,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
получается корректный хендл.
Люди бывают 10 типов: те, кто понимают двоичную систему счисления, и те, кто не понимают...
sVasilich вне форума Ответить с цитированием
Старый 27.12.2011, 15:03   #2
sVasilich
Форумчанин
 
Аватар для sVasilich
 
Регистрация: 16.12.2009
Сообщений: 224
По умолчанию

Вроде исправил.

В BSDBInterface.GetValue

вместо

Код:
...
    case 11:
           sprintf(szBuf,"%s\n",(CString)*var.m_pstringW); //записываем что нашли в буфер
           break;
     }
     rezult = *(new CString(szBuf)); //создаём новый CString
     CloseRS(); //закрываем CRecordset
   }
   return rezult; // и возвращаем
}
написал

Код:
 
     case 11:
        rezult=*var.m_pstringW;
        break;
     }
     CloseRS();
  }
  return rezult;
}
Люди бывают 10 типов: те, кто понимают двоичную систему счисления, и те, кто не понимают...
sVasilich вне форума Ответить с цитированием
Старый 27.12.2011, 17:53   #3
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Цитата:
Подскажите, как правильно передать в CreateFile в качестве первого параметра значение типа CString?
Может быть, (LPCTSTR)(*CurPosition)?
Somebody вне форума Ответить с цитированием
Старый 27.12.2011, 18:16   #4
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

не плохо было бы посмотреть, что говорит GetLastError и глянуть в отладчике, чему равен CurPosition (и что это такое вообще).
Кстати, в той теме вы уже писали как надо: (*CurPosition).GetBuffer();
counter вне форума Ответить с цитированием
Старый 27.12.2011, 20:42   #5
sVasilich
Форумчанин
 
Аватар для sVasilich
 
Регистрация: 16.12.2009
Сообщений: 224
По умолчанию

Спасибо, кто отозвался)

Да, надо было именно так: (*CurPosition).GetBuffer();

Я так сначала и пробовал, но ошибка была в функции BSDBInterface.GetValue(); (где формируется значение для CopyList). В отладчике *CurPosition (итератор для CopyList) показвал корректный путь к файлу. GetLastErrore глянуть не догадался

когда в BSDBInterface.GetValue(); заменил
Код:
case 11:
           sprintf(szBuf,"%s\n",(CString)*var.m_pstringW); //записываем что нашли в буфер
           break;
     }
     rezult = *(new CString(szBuf)); //создаём новый CString
     CloseRS(); //закрываем CRecordset
на

Код:
case 11:
        rezult=*var.m_pstringW;
        break;
     }
     CloseRS();
  }
  return rezult;
вс стало работать нормально, что меня вполне устраивает

Исправлено, правда, методом тыка, и почему так я не понял до сих пор. В общем, тонкости работы с указателями (и другие проблемы со знаниями в следствие разгильдяйства) буду постигать уже после сдачи диплома
Люди бывают 10 типов: те, кто понимают двоичную систему счисления, и те, кто не понимают...
sVasilich вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Про CreateFile chechestor Win Api 5 30.12.2010 11:59
Хук CreateFile x64 Alex217Vish Win Api 10 24.10.2010 15:26
CreateFile в Borland sneksnek2006 Win Api 3 14.10.2010 02:47
Перехват CreateFile qwerc1 Win Api 6 29.06.2010 22:01
CreateFile, Delphi. edmynt Помощь студентам 0 01.06.2010 18:23