Как открыть пользовательский файл расширения в программе?

Я программирую программное обеспечение GUI регистратора данных с использованием Borland C++Builder 2006. Это желаемая платформа моей компании.

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

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

  1. Как я говорю Windows, чтобы открыть этот файл.evp с моим программным обеспечением.
  2. Как я обращаюсь с открытым файлом в моем программном обеспечении и использую его в своей определенной функции Open.

1 ответ

Решение

От Borland C2006 ты имеешь в виду Embarcadero BDS2006 Turbo(explorer) C++?

  1. Файловые ассоциации хранятся где-то в реестре

    См. Создание записи реестра, чтобы связать расширение файла с приложением в C++. Таким образом, вы можете создать рег файл или добавить записи реестра программно с помощью WinAPI.

    Я никогда не обновлял реестр в своих приложениях, но это пример того, как вы можете читать реестр (получая частоту процессора):

    double getregfcpu()
    {
    DWORD keyhnd;
    HKEY  hKey=NULL;
    DWORD dwSize;
    DWORD dwFrequency;
    double f=0.0;
    for(;;)
        {
        keyhnd=RegOpenKeyEx(HKEY_LOCAL_MACHINE,"Hardware\\Description\\System\\CentralProcessor\\0",0,KEY_QUERY_VALUE,&hKey);
        if (keyhnd!=ERROR_SUCCESS) break;
        dwSize = sizeof(dwFrequency);
        keyhnd = RegQueryValueEx (hKey,"~MHz",NULL,NULL,(LPBYTE)&dwFrequency,&dwSize );
        if (keyhnd!=ERROR_SUCCESS) break;
        f=dwFrequency; f*=1e6;
        break;
        }
    if (hKey!=NULL) RegCloseKey(hKey);
    return f;
    }
    

    так что экспериментируйте / используйте RegCreateKeyEx вместо RegOpenKeyEx, Настоятельно рекомендуем сначала поэкспериментировать с какой-то записью в реестре, не связанной с windows, чтобы вы ничего не испортили. И только при работе, как следует изменить имя записи в нужном месте.

  2. Сторона применения

    Перейдите к исходному файлу вашего приложения (тот, который открывается при открытии проекта в IDE). Найти там WinMain функционировать и изменить его так:

    WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR cmdl, int)
    {
        try
        {
            Application->Initialize();
            Application->Tag=(int)cmdl; // *** ADD THIS LINE ***
            Application->CreateForm(__classid(TMain), &Main);
            Application->Run();
        }
        catch (Exception &exception)
        {
            Application->ShowException(&exception);
        }
        catch (...)
        {
            try
            {
                throw Exception("");
            }
            catch (Exception &exception)
            {
                Application->ShowException(&exception);
            }
        }
        return 0;
    }
    

    cmdl содержит указатель на командную строку, с которой было вызвано ваше приложение. Так что скопируйте его на свой Application->Tag который предназначен для любого определенного пользователем поведения. Таким образом, cmdl доступен из всего проекта (в любом окне / форме). Теперь, чтобы извлечь файл, чтобы открыть, вы просто делаете в своем Form конструктор примерно так:

    AnsiString cmdl=(LPSTR)Application->Tag;    // access the command line parameters
    if (cmdl.Length()>2) // file is encapsulated with ""
     if (cmdl[1]=='"')
      if (cmdl[cmdl.Length()]=='"')
        {
        AnsiString s="";
        for (int i=2;i<cmdl.Length();i++) s+=cmdl[i]; // cut of the ""
        // here load file: s
        }
    

    Если вы хотите иметь больше параметров командной строки, вам нужно немного обновить его, выполнив поиск "" и обработав все параметры командной строки... Иногда полезно использовать локальный путь к приложению exe. Вы можете получить это так:

    AnsiString exepath=ExtractFilePath(Application->ExeName);

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