如何在程序中打开用户定义的扩展文件?

时间:2015-10-21 06:37:22

标签: c++ windows file-association c++builder-2006

我使用Borland C ++ Builder 2006编写数据记录器GUI软件。它是我公司所需的平台。

我在使用我定义的扩展名对特定文件进行一些分析后保存收到的数据" .evp" 。我在我的程序中定义了保存和打开函数,但运行正常。

现在我遇到如何在不使用我的软件的情况下直接打开保存的文件的问题。我的意思是当我双击保存的文件时,它会自动打开我的软件并显示数据。然后有两个问题:

  1. 我如何告诉Windows打开这个" .evp"用我的软件提交文件。
  2. 我如何在软件中处理打开的文件,并使用我定义的Open函数。

1 个答案:

答案 0 :(得分:1)

Borland C2006你的意思是Embarcadero BDS2006 Turbo(explorer) C++

  1. 文件关联存储在注册表

    Create registry entry to associate file extension with application in C++。因此,您可以通过WinAPI创建reg文件或添加注册表项。

    我从未在我的应用程序中更新注册表,但这是如何读取注册表(获取CPU频率)的示例:

    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
        }
    

    如果你想拥有更多的命令行选项,那么你需要通过首先搜索“”来升级它并处理所有命令行开关......有时使用Application exe本地路径是有用的。你可以这样得到它:

    AnsiString exepath=ExtractFilePath(Application->ExeName);