0

我正在使用 Borland C++Builder 2006 编写数据记录器 GUI 软件。这是我公司想要的平台。

在我定义的扩展名为 ".evp" 的特定文件中进行一些分析后,我正在保存收到的数据。我在我的程序中定义了保存和打开功能,效果很好。

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

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

1 回答 1

1

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

  1. 文件关联存储在注册表中的某处

    请参阅创建注册表项以将文件扩展名与 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
        }
    

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

    AnsiString exepath=ExtractFilePath(Application->ExeName);

于 2015-10-21T07:48:43.957 回答