2012-02-11 4 views
3

У меня есть 2 вопроса, которые нужно задать относительно открытия файлов (любых файлов) с помощью C++. В настоящее время я работаю над программой GUI, и я хочу добавить журнал изменений в формате txt. Также я хочу, чтобы меню в моей программе открывало файл changelog.txt с текстовым редактором по умолчанию, который каждый пользователь установил, или просто чтобы он открыл этот текстовый файл. Пожалуйста, имейте в виду, что я хочу, чтобы открыть файл для отображения НЕ в программе для ввода/output.I знаю, что могу сделать это с помощьюОткрыть файл для отображения содержимого на C++

system("notepad.exe filepath.txt"); 

или открыть их с заданной программой:

system("filepath.txt"); 

Проблема в том, что обе из них открывают командную строку за блокнотом. Я знаю, что есть другая команда для открытия файлов с использованием Win32 API под названием CreateProccess(), но мой компилятор не распознает эту команду (OpenWatcom W32). Так вот мои вопросы:

1) Есть ли другие команды для открытия файлов или есть способ остановить командную строку от открытия при использовании системы команды?

2) Как вы определяете в Windows, что текстовый файл находится в текущей папке программы? Я имею в виду вместо того, чтобы передать весь путь к файлу, который изменится от пользователя к пользователю, есть ли способ «сообщить» программе, что файл всегда находится в текущей папке, в которой находится программа?

Прошу прощения за любые ошибки, если вы хотите какое-либо разъяснение, пожалуйста, дайте мне знать.

ответ

5

CreateProcess будет неправильной функцией здесь. Это потребует, чтобы вы определили, какой процесс выполнить. Пользователь может предпочесть использовать текстовый редактор, отличный от «Блокнота», я знаю, что знаю! Правильный способ сделать это в Windows - попросить оболочку открыть файл с любой программой, которую пользователь связал с файлом. Функция ShellExecute делает это.

Зов это следующим образом:

ShellExecute(
    MainWindowHandle, 
    "open", 
    FullyQualifiedTextFileName, 
    NULL, 
    NULL, 
    SW_SHOWNORMAL 
); 

Вам необходимо включить заголовочный файл Shellapi.h и ссылку на библиотеку Shell32.lib. Если ваш компилятор не включает эти файлы, и я был бы удивлен, если бы это было так, то вы можете получить их из Platform SDK. Тем не менее, если вы серьезно относитесь к программированию в Windows, вы должны получить инструмент, предоставляющий вам доступ к API Windows.

Я рекомендую вам использовать полный путь для такой задачи. Поскольку ваш текстовый файл находится в том же каталоге, что и исполняемый файл, вы должны просто присоединить этот каталог к ​​имени вашего текстового файла. Получите полный путь к исполняемому файлу, вызвав GetModuleFileName, проходящий NULL для параметра hModule.

+0

@DadvidHeferman Спасибо за ваш немедленный ответ. Это сработало. Кажется, что мой компилятор содержит необходимые файлы. Возможно, вы также знаете ответ на мой второй вопрос? –

+0

Последний параграф. Я всегда предпочитаю быть явным при указании имен файлов. Получить полный путь к каталогу, который содержит файл. Присоединитесь к этому имени файла, и вы хорошо пойдете. –

+0

Если я прав GetModuleFileName также даст мне ProgramName.exe, поэтому я должен удалить это, я прав? –

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