0

Borland C++Builder 2006 を使用してデータ ロガー GUI ソフトウェアをプログラミングしています。これは私の会社が希望するプラットフォームです。

定義した拡張子を「.evp」として特定のファイルに分析した後、受信したデータを保存しています。プログラムで Save 関数と Open 関数を定義しましたが、正常に動作しました。

現在、ソフトウェアを使用せずに保存したファイルを直接開く方法に問題があります。つまり、保存したファイルをダブルクリックすると、ソフトウェアで自動的に開き、データが表示されます。次に、2 つの質問があります。

  1. 私のソフトウェアでこの「.evp」ファイルを開くように Windows に指示する方法。
  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 に答える