Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Крнвертация AnsiString в wchar_t**


Автор: Teran 13.11.2006, 12:09
на могу сконвертировать AnsiString в wchar_t**.
пробовал так но ничего не вышло:
Код

AnsiString p = "c:\\1.txt";
char *Str=new char[MAX_PATH];
Str=p.c_str();

  WCHAR *wStr=NULL;
  int nCountLit = MultiByteToWideChar(CP_ACP, 0, Str, -1, wStr, 0);
  wStr = new WCHAR[nCountLit];
  MultiByteToWideChar(CP_ACP,0, Str,-1, wStr,nCountLit);

 Recognize((wchar_t**)&wStr); // Собственно функция в которую надо передать wchar_t**  (BSTR* Filename)

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

Автор: Partizan 13.11.2006, 12:46
насколько я помню.....перевод между char и wchar_t осуществляют функции AnsiToOem() и OemToAnsi()... В VS они есть точно....насколько я помню ето уже WinAPI функции, поэтому и из билдера мона их поюзать...

Автор: pandrew 13.11.2006, 12:55
AnsiString  atxt("Help");
WideString wtxt(atxt);
BSTR txt=wtxt.c_bstr();  // wchar_t* и BSTR по сути одно и тоже

Автор: Vyacheslav 13.11.2006, 13:00
см help TStringConverter

Автор: Teran 13.11.2006, 13:01
Цитата(pandrew @  13.11.2006,  12:55 Найти цитируемый пост)
BSTR txt=wtxt.c_bstr();  // wchar_t* и BSTR по сути одно и тоже 

вот а мне нужно еще из wchar_t* сделать wchar_t**

Автор: bel_nikita 13.11.2006, 13:03
Цитата(Teran @ 13.11.2006,  11:09)
Код
Recognize((wchar_t**)&wStr); // Собственно функция в которую надо передать wchar_t**  (BSTR* Filename)

Сдается мне, будет достаточно: Recognize(&wStr);

Добавлено @ 13:04 
Цитата(Teran @ 13.11.2006,  12:01)
вот а мне нужно еще из wchar_t* сделать wchar_t**

для чего?

Автор: Teran 13.11.2006, 13:05
Код

String str = "A string here" ;
LPWSTR lpszW = new WCHAR[255];

LPTSTR lpStr = str.c_str();
int nLen = MultiByteToWideChar(CP_ACP, 0,lpStr, -1, NULL, NULL);
MultiByteToWideChar(CP_ACP, 0, lpStr, -1, lpszW, nLen);
Recognize(lpszW);//ОШИБКА ТУТ

вот именно в жтой строке вомпилятор выдает ошибку:
Код

[C++ Error] Unit1.cpp(55): E2034 Cannot convert 'wchar_t *' to 'wchar_t * *'

Автор: Partizan 13.11.2006, 13:07
добавляешь амперсанд ака & куда надо и всё будет ок 

Автор: Teran 13.11.2006, 13:09
Цитата(Partizan @  13.11.2006,  13:07 Найти цитируемый пост)
добавляешь амперсанд ака & куда надо и всё будет ок  

я вот тоже так думал а почемуто не работает но компилируется ок

Автор: Partizan 13.11.2006, 13:17
нутк ты передаёшь указатель на одномерный массив....а функция ждёт  двумерный массив....
желательно бы чтоб ты весь код привёл и ожидаемый результат сообщил) 

Автор: bel_nikita 13.11.2006, 13:46
Цитата(Partizan @ 13.11.2006,  12:17)
нутк ты передаёшь указатель на одномерный массив....а функция ждёт указателя на двумерный....
желательно бы чтоб ты весь код привёл и ожидаемый результат сообщил)

На самом деле одномерный или многомерный массив неважно, разница в адресации и индексации в массиве. Тут ошибка в логике.
Метод Recognize принимает указатель на указатель, а это не есть классический массив вида int array[10][10], в котором элементы располагаются последовательно в памяти. В данном случае Recognize принимает массив указателей на одномерные массивы.
Т.е. Recognize - код в студию!

З.Ы.: надеюсь понятно объяснил smile 

Автор: Teran 13.11.2006, 15:07
Цитата(bel_nikita @  13.11.2006,  13:46 Найти цитируемый пост)
код в студию!

дело в том что кода нету это activX dll которую я подключаю
она стает как компонент

самое интересное что Builder С++ эта функция такая:
Код

  BSTR __fastcall Recognize(BSTR* strFilename/*[in,out]*/)
  {
    return GetDefaultInterface()->Recognize(strFilename/*[in,out]*/);
  }

а когда ставлу в Delphi то в место BSTR* strFilename ей нужно всеголиш WideString и в delphi он отрабатывает
но проблема в том что мне нужно на Buildere писать

наверно придется в буилдер добавлять .pas файл

Автор: pandrew 13.11.2006, 16:03
Цитата(Teran @ 13.11.2006,  15:07)
наверно придется в буилдер добавлять .pas файл

На BCB потребуется что-нибудь вроде:
Код

Widestring str; // str надо как-нибудь инициализировать
Comp->Recognize(&str);

Это стандартный вызов для [in,out] строковых параметров

Автор: bel_nikita 13.11.2006, 16:16
А подробнее о аргументах  GetDefaultInterface()->Recognize(strFilename/*[in,out]*/);
Может должно быть так:
Код
BSTR  MyBstr = SysAllocString(lpszW);
Recognize(MyBstr);

Автор: Teran 13.11.2006, 21:50
Всем спасибо за участие 
кто с таким столкнется решил проблему так:
Код

 AnsiString FName="Test1";
 LPWSTR lpszW = new WCHAR[255];
 int nLen = MultiByteToWideChar(CP_ACP, 0,FName.c_str(), -1, NULL, NULL);
 MultiByteToWideChar(CP_ACP, 0, FName.c_str(), -1, lpszW, nLen);
 BSTR Param1 = lpszW;
  Recognize((BSTR*)&Param1);
 delete []lpszW;

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