- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个为 Windows 编写并使用 Visual Studio 编译的 C/C++ 程序。而且它是一个命令行工具,这意味着它可以合理地在 Cygwin Bash 下运行,可能在 MinTTY 中运行,并且它的一些用户现在正在这样做。
我想更改我的程序,使其更好地与 Cygwin 配合使用。
我的程序目前使用 Windows Console APIs输出漂亮的彩色文本并管理光标,并且通常是“交互的”(或 1980 年代定义的“交互”的“交互”),至少在其输出未通过管道传输到文件时是这样。
为了让我的程序更好地与 Cygwin 一起运行,我可以让它发出 ANSI \x1B[...
转义代码而不是调用控制台 API,但真正的问题是知道何时这样做。
我认为有四种情况:
作为交互式 Windows 控制台程序调用。 -->(使用控制台 API。)
作为普通 Windows 控制台程序调用,但用户在某处通过管道传输其输出。 -->(根本不发出任何样式或交互式调用。)
由 Bash 或 MinTTY 作为交互式程序调用。 -->(使用 ANSI 转义码。)
由 Bash 调用,但用户正在某处管道输出。 -->(根本不发出任何样式或交互式调用。)
我可以通过测试是否 GetConsoleMode()
来区分情况 1 stdout
成功或失败处理;如果成功,我肯定有一个 Windows 控制台,当我打开代码以使用控制台 API 时就是这种情况。
我想以不同的方式对待案例 3 并为其使用 ANSI 代码,但不幸的是,案例 2、3 和 4 似乎几乎无法区分:
stdout
handle 似乎只是一个不透明的对象 FILE_TYPE_PIPE
对于所有三种情况。OSTYPE
环境变量,至少我猜我在 Cygwin 下,这将案例 2 与案例 3 和案例 4 区分开来。cygwin1.dll
, 我也许可以用它的 isatty()
,但我无法对此进行链接,因为我的许多用户没有(也不会)安装 Cygwin。 (我是 not at all convinced that'd work,即使这是可能的。)_isatty()
认为 Cygwin Bash 是一个管道,而不是一个交互式 shell,因为它只使用 GetFileType()
深入引擎盖。简而言之,我看不到区分案例 3 和案例 4 的明显方法。
现在,我对待案例 3 的方式与案例 2 和案例 4 完全相同,而 Cygwin 用户(包括我自己)得到的是蹩脚的玻璃电传打字机交互,而不是友好的交互式全屏显示,我真的很想解决这个问题。
那么有什么方法可以区分交互式 Cygwin 调用和其他调用,这样我的 native Windows 程序在被 Cygwin Bash 或其他类似 shell 调用时可以正常运行吗?
(重要说明:有一种不在考虑范围内的解决方案:程序不会被编译作为 native Cygwin 程序。这是一个 Windows 程序,它是用 Microsoft 工具链编译的,不会用 GCC 编译。目标是更改/更新它以使其在 Cygwin 下尽可能好地运行 - 而无需实际链接针对任何 Cygwin DLL。我只能合理地为 Windows 分发一个可执行文件,而不是两个。)
最佳答案
If I could link against cygwin1.dll, I could maybe somehow use its isatty(), but I can't link against that, since many of my users don't (and won't) have Cygwin installed. (And I'm not at all convinced that'd work even if it was possible.)
好的,您不能静态链接到该 DLL,但这并不意味着您不能尝试动态加载它。
您可以尝试LoadLibrary("cygwin1.dll")
。如果失败,那么它没有在 cygwin 下运行,您可以使用 native Windows 函数来检测控制台类型。
另一方面,如果您可以打开该库(这意味着 Cygwin 在当前系统中可用),那么您就可以动态调用 isatty()
并使用结果以查看输出是否被重定向。
编辑:加载 cygwin DLL 并调用函数并不容易,您需要先初始化库,如本 link 所示。
摘录:
static BOOL setup_root()
{
HMODULE hCygwin = NULL;
// Load the cygwin dll into our application.
if(!load_cygwin_library(&hCygwin))
return FALSE;
// Init the cygwin environment. (Required)
if(!init_cygwin_library(hCygwin))
return FALSE;
两个有趣的初始化例程。如果未调用 init_cygwin_library
,则进一步的调用可能不起作用:
static BOOL load_cygwin_library(HMODULE* hCygwin)
{
if((*hCygwin = GetModuleHandleW(cyglibrary)) == NULL)
if((*hCygwin = LoadLibraryW(cyglibrary)) == NULL)
return FALSE;
return TRUE;
}
static BOOL init_cygwin_library(HMODULE hCygwin)
{
cygwin_dll_init_fn cygwin_dll_init = NULL;
if((cygwin_dll_init = (cygwin_dll_init_fn)GetProcAddress(hCygwin,"cygwin_dll_init")) == NULL) {
FreeLibrary(hCygwin);
return FALSE;
}
cygwin_dll_init();
return TRUE;
}
关于c - 我如何与 Cygwin 相处融洽?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45223868/
假设我有一个在 cygwin 下编译的应用程序,并且我想在不让用户安装 cygwin 的情况下分发该应用程序。打包可执行文件和 cygwin DLL 就足够了吗? 最佳答案 事情发生了变化。 Cygw
我从一个镜像站点下载了 cygwin,几个月后,当我尝试更新时,我收到一条消息:“当前 ini 文件来自较新版本的 setup-x86_64.exe” 如果我下载了新的 ini 文件,是否也意味着必须
有什么办法可以回去安装旧版本的 Cygwin? 说我想要 1.7.9 版本,但是 setup.exe在 Cygwin 网站上总是指向最新版本? 最佳答案 http://www.cygwin.com/s
我试图从我的C++代码运行这两个.data文件进行分配。我已经获得了所有文件,并且仅打算为程序实现一些功能(所有内容都应能够运行make命令进行编译)。 我曾经运行过MAC,只是刚开始使用Window
关闭。这个问题是off-topic .它目前不接受答案。 想改善这个问题吗? Update the question所以它是 on-topic对于堆栈溢出。 8年前关闭。 Improve this q
当我尝试对CVS管理的文件使用Emacs 23.2.1下的ediff-revision时,在*ediff-errors*框架中收到以下错误,而不是直接开始到ediff结果: cygwin warnin
我一直在用 Cygwin (许久)。具体来说,我在Win7上使用它(包括gcc/g++)进行开发工作。我最近才注意到现在存在一个 64-bit version . 我没有特定的需求要求我过渡到 64
我从安装程序 2.905 安装了 cygwin 3.1.7 64 位,如果我不使用 grep --color=always 我在终端中看不到彩色输出,即 grep - -color=auto 在我的终
如何使用 cygwin 挂载软盘镜像文件。我想挂载镜像,将文件复制到挂载的驱动器,然后从命令行卸载它。 我知道你可以使用 Virtual Floppy Drive在 Windows 中,但有没有办法在
这个question说明cygwin的软链接(soft link)和ntfs的junctions有些不同。我希望 cygwin 创建一个真正的连接点。我想过运行mklink但是,见鬼,没有mklink
我想设置一组最小的 cygwin 应用程序(ls、diff、path、find、grep),以便它们在没有完整 cygwin 安装的机器上运行。 我假设我需要的只是相关的 *.exe 文件和 *.dl
我的机器设置可以运行 cmake 和 gcc,我想在构建机器上安装具有完全相同的包和参数集的 cygwin,也可能在其他开发机器上。有没有一种方法可以做到这一点,而不必使用提供的 Setup.exe
我正在尝试使用 Cygwin 运行 Nutch。我在设置 JAVA_HOME 时遇到问题。 $ export JAVA_HOME='/cygdrive/f/program files/java/jd
如果您尝试“全局”安装 Composer,则它无法在 Cygwin 中正确运行。 将 composer.phar 放入/usr/local/bin/composer 中,然后尝试运行它会导致错误: C
要为 Cygwin 安装其他软件包,我是否只需要运行 setup.exe再次从包列表中选择? 此外,就安装 2 个 Cygwin 实例或此类问题而言,这样做不会损害我的计算机(我对这些事情有点菜鸟)。
我刚刚安装了 Cygwin,bash 提示符中的主目录看起来位于我的 Z: 驱动器上。这不是我想要的。 如何更改此设置? 最佳答案 Starting with Cygwin 1.7.34 ,建议的方法
cygwin 上的当前目录是 home/myuser。我导航到 cygwin,发现它有一个名为 home/myuser 的目录,我不知道如何导航到桌面。我不想在那里添加桌面目录,而且我无法在根文件夹
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我使用当前版本的 Cygwin,1.7.9-1。 当我输入“$ which python”时,Cygwin 输出“/usr/bin/python”。 为了确认根目录是我的 Windows 7 文件系统
我想在 Windows 中使用 cmd 做类似的事情: start dir c:\ 应打开一个新控制台,并显示 dir c: 的输出。 对于 Cygwin 我尝试了这个: cmd /c start b
我是一名优秀的程序员,十分优秀!