2015-10-21 2 views
0

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

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

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

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

ответ

1

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

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

    См Create registry entry to associate file extension with application in C++. Таким образом, вы можете создавать reg-файл или добавлять записи реестра программно 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. Настоятельно рекомендую сначала поэкспериментировать с какой-либо собственной записью реестра, не связанной с окнами, чтобы вы ничего не испортили. И только при работе, как следует изменить имя записи в нужное место.

  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);

+0

Великий ответ, TNX. В ваших конструкторах форм, я думаю, он должен быть исправлен как: cmdl [0] вместо cmdl [1] и int i = 1 вместо int i = 2. Поскольку первый индекс [0] не [1]. Я прав? – HOPE

+0

@HOPE AnsiString индексируется с '1' !!!если вы получаете доступ к 'cmdl [0]' вы это бросаете исключение !!! – Spektre

+0

REALY?!? Я этого не знаю. Великий ... – HOPE