С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
9 / 9 / 0
Регистрация: 19.10.2011
Сообщений: 113

Неправильная передача параметра если в нем есть пробел

11.10.2013, 10:00. Показов 1719. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Может кто сталкивался с такой проблемой, помогите решить.
Есть такая программа, почтовый клиент Mozilla Thunderbird
Так вот, когда в сообщение приходят графические файлы во вложении, например jpg
То открыть этот фаил стандартным просмоторщиком ХР из программы не получается, так как нет какой-то обработки, или она очень криво работает.
я собрал некий так сказать обработчик, который вызывает виндовый обработчик, и вкладывает в него вызванный фаил.
Есть небольшая проблема, например фаил с именем "картинка.jpg" открывает без проблем, а фаил с именем
"моя картинка.jpg" уже не открывает.. я так понимаю проблема именно в этом пробеле, чем его можно заменить, что бы винда корректно видела что это название файла, а не какой-то доп параметр?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//---------------------------------------------------------------------------
 
#include <vcl.h>
#include <windows.h>
#pragma hdrstop
 
//---------------------------------------------------------------------------
 
#pragma argsused
WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
        String sFile = lpCmdLine; //получаем путь к файлу
        String parametr = "/k C:\\WINDOWS\\system32\\shimgvw.dll,ImageView_Fullscreen "+sFile; //добавляем к параметру
        ShellExecuteA(NULL,"open","C:\\WINDOWS\\system32\\rundll32.exe",parametr.c_str(),0,SW_HIDE); //вызываем
        return 0;
}
//---------------------------------------------------------------------------
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.10.2013, 10:00
Ответы с готовыми решениями:

Проверить, есть ли в нем отрицательные элементы. Если есть, найдите их количество
Создать массив с именем А из 10-ти элементов, задав значения его элементов с помощью датчика случайных чисел. Вывести его на экран....

Проверить, есть ли в нем элементы, равные нулю. Если есть, найдите номер первого из них
Решить: Создать массив с именем А из 10-ти элементов, задав значения его элементов с помощью датчика случайных чисел. Вывести его на...

Автозапуск Access с параметром, и вывод отчета если в нем есть данные, если нет, то закрытие приложения
Есть ,база данных небольшой компании, в которой есть таблица ЭЦП. При запуске базы, выводится отчет о тех компьютерах на которых в течении...

6
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33197 / 21493 / 8233
Регистрация: 22.10.2011
Сообщений: 36,886
Записей в блоге: 12
11.10.2013, 10:31
Вообще-то, это незыблемые правила: если полное имя файла содержит пробелы - оборачивать его кавычками...

C++
1
String parametr = "/k C:\\WINDOWS\\system32\\shimgvw.dll,ImageView_Fullscreen \""+sFile + "\"";
1
9 / 9 / 0
Регистрация: 19.10.2011
Сообщений: 113
11.10.2013, 12:13  [ТС]
Цитата Сообщение от UI Посмотреть сообщение
Вообще-то, это незыблемые правила: если полное имя файла содержит пробелы - оборачивать его кавычками...

C++
1
String parametr = "/k C:\\WINDOWS\\system32\\shimgvw.dll,ImageView_Fullscreen \""+sFile + "\"";
Странно все это, что-то вообще не работает, хотя имитируя все в командной строке, все прекрасно работает

Добавлено через 28 минут
Не нашел кнопку редактировать, поэтому пишу тут.
Что интересно, переменная sFile изначально находится в кавычках, т. е. если передавать картинку например с рабочего стола, то путь передается в кавычках, а если передавать локально в папке, то путь без кавычек.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33197 / 21493 / 8233
Регистрация: 22.10.2011
Сообщений: 36,886
Записей в блоге: 12
11.10.2013, 12:23
C++
1
2
3
    String sFile = "D:\\test\\new avatar copy.bmp";
    String parametr = "/k \"C:\\Program Files\\Windows Photo Viewer\\PhotoViewer.dll\", ImageView_Fullscreen "+sFile;
    ShellExecute(NULL, L"open", L"C:\\WINDOWS\\system32\\rundll32.exe", parametr.c_str(), 0, SW_SHOWNORMAL);
