Tag: windows

带或不带MSYS的MinGW makefile(del vs rm)

我正在使用MinGW在Windows上编译一些东西。 我直接从cmd.exe调用mingw32-make ,一切(我需要)工作正常。 但是我发现我需要能够从MSYS环境进行编译,而且我遇到了copy和del命令无法识别的问题。 我知道只需用cp和rm替换它们,但我想在两种情况下使用单个makefile。 有没有办法强制msys环境调用system del和cp命令? 或者更好的是,有没有办法区分是否从cmd.exe或msys调用makefile? 我可以为命令设置适当的变量。 这将非常有用,因为我可以删除一些其他重复的makefile。 任何帮助表示赞赏。 谢谢 编辑:并使事情变得更加困难: mingw32-make似乎使用sh.exe如果在从cmd.exe运行时在PATH中找到。 这有完全不同的环境变量集。 编辑:好的,如果有人仍然感兴趣,我最终得到了以下文件,我将其包含在我的其他Makefile中: ifeq ($(OS),Windows_NT) RM = del /Q /F CP = copy /Y ifdef ComSpec SHELL := $(ComSpec) endif ifdef COMSPEC SHELL := $(COMSPEC) endif else RM = rm -rf CP = cp -f endif 如果没有,你仍然认为这是一个重复的问题,我当然可以删除这个问题。 由于我不知道的原因, ComSpec和COMPSPEC有所不同。

如何从超时的Windows命名管道读取?

我试图在Unix中将一些非常容易的东西移植到Windows:当没有任何事情发生时,从超时读取命名管道(fifo)。 我试图以一种简单的方式(使用PeekNamedPipe ),而不使用重叠的IO。 这可能吗? 以下是一个完整的例子。 它暂时不起作用:没有收到书面字符串,读者也会收到 ERROR_NO_DATA 232(0xE8)管道正在关闭 在第一次阅读之后,作者在经过一些尝试后得到了这个 ERROR_SEM_TIMEOUT 121(0x79)信号量超时期限已过期 测试编写器(管道客户端): #include “Windows.h” #include #include #include int main() { HANDLE hpipe; DWORD written; const char *pname = “\\\\.\\pipe\\isp-control”; char msg[] = “play asdf.wav”; printf(“waiting for pipe %s\n”, pname); bool stat = WaitNamedPipeA(pname, 4000); printf(” –> %d, error %d\n”, stat, GetLastError()); if (stat) { hpipe […]

为什么内存对齐会在结构中发生变化?

在前一个问题中 ,我了解到当具有8字节对齐的结构嵌入到具有4字节对齐的另一个结构中时,在8字节对齐结构之前需要填充。 了解。 至少我以为我明白了。 VS 2012文档说: 对于结构,联合和数组,对齐要求是其成员的最大对齐要求。 所以,如果我有这样的结构: typedef struct s_inner { unsigned long ul1; double dbl1; fourth_struct s4; unsigned long ul2; int i1; } t_inner; 我希望这个结构的所有成员都是8字节对齐的,因为double是8字节对齐的。 但我的记忆转储告诉我这个: t_inner从地址1B8开始: 1B8 : unsigned long 1B8被填充,因为结构是8字节对齐的 1C0 : double 1C0消耗8个字节 1C8 : fourth_struct如下, 它具有4字节对齐 到目前为止,一切都如预期。 但是现在t_inner内部的对齐开关 :在地址1E8 ,我希望在这里只找到unsigned long int ,填充4个字节,以便后面的int也在8个字节上对齐。 但似乎对齐现在已经改变,因为unsigned long整数不携带填充字节。 相反,以下int以4字节对齐方式放置。 为什么对齐开关在t_inner ? 这里适用哪条规则?

mingw32-g ++。exe:错误:CreateProcess:再没有这样的文件或目录

我已经搜遍了所有,无法找到解决方案。 我用编译器安装了code :: blocks版本。 (Windows 7)每次我尝试编译时,都会收到No Such文件或目录错误。 我想也许空间导致了这个问题,所以我下载并安装了ming到C:\ GCC \ MinGW-w64 我进入了编译器设置/工具链可执行文件并指导了每个路径,因此它不会尝试从安装了code :: blocks的Program Files中读取。 发生了同样的错误 我也尝试过直接进入bin文件夹。 我已重置为默认设置。 我已经自动检测到了。 我已经卸载并重新安装。 我认真对待一切。 然后我想也许是因为它是我保存项目的地方,因为它们有空格。 所以我把它们直接放到c:\驱动器上。 同样的错误。 这是在我使用它的第一天起作用,之后就是这个问题。 所以你认为重新安装一切都会解决它吗? 如果有人有解决方案,请告诉我们! 在另一台计算机上使用完全相同的安装文件,编译器工作正常,每个设置与此设置完全相同,除了它工作的另一个。 这是错误消息。 我做了一个快速控制台项目只是为了发布这些错误。 ||=== Build: Debug in hhhh (compiler: GNU GCC Compiler) ===| CreateProcess||No such file or directory| ||=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 0 […]

