9 / 9 / 0
Регистрация: 19.10.2011
Сообщений: 112
1

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

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

Author24 — интернет-сервис помощи студентам
Здравствуйте!
Может кто сталкивался с такой проблемой, помогите решить.
Есть такая программа, почтовый клиент 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.10.2013, 10:00
Ответы с готовыми решениями:

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

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

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

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

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

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

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

Добавлено через 28 минут
Не нашел кнопку редактировать, поэтому пишу тут.
Что интересно, переменная sFile изначально находится в кавычках, т. е. если передавать картинку например с рабочего стола, то путь передается в кавычках, а если передавать локально в папке, то путь без кавычек.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32830 / 21168 / 8147
Регистрация: 22.10.2011
Сообщений: 36,429
Записей в блоге: 8
11.10.2013, 12:23 4
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
Сообщений: 112
11.10.2013, 13:03  [ТС] 5
Цитата Сообщение от 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
32830 / 21168 / 8147
Регистрация: 22.10.2011
Сообщений: 36,429
Записей в блоге: 8
11.10.2013, 13:23 6
Ну, я и запускал через Run:
Неправильная передача параметра если в нем есть пробел


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

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
11.10.2013, 15:12
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.10.2013, 15:12
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru