Articles of winapi

在Ubuntu linux下用C / C ++编程

如何显示在Ubuntu的每个分区的开始部分?就像在Windows中有一个API调用C / C ++的磁盘结构..任何build议将帮助完整。

更改目录时间/date

我在Windows(XP)和Linux上都试过utime() 。 在Windows上,我得到一个EACCES错误,在Linux上我没有得到任何错误(但时间没有改变)。 我的utime()代码很好,因为它在文件上工作。 我无法findutime()是否应该在目录上工作,但如果不是,我该如何更改时间和date? 我正在寻找一个理想的Windows和Linux的解决scheme,但如果不是,我总是可以使用一些操作系统特定的代码。 utime似乎确实可以在Linux上工作,但它似乎不适用于我,因为我在该目录中移动文件,并将时间戳记更新为当前时间。

在Windows和其他Unix版本中实现mmap的`MAP_POPULATE`标志,在Windows中使用MADV_WILLNEED

Linux mmap(2)有一个有用的标志: MAP_POPULATE ,当指定时,将默认所有我们分配的页面。 其他的Unices系统没有这个标志,除了有一个名为MAP_PREFAULT_READ的等价标志的FreeBSD。 如果我想在Windows和其他Unices系统中实现这种行为,我怎样才能以最好的方式做到这一点? 我想了2种可能的方法: 1)最便携的:只要做一个循环,在每个分配的页面的基地址写一个'\ 0'字符(也是最慢的实现,如果页面很多)。 这也会有一些不好的影响,我现在没有看到? 2)在madvise()+MADV_WILLNEED上调用madvise()+MADV_WILLNEED 。 不幸的是,这个组合的等价Windows版本没有:在Windows上,你只有VirtualAlloc()+MEM_RESET ,这相当于madvise()+MADV_DONTNEED但是你没有madvise()+MADV_WILLNEED来调用,因为even必须调用VirtualAlloc()+MEM_RESET ,在同一范围的内存上调用VirtualAlloc()+MEM_RESET之后,否则行为是不确定的。 所以,还有另外一个问题的空间:有一个相当于madvise()+MADV_WILLNEED Windows不仅用于这种情况,而且一般来说,作为告诉Windows“看,我需要这些页面”的一种方式? 有什么想法吗?

如何在Mac OS X和Linux上编程鼠标?

我知道如何使用C或Ruby编程单击Win32(以编程方式点击屏幕)。 有没有人知道如何在Mac OS X和Linux上做这个比较? 谢谢。

我是否可以使用O_DIRECT进行写入请求,以避免在电源故障期间丢失数据?

我们希望尽我们所能,以避免在断电期间丢失数据。 所以我决定使用O_DIRECT标志来打开一个文件在磁盘上写入数据。 O_DIRECT是否意味着数据完全绕过OScaching? 如果请求向应用程序返回成功,是否意味着数据必须刷新到磁盘? 如果我在一个文件系统中打开一个常规文件,FS元数据如何? 它也被立即刷新,还是被caching? 顺便说一下,O_DIRECT可以在Windows中使用? 或者在Windows中有没有相应的方法?

很好的使用线程?

我有一套非常昂贵的操作,但都非常独立。 其中一些依赖于一些“全球”国家或数据,但都是非常只读的。 我相当肯定的操作本身都可以并行完成,但是所有的操作都需要在程序前进到某一点之前完成。 在这里增加multithreading的额外工作和危险是值得的,特别是因为主线程将不得不阻塞并等待呢? 其他问题是,这个应用程序很可能必须在Windows和Linux上运行,我不确定这是值得使用两个不同的线程系统添加代码的复杂性。

关于档案寻找职位的问题

我以前的问题是关于原始数据的读写,但是出现了一个新的问题,好像没有结局…. 问题是:像lseek()或fseek()这样的函数的参数都是4个字节。 如果我想移动跨越4G,这是不可能的。 我知道在Win32中,有一个函数SetPointer(…,Hign, Low,….) ,这个指针可以产生64字节的指针,这就是我想要的。 但是,如果我想创build一个应用程序在Linux或Unix(创build一个文件或直接写入原始驱动器扇区),我怎样才能移动到4G的指针? Thanx,等待你的回复…

从Linux库源构build一个Win32 DLL

我试图从audioDSP相关的Linux库( http://breakfastquay.com/rubberband/ )build立一个Win32 DLL。 有Linux的makefile和configuration脚本,但没有Windows的帮助。 作者提供了一个使用该库的示例应用程序的Win32二进制文件,并且我看到一些散落在附近的“#ifdef MSVC”和“#ifdef WIN32”,所以我不认为我是从头开始的,米卡住了。 由于我在这两个平台的编程知识相当有限,所以我会很感激任何帮助。 首先,在这里开始的正确方法是什么? 视觉工作室? Cygwin的? 最初,我开始在Visual Studio中创build一个Win32 DLL项目,添加源文件,考虑添加一个.def文件等,但在某些时候,我觉得这是无济于事。 至于Cygwin,这是第一次使用它,我甚至不知道这是Cygwindevise的。 是吗? 在Cygwin上,我运行了./configure并卡住了这样的东西: “检查SRC …configuration:错误:不符合软件包要求(采样率):没有find软件包”采样率“ 看完日志后,看来pkg-config正在查找samplerate.pc。 如何在Windows中处理包? libsamplerate只是一个开源的库,我有这个源代码和一个DLL。 但我不知道如何使用它们来满足librubberband的依赖性要求(这是我正在尝试构build的) 我完全失去了这一点,如果任何人都可以给我一个正确的方向,并有一个更简单的方法来做到这一点? 提前谢谢了。

是否有与MulDiv for Linux相当的function?

Windows API中的MulDiv便捷函数等同于(a*b)/c ,但它将a*b的中间结果存储在64位variables中,然后再除以c以避免整数溢出,其中a*b大于MAX_INT但(a*b)/c不是。 WINBASEAPI int WINAPI MulDiv( _In_ int nNumber, _In_ int nNumerator, _In_ int nDenominator ); 在Linux下编程时,是否有相当的便利function?

为什么在Win32中使用`GetAsyncKeyState()`时,我的热键会出错?

main.c中: #include <stdio.h> #include <windows.h> #include <stdbool.h> int main(void) { while (true) { if (GetAsyncKeyState(VK_CONTROL)) { if (GetAsyncKeyState('1')) { printf("Set grenades to 100!\n"); Sleep(500); } } Sleep(100); } return 0; } 我已经尝试在mingw和VS编译器之间的debugging和发布模式之间进行切换,我厌倦了C和C ++。 在所有情况下都会发生同样的错误。 这个想法是这样的:热键是Control + 1.当用户同时按下Control键和1键时,我需要代码printf("Set grenades to 100!\n"); 被跑。 但是,有一个错误。 如果用户按下并释放1键。 等待任何时间(秒,分钟),然后按下控制键, printf("Set grenades to 100!\n"); 被执行。 即使用户按下键之间也会发生此错误。 例如: printf("Set grenades to 100!\n"); […]