Открыть диалоговое окно свойств файла / папки из C

У меня есть эта крошечная программа, которая предназначена для отображения окна свойств файла / папки Windows на указанном info.lpFile:

#include <windows.h>

main() {
   SHELLEXECUTEINFO info = {0};

   info.cbSize = sizeof(SHELLEXECUTEINFO);
   info.lpFile = "C:\\test.txt";
   info.nShow = SW_SHOW;
   info.fMask = 0x00000000;
   info.lpVerb = "properties";

   ShellExecuteEx(&info);
}

Когда я компилирую и выполняю его, я получаю следующее сообщение об ошибке:

Сообщение об ошибке

Я использую Win7 и Mingw GCC компилятор. Кто-нибудь знает, что не так с моим кодом? Я что-то пропустил?

2 ответа

Решение

1-й из всего кода, как показано, не инициализируется должным образом info,

Чтобы исправить это изменение

  SHELLEXECUTEINFO info;

быть

  SHELLEXECUTEINFO info = {0};

Во-вторых использовать SEE_MASK_INVOKEIDLIST за SHELLEXECUTEINFOчлен fMask,

Для справки: https://msdn.microsoft.com/en-us/library/windows/desktop/bb759784%28v=vs.85%29.aspx

Обратите внимание: чтобы увидеть окно свойств открытым, вызывающий код не должен заканчиваться немедленно. Так что добавьте что-то вроде

  Sleep(10000);

до конца вашего тестового кода, как показано.


Полный код, который работает для меня:

#include <windows.h>

int main(void) 
{
  SHELLEXECUTEINFO info = {0};

  info.cbSize = sizeof info;
  info.lpFile = L"C:\\tmp\\tmp.txt";
  info.nShow = SW_SHOW;
  info.fMask = SEE_MASK_INVOKEIDLIST;
  info.lpVerb = L"properties";

  ShellExecuteEx(&info);

  Sleep(10000);
}

Варианты сборки:

/ZI /nologo /W3 /WX- /Od /Oy- /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /Gm /EHsc /RTC1 /GS /fp:precise /Zc:wchar_t /Zc:forScope /Fp"Debug\SOxyzConsoleEmpty.pch" /Fa"Debug\" /Fo"Debug\" /Fd"Debug\vc100.pdb" /Gd /TC /analyze- /errorReport:queue 

(Протестировано с VS2010, работает под управлением Windows 7)

Я бы начал с инициализации информации:

SHELLEXECUTEINFO info = {0};

Затем я бы попробовал глагол, который на самом деле существует в реестре под HKEY_CLASSES_ROOT\txtfile\shell

info.lpVerb = "open";

Что я сильно подозреваю, будет работать. Проблема в том, что проводник не запускает приложение для отображения свойств файлов - оно встроено. Не каждая часть функциональности в контекстном меню файла - это глагол, который вы можете вызвать через ShellExecute.

Если вы хотите вызвать пункт контекстного меню свойств для файла - вам нужно будет запросить IShellFolder который представляет папку с файлами, звоните GetUIObjectOf чтобы получить IContextMenu для файла, который вы можете затем вызвать InvokeCommand на.

См. Получение информации о содержимом папки на MSDN для получения информации.

Другие вопросы по тегам