创建DLL以在两个进程之间共享内存

我需要使用DLL的function类似于Linux共享内存。 我的Windows编程经验很少,但我认为可以实现我的目标。 我想要类似下面的内容: DLL int x; void write(int temp) { x = temp } int read() { return x; } 过程1: LoadDLL(); write(5); //int x = 5 now 过程2: LoadDLL(); printf(read()); //prints 5 since int x = 5 from Proccess 1 当然,这个例子忽略了竞争条件等,但有一种简单的方法可以解决这样的问题吗? 我将使用Microsoft Visual Studio 10来创建DLL。 有人可以解释我怎么写这么简单的东西并将其构建成一个可以加载和调用的DLL类似于上面的伪代码? 编辑 :无法使用共享内存段和内存映射文件,因为我创建的进程在LabVIEW和Lua中不支持上述内容。 但是,它们确实支持DLL,这就是我需要这种“过时”方法的原因。

重叠I / O的GetOverlappedResult(bWait = TRUE)vs WaitForSingleObject()

当我在Win32 api上以OVERLAPPED方式打开和读取文件时,我有几种方法来完成IO请求,包括使用等待文件句柄(或重叠结构中的事件) WaitForSingleObject GetOverlappedResult ,bWait = TRUE 这两个函数似乎都有相同的效果:线程停止直到句柄或事件发出信号,这意味着数据被放在提供给ReadFile缓冲区中。 那么区别是什么呢? 为什么我需要GetOverlappedResult ?

为什么这个BitBlt示例不再起作用?

我现在正在使用Petzold的书(第5版)回到一些Windows编程。 我使用BitBlt编译了以下示例 ,它不能正常工作。 它应该复制Window的(CxSource,CySource)大小的图标并在整个窗口的表面上复制它。 实际上,使用Windows 7会发生什么,窗口下方的位图会被获取并复制到绘图表面,即hdcClient。 我不明白为什么它表现得像这样知道很明显传递给BitBlt的DC是hdcWindow,它指的是通过当前应用程序的GetWindowDC(hwnd)获得的设备上下文。 我首先想到的是,默认情况下启用了透明度模式,但是停用它并不会改变任何东西。 BitBlt似乎总是占据应用程序窗口下方的表面! 我不明白! :)任何人都知道为什么它的工作原理以及如何修复它?

SetWindowsHookEx函数返回NULL

我正在处理DLL注入,但得到错误 无法挂钩进程:87参数不正确。 目标进程以及dll都是64位。 注入代码是: BOOL HookInjection(TCHAR target[], TCHAR *dll_name) { // https://msdn.microsoft.com/en-us/library/windows/desktop/ms644990(v=vs.85).aspx // SetWindowsHookEx can be used to inject a DLL into another process. A 32 – bit DLL cannot be injected into a 64 – bit process, // and a 64 – bit DLL cannot be injected into a 32 – bit process.If an […]

如何用C ++打开文件夹

我需要打开一个显示特定文件夹的资源管理器窗口,让我们说”C:\\Windows”我应该用什么function来实现我的目标? 我正在使用Windows所以可以使用API​​,我也可以使用boost,但我不能使用C ++ 11。

如何将argv转换为CreateProcess的lpCommandLine参数?

我想编写一个启动另一个应用程序的应用程序。 像这样: # This will launch another_app.exe my_app.exe another_app.exe # This will launch another_app.exe with arg1, arg and arg3 arguments my_app.exe another_app.exe arg1 arg2 arg3 这里的问题是我在我的main函数中得到char* argv[] ,但是我需要将它合并到LPTSTR以便将它传递给CreateProcess 。 有一个GetCommandLine函数,但我无法使用它,因为我从Linux移植代码并绑定到argc/argv (否则,对我来说这是一个非常难看的黑客)。 我无法轻易地手动合并参数,因为argv[i]可能包含空格。 基本上,我想要CommandLineToArgvW的反向。 有没有标准的方法来做到这一点?