Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Запуск файла *.chm из программы


Автор: Нитонисе 21.11.2011, 03:10
Нужно из программы запустить файл справки *.chm.
Когда работал в Buider 6, то функции WinExec и ShelExecute работали как надо. Сейчас же в Buider XE какая-то непонятка с типами параметров этих функций. То ему надо wchar_t, а я даю const char, то наоборот... Как правильно записать эти функции в Buider XE?

Автор: sawfish 21.11.2011, 06:42
У меня в XE не ругается. Запускаю вот так:
Код

WinExec("hh help.chm", SW_MAXIMIZE);

Автор: borisbn 21.11.2011, 11:00
ShelExecuteA( ... "help.chm" ... )
или
ShelExecuteW( ... L"help.chm" ... )
или
ShelExecute( ... TEXT( "help.chm" ) ... )

Автор: Нитонисе 21.11.2011, 13:59
Цитата(sawfish @  21.11.2011,  06:42 Найти цитируемый пост)
У меня в XE не ругается. Запускаю вот так:

А что у вас такое "hh" перед "help"?
Сделал также - работает, но ведь эта команда ищет файл в текущей директории. А какая директория текущая в данный момент - неизвестно.
Потому я хотел сделать так:
Код

UnicodeString file = ExtractFilePath(Application->ExeName) + "Справка.chm";
WinExec(file.c_str(), SW_MAXIMIZE);

И получил две ошибки компилятора на второй строчке.
Код

//[BCC32 Error] uMain.cpp(2061): E2034 Cannot convert 'wchar_t *' to 'const char *'
//[BCC32 Error] uMain.cpp(2061): E2342 Type mismatch in parameter 'lpCmdLine' (wanted 'const char *', got 'wchar_t *')

Автор: xvr 21.11.2011, 14:28
Цитата(Нитонисе @  21.11.2011,  13:59 Найти цитируемый пост)
И получил две ошибки компилятора на второй строчке.

Проблема известная. Алгоритм решения:
  • Написать на листе бумаги А4 волшебную фразу "Проект в Unicode"
  • Повесить его на стену
  • Биться готовой об этот лист до наступления полного просветления
  smile 

PS. Пользователи VS от MS прошли эту стадию в начале 2000г (когда вышла первая студия VS net 2003)

Автор: Нитонисе 21.11.2011, 14:39
Цитата(xvr @  21.11.2011,  14:28 Найти цитируемый пост)
Биться готовой об этот лист до наступления полного просветления

И в чем просветление будет выражаться?

Автор: xvr 21.11.2011, 14:47
Цитата(Нитонисе @  21.11.2011,  14:39 Найти цитируемый пост)

И в чем просветление будет выражаться? 

В том, что сообщения об ошибках типа Cannot convert 'wchar_t *' to 'const char *' и/или приведения типов в программе типа (LPWSTR)p будут сразу вызывать реакцию 'Опять этот гре$%#$# Unicode!' с последующим его отключением в настройках проекта (если это возможно).

Следующей стадией будет осознанное использование Unicode'а везде вместо обычных char* строк (лично я до этой стадии пока еще не дошел  smile )

И вообще, это самые часто посещаемые грабли, возникшие во всех IDE после принудительного введения туда проектов с включенным по умолчанию Unicode'ом

Автор: Нитонисе 21.11.2011, 14:56
Цитата(xvr @  21.11.2011,  14:47 Найти цитируемый пост)
Следующей стадией будет осознанное использование Unicode'а везде вместо обычных char* строк

Это означает, что Unicode лучше или что нам некуда деваться?  smile 

Автор: xvr 21.11.2011, 15:14
Цитата(Нитонисе @ 21.11.2011,  14:56)
Цитата(xvr @  21.11.2011,  14:47 Найти цитируемый пост)
Следующей стадией будет осознанное использование Unicode'а везде вместо обычных char* строк

Это означает, что Unicode лучше или что нам некуда деваться?  smile

Второе. Если проект предполагается использовать хоть где нибудь, за исключением личного компьютера разработчика, то вопрос языков в интерфейсе рано или поздно всплывет. И вот тогда 'будет мучительно больно', если об Unicode не подумали сразу  smile 

