2015-05-09 2 views
2

Я работаю над программой на C++, которая должна запускать Internet Explorer и отображать локальный файл html в Windows 7. Я пытаюсь использовать ShellExecute, но он не работает. Я googled вокруг, но не мог найти ответ, который сработал. Вот код:

ShellExecute(NULL, "open", "start iexplore %userprofile%\\Desktop\\html_files\\file.hml", NULL, NULL, SW_SHOWDEFAULT);

Я скопировал команду в вызов системы(), чтобы посмотреть, если она будет работать, и это было сделано. Вот система() вызов я попробовал:

C++ ShellExecute не работает

system("start iexplore %userprofile%\\Desktop\\html_files\\file.html"); 



Поскольку системный вызов работал, его явно проблемы с ShellExecute. В принципе, Internet Explorer не возникает. Все компилируется правильно. Есть идеи?

ответ

1

Я не думаю, что IE будет распознавать переменные среды в URI. Фактически % имеют особое значение.

Что-то, как это должно работать:

#include <windows.h> 

int main() 
{ 
    ShellExecute(NULL, "open", 
        "C:\\progra~1\\intern~1\\iexplore.exe", 
        "file:///C:/Users/UserName/Desktop/html_files/file.html", 
        "", 
        SW_MAXIMIZE); 
    return 0; 
} 

Другой способ, получить% USERPROFILE% Enviroment значение переменной и Concat ваш URI:

#if (_MSC_VER >= 1400) 
#pragma warning(push) 
#pragma warning(disable: 4996) // Disabling deprecation... bad... 
#endif 

#include <windows.h> 
#include <stdlib.h> 
#include <iostream> 
#include <string> 

int main() 
{ 
    std::string uri = std::string("file:///") + getenv("USERPROFILE") + "/Desktop/html_files/file.txt"; 

    ShellExecute(NULL, "open", 
        "C:\\progra~1\\intern~1\\iexplore.exe", 
        uri.c_str(), 
        "", 
        SW_MAXIMIZE); 

    return 0; 
} 

Im инвалидизирующих предупреждения здесь, но вы должны использовать _dupenv_s вместо getenv.

Удачи.

+0

Вы правы; т.е. не работает с% - я только что протестировал его. Вы знаете какие-либо альтернативы% userprofile%? – pdf4664

+0

Кроме этого, ваш ответ работает. – pdf4664

+0

Ну, вы можете использовать: 'getenv (« USERPROFILE »);' получить значение переменной окружения и сохранить это в строке. Затем вызовите 'ShellExecute'. – JosEduSol

1

Пути папок оболочки пользователя, включая Рабочий стол, могут быть настроены пользователем, поэтому %userprofile\desktop не гарантированно будет правильным путем для всех систем. правильный способ получить пользователя Рабочий стол должен использовать SHGetFolderPath(CSIDL_DESKTOPDIRECTORY) или SHGetKnownFolderPath(FOLDERID_Desktop).

Вам не нужно знать путь к iexplorer.exe, Windows знает, как его найти. Так просто указать «iexplorer.exe» сам по себе в качестве параметра lpFile и имя файла HTML в качестве параметра lpParameter:

ShellExecute(NULL, "open", "iexplore.exe", "full path to\\file.hml", NULL, SW_SHOWDEFAULT); 

С учетом сказанного, это очень IE-специфичны. Если вы хотите загрузить файл в пользователя по умолчанию HTML-браузер/просмотра, установите параметр lpVerb на NULL и HTML-файла в качестве lpFile параметра:

ShellExecute(NULL, NULL, "full path to\\file.hml", NULL, NULL, SW_SHOWDEFAULT); 

Это то же самое, как если бы пользователь имел двойной щелчок в файле в Проводнике Windows.

+0

Да, это намного лучше. – JosEduSol

Смежные вопросы