Используете зарегистрированные ассоциации файлов DDE с приложением CDialog? - PullRequest
1 голос
/ 07 мая 2020

Я знаю, что проекты SDI и MDI изначально имеют концепцию типа файла и что вы можете дважды щелкнуть мышью в проводнике. Например:

BOOL CCommunityTalksApp::InitInstance()
{
    // Enable DDE Execute open
    EnableShellOpen();
    RegisterShellFileTypes(TRUE);

    // Process command line arguments (standard shell commands, DDE, file open)
    if (cmdInfo.m_nShellCommand == CCommandLineInfo::FileNew)
        cmdInfo.m_nShellCommand = CCommandLineInfo::FileNothing ;

    // Dispatch commands specified on the command line
    if ( !ProcessShellCommand( cmdInfo ) )
        return FALSE;
}

Но у меня есть проект CDialog с двумя редакторами. Предполагая, что мой установщик зарегистрировал две необходимые ассоциации типов файлов, как затем заставить мое приложение на основе CDialog обнаружить файл, который был открыт, и направить его в соответствующий редактор?

Это сделано в InitInstance ?

Вкратце:

  • Пользователь дважды щелкнул файл?
  • Это был файл SRR или MWB?
  • Затем отправьте сообщение / кэшировать сообщение в m_pMainDlg, чтобы он мог открыть указанный файл в соответствующем редакторе.

Как мне сделать первые два пункта?

1 Ответ

2 голосов
/ 07 мая 2020

Это сделано в InitInstance?

Да, вы можете использовать ParseCommandLine или обработать m_lpCmdLine напрямую.

Сделал ли пользователь дважды щелкните файл?

Это действительно важно? Об этом сказать сложнее. Если приложение было запущено (скажем) ассоциацией AB C, возможно, пользователь дважды щелкнул файл AB C, но также может быть, что они запустили пакетный файл, который выполнил start somefile.ABC, или что-нибудь еще, что в конечном итоге разрешилось в ShellExecute[Ex] с файлом AB C.

Был ли это файл SRR или MWB?

Предполагая, что это зарегистрированные расширения , они будут частью полного имени файла (имя + расширение), полученного в m_lpCmdLine. Для одного файла имя файла также будет в CCommandLineInfo::m_strFileName, если был вызван CWinApp::ParseCommandLine.

Затем отправьте / кешируйте сообщение в m_pMainDlg, чтобы он открыл указанный файл в соответствующем редакторе .

Из InitInstance вы обычно передаете имя файла (имена) конструктору диалогового окна, а сам диалог позже отправит сообщение в конце OnInitDialog, когда все будет в место.

...