Автор: Нитонисе 21.11.2011, 15:49
Так а что делать с функциями, которые хотят char? Заставить их работать нельзя?

Автор: borisbn 21.11.2011, 16:30
Цитата(Нитонисе @  21.11.2011,  15:49 Найти цитируемый пост)
Так а что делать с функциями, которые хотят char? Заставить их работать нельзя?


Цитата(borisbn @  21.11.2011,  11:00 Найти цитируемый пост)

ShelExecuteA( ... "help.chm" ... )
или
ShelExecuteW( ... L"help.chm" ... )
или
ShelExecute( ... TEXT( "help.chm" ) ... )


Автор: xvr 21.11.2011, 18:11
Цитата(Нитонисе @  21.11.2011,  15:49 Найти цитируемый пост)
Так а что делать с функциями, которые хотят char?

Использовать их эквиваленты, которые хотят Unicode.

Цитата(Нитонисе @  21.11.2011,  15:49 Найти цитируемый пост)
Заставить их работать нельзя?

Можно, если очень приспичит (из Unicode'а можно получить char*, если повезет). Но лучше не надо  smile 

Автор: sawfish 21.11.2011, 19:21
Цитата

А что у вас такое "hh" перед "help"?
Сделал также - работает, но ведь эта команда ищет файл в текущей директории. А какая директория текущая в данный момент - неизвестно.

hh - это виндовосинская утилита отображения справочной информации hh.exe. В качестве параметра ей передается файл справки. Для Семерки это вроде уже не катит.

Для неизвестной текущей директории у меня работает такой код:
Код

AnsiString str=ExtractFilePath(Application->ExeName)+"help.chm";
WinExec(("hh "+str).c_str(), SW_MAXIMIZE);

ну, или так:
Код

AnsiString str="hh "+ExtractFilePath(Application->ExeName)+"help.chm";
WinExec(str.c_str(), SW_MAXIMIZE);


Добавлено через 7 минут и 29 секунд
Кста, http://forum.vingrad.ru/topic-332574.html была, там volatile подсказывает, чего можно сделать.

Автор: Нитонисе 23.11.2011, 12:49
borisbn, ваши функции работают (только Shell...), но мне нужно не просто имя файла справки указать, а путь к ней.
Помещаю путь в строку UnicodeString, но этот тип не воспринимется функцией ShellExecute. Функция преобразования c_str() не работает.


Автор: ZVano 25.11.2011, 15:12
Я делаю так.
Код

void TMyForm::ShowHelp(UnicodeString fPath) {
    if (FileExists(fPath)) {
        ShellExecuteW(Handle, NULL, fPath.w_str(), NULL, NULL, SW_SHOWDEFAULT);
    }
    else {
        ShowMessage("Файл помощи не найден.");
    }
}

Автор: Нитонисе 29.11.2011, 15:50
ZVano, действительно, так сработало. Странно... вроде же пробовал функцию w_str(), чего-то не срабатывало .

Автор: ZVano 1.12.2011, 16:50
Цитата(Нитонисе @  29.11.2011,  15:50 Найти цитируемый пост)
Vano, действительно, так сработало. Странно... вроде же пробовал функцию w_str(), чего-то не срабатывало .

w_str()  используется в паре с ShelExecuteW

Вероятно, не срабатывало  потому что использовалась функция ShelExecute или ShelExecuteA. Они ожидают Ansi, а получали Wide.
Чтобы сработало нужно было использовать финт такого вида 
Код

  UnicodeString file = ExtractFilePath(Application->ExeName) + "Справка.chm";
  ShellExecute(..., AnsiString(file).c_str(), ...);



PS: если вопрос решен - не поленитесь закрыть тему.

Автор: Нитонисе 3.12.2011, 17:06
Цитата(ZVano @  1.12.2011,  16:50 Найти цитируемый пост)
Вероятно, не срабатывало  потому что использовалась функция ShelExecute или ShelExecuteA.

Ну вот сейчас все сработало с функцией ShellExecute и w_str();

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