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

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

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

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

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

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

Пытаюсь работать с архивами, с помощью взятой с CodeProdject библиотеки. Не могу правильно передать имя файла-архива. Пробовал несколько вариантов, здесь самое "лобовое", так как другие тоже не работают

Вот начало моей функции.

CopyList - вектор: std::vector<CString > CopyList;
Заполнен корректно. На первой итерации *CurPosition="c:\test\1_1.zip" (файл существует, доступ есть).

Код:
for(CurPosition=CopyList.begin();CurPosition<CopyList.end();CurPosition++)
{
  HZIP HandleZip = OpenZip(*CurPosition,""); //здесь CurPosition = "c:\test\1_1.zip"
  SetUnzipBaseDir(HandleZip,this->csTempFolder);
....
дльше библиотечные функции:

Код:
HZIP OpenZip(const TCHAR *fn, const char *password) 
{
  return OpenZipInternal((void*)fn,0,ZIP_FILENAME,password); //здесь fn = 0x0033c248 "c:\test\1_1.zip"
}
Код:
HZIP OpenZipInternal(void *z,unsigned int len,DWORD flags, const char *password)
{
  TUnzip *unz = new TUnzip(password);
  lasterrorU = unz->Open(z,len,flags); //а вот здесь z = 0x0033c248
  ...
Если в начале писать
Код:
HZIP HandleZip = OpenZip("c:\\test\\1_1.zip","")
всё работает нормально.

Подскажите, как правильно передать значение CString в OpenZip(), и почему именно так? Если честно, работу с типом данных void* плохо представляю.
Люди бывают 10 типов: те, кто понимают двоичную систему счисления, и те, кто не понимают...

Последний раз редактировалось sVasilich; 25.12.2011 в 23:27.
sVasilich вне форума Ответить с цитированием
Старый 26.12.2011, 00:01   #2
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

очевидно нужно из CString получить C-String (char*) и привести к типу void*.
Цитата:
Если честно, работу с типом данных void* плохо представляю.
приводишь любой указатель к void* затем по мере необходимости обратно
onewho вне форума Ответить с цитированием
Старый 26.12.2011, 00:17   #3
sVasilich
Форумчанин
 
Аватар для sVasilich
 
Регистрация: 16.12.2009
Сообщений: 224
По умолчанию

Не понял про перевод в тип void*: OpenZip() требует первым параметром const TCHAR*. Это в смысле уже внутри OpenZip()?

Попробовал так:

Код:
for(CurPosition=CopyList.begin();CurPosition<CopyList.end();CurPosition++)
{
  char* fn=(*CurPosition).GetBuffer();
  HZIP HandleZip = OpenZip(fn,"");
  SetUnzipBaseDir(HandleZip,this->csTempFolder);
  ...
результат тот же: в OpenZipInternal() z не определено.
Люди бывают 10 типов: те, кто понимают двоичную систему счисления, и те, кто не понимают...
sVasilich вне форума Ответить с цитированием
Старый 26.12.2011, 00:27   #4
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

getBuffer возвращает С-строку?
strcpy тогда уж.

а тебе обязательно в OpenZip нужно TCHAR ?
ну вроде как для с-строки есть макрос _T(...)
onewho вне форума Ответить с цитированием
Старый 26.12.2011, 01:01   #5
sVasilich
Форумчанин
 
Аватар для sVasilich
 
Регистрация: 16.12.2009
Сообщений: 224
По умолчанию

Попробовал с strcpy:

Код:
for(CurPosition=CopyList.begin();CurPosition<CopyList.end();CurPosition++)
{
  char* fn= new char[(*CurPosition).GetLength()];
  strcpy(fn,*CurPosition);
  HZIP HandleZip = OpenZip(fn,"");
  ...
Опять не получается. В OpenZipInternal путь к файлу не попадает.

Цитата:
а тебе обязательно в OpenZip нужно TCHAR ?
Да мне, в принципе, все равно, главное что бы здесь lasterrorU = unz->Open(z,len,flags); на месте z оказался корректный путь к файлу.
Люди бывают 10 типов: те, кто понимают двоичную систему счисления, и те, кто не понимают...
sVasilich вне форума Ответить с цитированием
Старый 26.12.2011, 11:45   #6
sVasilich
Форумчанин
 
Аватар для sVasilich
 
Регистрация: 16.12.2009
Сообщений: 224
По умолчанию

Сам запутался, и других попытался запутать.

Здесь
Код:
HZIP OpenZipInternal(void *z,unsigned int len,DWORD flags, const char *password)
{
  TUnzip *unz = new TUnzip(password);
  lasterrorU = unz->Open(z,len,flags); //а вот здесь z = 0x0033c248
  ...
всё правильно. Просто "Если честно, работу с типом данных void* плохо представляю." вот и подумал что ошибка

дальше по коду z используется вот здесь:
Код:
h=CreateFile((const TCHAR*)z,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
И, судя по всему, все слеши в пути превращаются в служебные символы.
Люди бывают 10 типов: те, кто понимают двоичную систему счисления, и те, кто не понимают...
sVasilich вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача const в функцию... Gtx541 Общие вопросы C/C++ 4 07.06.2015 09:40
Передача параметра функции FredPerry Общие вопросы C/C++ 2 29.12.2010 06:46
передача параметра в конструктор пауэрлифтинг Общие вопросы Delphi 2 27.04.2010 21:27
передача параметра по ссылке veter_s_morya PHP 7 18.10.2009 16:43
Передача параметра в поток joker Win Api 10 22.12.2007 12:53