под Win7 прекрасно показывает картинку... SW_HIDE - то тебе зачем?
0
9 / 9 / 0
Регистрация: 19.10.2011
Сообщений: 113
11.10.2013, 13:03  [ТС]
Цитата Сообщение от UI Посмотреть сообщение
C++
1
2
3
    String sFile = "D:\\test\\new avatar copy.bmp";
    String parametr = "/k \"C:\\Program Files\\Windows Photo Viewer\\PhotoViewer.dll\", ImageView_Fullscreen "+sFile;
    ShellExecute(NULL, L"open", L"C:\\WINDOWS\\system32\\rundll32.exe", parametr.c_str(), 0, SW_SHOWNORMAL);
под Win7 прекрасно показывает картинку... SW_HIDE - то тебе зачем?
Да, если я передаю напрямую, то даже "My photo.jpg" работает корректно в ХР
C++
1
String sFile = "C:\\Myphoto.jpg";
но мне то надо передавать путь через
C++
1
String sFile = lpCmdLine;
т.е. через командную строку, точнее я вызываю эту программу с параметром вроде как
Proeject1.exe C:\My photo.jpg

и тут возникает какая-то проблема, он тупо не находит путь, или не видит его, хотя заглядывая в переменные, путь вроде как есть

по поводу SW_HIDE, да, он тут не к чему, просто вырезал из другого исходника с формой.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33197 / 21493 / 8233
Регистрация: 22.10.2011
Сообщений: 36,886
Записей в блоге: 12
11.10.2013, 13:23
Ну, я и запускал через Run:


Нормально показывается изображение...
1
9 / 9 / 0
Регистрация: 19.10.2011
Сообщений: 113
11.10.2013, 15:12  [ТС]
Судя по всему не открывало потому-что, папка где лежит проект "название с пробелом", переместил в корневой диск, открывает через командную строку номально, даже с пробелами
НО, если выбрать картинку и нажать "открыть с помощью", затем зайти в обзор, выбрать свой проект, эатем поставить галочку открывать все файлы с помощью этой программы, затем щелкнуть на туже картинку которая лежит в корне, и нечего, хотя те окна, которые я напихал в проект для заглядывания в переменные, успешно информируют о том, что все пучком, путь есть.

C++
1
2
3
4
5
        char ExeName[MAX_PATH]; //находим себя
        GetModuleFileName(HInstance, ExeName, sizeof(ExeName));
        MessageBox(NULL, sFile.c_str(), "параметр который передаем", MB_OK | MB_ICONINFORMATION);
        MessageBox(NULL, ExeName, "где находимся", MB_OK | MB_ICONINFORMATION);
        MessageBox(NULL, parametr.c_str(), "вся командная строка в сборе", MB_OK | MB_ICONINFORMATION);
Добавлено через 1 час 18 минут
вот таким методом пришлось решить эту задачку)) хотя можно былобы наверное и проще что-то сделать

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
bool proverka = false;
        String sFile = lpCmdLine, parametr;
        for(int i = 1; i <= sFile.Length();i++)
        {
           if(sFile[i] == '\"')
           {
                sFile[i] = ' ';
                proverka = true;
           }
        }
        if(proverka) parametr = "/k shimgvw.dll,ImageView_Fullscreen"+sFile;
        else parametr = "/k shimgvw.dll,ImageView_Fullscreen "+sFile;
        ShellExecuteA(NULL, "open", "C:\\WINDOWS\\system32\\rundll32.exe",parametr.c_str(),0,SW_SHOWNORMAL);
 
        return 0;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.10.2013, 15:12
Помогаю со студенческими работами здесь

Дан массив А из 10 элементов. Проверить, есть ли в нем элементы, равные нулю. Если есть, найдите номер первого из них
Дан массив А из 10 элементов. Проверить, есть ли в нем элементы, равные нулю. Если есть, найдите номер первого из них, т.е. наименьшее i,...

Команда FINDSTR не находит файл, если в его имени есть пробел
Вобщем настрочил сортировщич через FINDSTR /L &quot;@yandex.ru&quot; %base% &gt; yandexru.txt Вобщем не знаю что делать когда в пути есть...

Заменить в тексте каждую точку многоточием, если после точки есть пробел
Заменить в тексте каждую точку многоточием, если после точки есть пробел.

Раскрывать выпадающий список (ComboBox) автоматически, если в нем есть значение
Всем привет, народ подскажите как сделать так, чтоб выпадающий список(comboBox) раскрывался автоматически, если в нем есть значение???

Как посчитать сумму элементов массива, если в нем есть буквы?
Есть массив, который состоит из множества цифр от 2 до 5 и букв &quot;Н&quot; (русская). Как посчитать среднее арифметическое этого массива? Если...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru