c++ - 打开文件以在 C++ 中显示内容

标签 c++ windows winapi user-interface file-io

关于使用 C++ 打开文件(任何类型的文件),我有 2 个问题要问。我目前正在开发一个 GUI 程序,我想添加一个 txt 格式的更新日志。我还希望我的程序中有一个菜单,可以使用每个用户都安装的默认文本编辑器打开那个 changelog.txt,或者简单地把它打开那个文本文件。请记住,我想在输入/输出程序中打开文件进行显示 NOT。我知道我可以使用

system("notepad.exe filepath.txt");

或使用预设程序打开它们:

system("filepath.txt");

问题是这两个都在记事本后面打开命令行。我知道还有另一个命令可以使用名为 CreateProccess() 的 Win32 API 打开文件,但我的编译器无法识别该命令 (OpenWatcom W32)。 所以这是我的问题:

1) 在使用 system 命令时,是否有任何其他命令可以打开文件,或者有什么方法可以阻止命令行打开?

2) 在 Windows 中如何定义文本文件在当前程序文件夹中?我的意思是,与其提供会因用户而异的整个文件路径,还有什么方法可以“告诉”程序该文件始终位于程序所在的当前文件夹中?

对于任何错误,我深表歉意,如果您需要任何澄清,请告诉我。

最佳答案

CreateProcess 是在这里使用的错误函数。这将需要您决定运行哪个进程。用户可能更喜欢使用记事本以外的文本编辑器,我知道我喜欢!在 Windows 上执行此操作的正确方法是要求 shell 使用用户与文件相关联的任何程序打开文件。 ShellExecute函数执行此操作。

这样调用它:

ShellExecute(
    MainWindowHandle,
    "open",
    FullyQualifiedTextFileName,
    NULL,
    NULL,
    SW_SHOWNORMAL
);

您需要包含 Shellapi.h 头文件并链接到 Shell32.lib 库。如果您的编译器不包含这些文件,如果是这种情况我会感到惊讶,那么您可以从 Platform SDK 中获取它们。也就是说,如果您认真对待在 Windows 上进行编程,您应该获得一个可以让您访问 Windows API 的工具。

我确实建议您使用完全限定的路径来完成这样的任务。由于您的文本文件位于与可执行文件相同的目录中,因此您只需将该目录连接到您的文本文件名即可。通过调用 GetModuleFileName 获取可执行文件的完整路径为 hModule 参数传递 NULL

关于c++ - 打开文件以在 C++ 中显示内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9243897/

相关文章:

c++ - 我想用 CMake 生成和编译 Visual Studio 项目我需要从构建中排除单元测试文件。有没有办法做到这一点?

c++ - 有什么方法可以在考虑崩溃的情况下同步进程吗?

c++ - 检查加载的DLL是否是系统模块

c++ - remquo 结果没有意义

c++ - 一个接口(interface)包含大量虚方法?或者有很多接口(interface)只有 1 个虚拟方法?

c++ - 在C++中使用GSL最小化

c++ - 带有/SAFESEH 的自定义 SEH 处理程序

java - 从在 docker 容器内运行的应用程序连接到在本地运行的数据库

windows - 如何在Windows xp 上使用svn 命令行?

c++ - C/C++ 中的并发日志文件访问