如何在程序中打开用户自定义的扩展文件?
How Open a user-defined extension file in Program?
我正在使用 Borland C++Builder 2006 编写数据记录器 GUI 软件。这是我公司需要的平台。
在我定义的扩展名为“.evp”的特定文件中进行一些分析后,我正在保存接收到的数据。我在我的程序中定义了保存和打开功能,效果很好。
现在我遇到了如何在不使用我的软件的情况下直接打开我保存的文件的问题。我的意思是当我双击保存的文件时,它会自动用我的软件打开并显示数据。然后是两个问题:
- 我如何告诉 windows 用我的软件打开这个“.evp”文件。
- 我如何在我的软件中处理打开的文件并使用我定义的打开函数。
Borland C2006
你是说 Embarcadero BDS2006 Turbo(explorer) C++
?
文件关联存储在注册表中的某处
参见 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;
}
所以 experiment/use RegCreateKeyEx
而不是 RegOpenKeyEx
。强烈建议首先在与 windows 无关的一些自己的注册表项上进行试验,这样你就不会把事情搞砸了。并且只有在工作时才应将条目名称更改为所需位置。
应用端
转到您的应用程序源文件(在 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 可以从整个项目访问(在任何 window/form 中)。现在要提取要打开的文件,您只需在 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);
我正在使用 Borland C++Builder 2006 编写数据记录器 GUI 软件。这是我公司需要的平台。
在我定义的扩展名为“.evp”的特定文件中进行一些分析后,我正在保存接收到的数据。我在我的程序中定义了保存和打开功能,效果很好。
现在我遇到了如何在不使用我的软件的情况下直接打开我保存的文件的问题。我的意思是当我双击保存的文件时,它会自动用我的软件打开并显示数据。然后是两个问题:
- 我如何告诉 windows 用我的软件打开这个“.evp”文件。
- 我如何在我的软件中处理打开的文件并使用我定义的打开函数。
Borland C2006
你是说 Embarcadero BDS2006 Turbo(explorer) C++
?
文件关联存储在注册表中的某处
参见 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; }
所以 experiment/use
RegCreateKeyEx
而不是RegOpenKeyEx
。强烈建议首先在与 windows 无关的一些自己的注册表项上进行试验,这样你就不会把事情搞砸了。并且只有在工作时才应将条目名称更改为所需位置。应用端
转到您的应用程序源文件(在 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 可以从整个项目访问(在任何 window/form 中)。现在要提取要打开的文件,您只需在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);