Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запуск файла *.chm из программы, Функции WinExec и ShellExecute 
V
    Опции темы
Нитонисе
Дата 21.11.2011, 03:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Нужно из программы запустить файл справки *.chm.
Когда работал в Buider 6, то функции WinExec и ShelExecute работали как надо. Сейчас же в Buider XE какая-то непонятка с типами параметров этих функций. То ему надо wchar_t, а я даю const char, то наоборот... Как правильно записать эти функции в Buider XE?
PM MAIL   Вверх
sawfish
Дата 21.11.2011, 06:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 150
Регистрация: 30.7.2008
Где: Новосибирск

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



У меня в XE не ругается. Запускаю вот так:
Код

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

PM MAIL   Вверх
borisbn
Дата 21.11.2011, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



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



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Нитонисе
Дата 21.11.2011, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

PM MAIL   Вверх
xvr
Дата 21.11.2011, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



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

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

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

PM MAIL   Вверх
Нитонисе
Дата 21.11.2011, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

И в чем просветление будет выражаться?
PM MAIL   Вверх
xvr
Дата 21.11.2011, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



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

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

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

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

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

PM MAIL   Вверх
Нитонисе
Дата 21.11.2011, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

Это означает, что Unicode лучше или что нам некуда деваться?  smile 
PM MAIL   Вверх
xvr
Дата 21.11.2011, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



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

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

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

PM MAIL   Вверх
Нитонисе
Дата 21.11.2011, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Так а что делать с функциями, которые хотят char? Заставить их работать нельзя?
PM MAIL   Вверх
borisbn
Дата 21.11.2011, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



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


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

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




--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
xvr
Дата 21.11.2011, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



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

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

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

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

PM MAIL   Вверх
sawfish
Дата 21.11.2011, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 150
Регистрация: 30.7.2008
Где: Новосибирск

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



Цитата

А что у вас такое "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 секунд
Кста, вот тема была, там volatile подсказывает, чего можно сделать.
PM MAIL   Вверх
Нитонисе
Дата 23.11.2011, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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



Это сообщение отредактировал(а) Нитонисе - 23.11.2011, 12:50
PM MAIL   Вверх
ZVano
Дата 25.11.2011, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 259
Регистрация: 11.12.2006
Где: Украина, Кривой Р ог

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



Я делаю так.
Код

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



--------------------
НЕ ФЛУДИМ. Пользуемся кнопками "+" или "-" для выражения своего отношения к теме или сообщению.
Гуглим "Как правильно задавать вопросы"
PM MAIL Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


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

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


 




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


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

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