2015-03-09 4 views
0

Изнутри моего MFC App, что я делаю что-то вродеЕсли порядок поиска путей будет идентичным для :: ShellExecute и static CFile :: GetStatus() относительно относительного пути .EXE name?

CFileStatus fs; 
if (CFile::GetStatus("MyOtherProg.exe", fs)) 
    { 
    // found the file 
    ::ShellExecute(NULL, NULL, "MyOtherProg.exe", NULL, NULL, SW_SHOW); 
    } 

, но полный путь к файлу найден в статическом CFile :: GetStatus это НЕ один выполняется с помощью :: ShellExecute (он имеет то же самое имя, но работает другая версия «MyOtherProg.exe» в другой папке).

Я пробовал это на разных ПК с тем же O/S (Win7 64 бит) с различными наборами «MyOtherProg.exe» в разных папках. Ни ShellExecute компьютера не работает так же, как в CFile :: GetStatus. На одном ПК всегда заканчивается версия 3, другой ПК всегда заканчивается версией 2 (почему это не так?).

Примечание 1: На двух ПК установлено «не установлено» не менее 3 версий, но в PATH НЕ установлены. Некоторые из них имеют SHORTCUTS на рабочем столе, если это некоторая недокументированная функция.

Примечание 2: ВСЕ они разные версии «MyOtherProg.exe», но установлены в разных каталогах.

Примечание 3: Полный путь к тому, который запускается через :: ShellExecute, тот же, который был найден, когда я просто набираю «MyOtherProg.exe» в поле «Поиск» в меню «СТАРТ» панели задач. Но ПОЧЕМУ - это тот, который найден CFile :: GetStatus NOT SAME? И почему на одном ПК это версия 2, но на другом ПК его версия 3?

Примечание 4: На обоих компьютерах в результирующем списке поиска команды RUN «MyOtherProg.exe» отображается только одна версия (хотя на одном ПК установлены 3 версии, а на другом ПК установлены 4 разных версии с пятый - «отладочная» сборка). ПК с 3 версиями всегда ТОЛЬКО перечисляет версию 2, ПК с 5 версиями всегда ТОЛЬКО перечисляет версию 3.

+1

'CFile :: GetStatus()' не ищет путь, а расширяет поставляемый путь к файлу с помощью 'GetFullPathName()', который просто добавляет путь к текущему рабочему каталогу и диску (при необходимости). Результирующий путь может быть или не существовать. Если вам нужно найти файл на пути, используйте «SearchPath», затем используйте полный путь. – William

+0

Должны ли они * быть * одинаковыми или нет, это немного нулевой вопрос, так как вы обнаружили, что они, очевидно, нет. Единственное, что вы можете сделать, чтобы убедиться, что вы получите один и тот же exe в каждом случае, - это сначала разрешить путь, как указал @William. –

ответ

0
  • CFile::GetStatus расширяет относительный путь с помощью рабочего каталога.
  • ShellExecute ищет файл, используя порядок поиска процесса. Это описано в документации CreateProcess. Как и пути, перечисленные там, выполняется поиск по пути для каждого приложения.

Вкратце это означает, что только CFile::GetStatus просто не подходит для задачи, которую вы имеете в виду. Вам нужно будет повторно создать поиск оболочки.

Но зачем вы это делаете? Логично, что нужно напрямую позвонить ShellExecute и проверить наличие ошибок. Пусть он выполняет поиск, потому что он знает правила. Поскольку ShellExecute имеет недостаточную отчетность об ошибках, вам следует позвонить по телефону ShellExecuteEx.

С другой стороны, если вы хотите выполнить поиск только в рабочем каталоге, как и при текущем вызове, до CFile::GetStatus, используйте абсолютный, а не относительный путь. Я сомневаюсь, что это то, что вы хотите сделать, но упомянуть об этом для полноты.

+0

Какой :: Параметр CreateProcess :: Карта параметров lpFile ShellExecute в? Похоже, что он может отображаться как в файле lpApplicationName (First parm) CreateProcess, так и в lpCommandLine (2nd parm), а правила для поиска - разные. Из поведения, которое я вижу из своих вызовов ShellExecute, может быть lpApplicationName? Глядя на него еще, я думаю, что это суть моего вопроса. – franji1

+0

Я бы ожидал, что ShellExecute передаст 'lpFile' как' lpApplicationName' и 'lpParameters' как' lpCommandLine'. –

+0

_CreateProcess: lpApplicationName ... или может указывать частичное имя. В случае частичного имени функция использует текущий каталог и текущий каталог для завершения спецификации; _ Я хочу, чтобы документация ShellExecute либо объяснила, либо указала на документацию CreateProcess. Это то, что я вижу (т. Е. Он НЕ смотрит в папку вызывающего процесса) – franji1