我正在为Windows SSPI API的.Net包装器工作。 几个API函数返回到期时间,例如,用于凭证或安全上下文到期。 过期时间存储在64位结构TimeStamp中 ,该时间戳自1601年1月1日00:00 UTC以来存储了100纳秒滴答的数量。 当我调用AcquireCredentialsHandle时 ,返回的TimeStamp的原始值很大 – 通常是一个值,例如0x7fffff154e84ffff ,例如HighPart = 0x7fffff15和LowPart = 0x4e84ffff 。 当转换为实时时,此值在30848年的某个地方。 有人知道为什么这个价值如此令人难以置信的高? 它看起来很可疑,因为它已经接近溢出一个有符号的整数了。 我检查了文档,看是否用来存储标志或其他结构化数据的任何东西,但我无法find任何东西。 API的其他部分有时会返回相似的值,有时会返回表示未来5分钟的值。 我应该提到,我正在使用这个API与Negotiate包,这可能会变成NTLM包,因为我的工作站不是域的一部分。
我正在开发复杂应用程序的多进程框架。 主机进程充当一个容器,一个或多个客户进程可以从中产生。 这样的访客进程的窗口重新映射到主机的窗口(例如笔记本tabSheet)。 (进程间通信在这里不是问题 – 它的工作原理)想象一下类似谷歌浏览器。 我已经阅读了许多有关在进程间重新设置窗口的答案,但我无法弄清楚在这种情况下发生了什么事情: 我的主机(容器)进程恰好在一些句柄上执行WaitForMultipleObjects ; 访客进程调用一个MessageBox ,但挂起。 访客进程是否不在单独的消息队列上运行? 我错过了什么? 我想我在embedded客户表单时遵循了有关SetParent的最佳指南: SetWindowLong(GuestHWnd, GWL_STYLE, GetWindowLong(GuestHWND, GWL_STYLE) and WS_EX_NOPARENTNOTIFY and (not WS_POPUP) or WS_CHILD); SetParent(GuestHWnd, HostHWnd); PostMessage(GuestHWnd, WM_UPDATEUISTATE, UIS_INITIALIZE, 0); SendMessage(HostHWnd, WM_UPDATEUISTATE, UIS_INITIALIZE, 0); SetWindowPos(GuestHWnd, 0, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE or SWP_NOZORDER or SWP_FRAMECHANGED); 还要注意,我还没有调用任何types的AttachThreadInput 。 如果主机未被阻止,或者如果访客窗口不是主机的子项(显然),则不会出现问题。 谢谢。
我的目标是钩OutputDebugStringA,所以我可以阅读任何消息传递给它。 我不是想要挂钩任何其他的过程,而是现在的过程,只是为了学习如何挂钩。 我没有使用Detours,我宁愿不使用它们,因为我想了解如何在更深层次上进行挂钩。 我正在使用这个代码钩: void MakeJMP(BYTE *pAddress, DWORD dwJumpTo, DWORD dwLen); void myCallback(LPCSTR s); DWORD dwAddr = (DWORD) GetProcAddress(GetModuleHandleA("kernel32.dll"), "OutputDebugStringA"); // I cast it to byte and later to DWORD so it adds 5 DWORD dwRetAddr = ((BYTE)dwAddr) + 5; // +5 because I will override 5 bytes void __declspec(naked) My_OutputDebugStringA(){ __asm{ mov edi, edi […]
我的Windows应用程序使用以下用于打开文件的C ++ / MFC代码: CFileDialog fd(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_EXPLORER, NULL, hParentWnd ? CWnd::FromHandle(hParentWnd) : NULL); fd.m_pOFN->Flags &= ~(OFN_FILEMUSTEXIST | OFN_ALLOWMULTISELECT | OFN_NODEREFERENCELINKS); fd.m_pOFN->Flags |= OFN_FILEMUSTEXIST; INT_PTR nRes = fd.DoModal(); //This call causes the warning 它运行良好,但我在VS 2008中的debugging器输出窗口中收到以下消息: MyApp.exe中0x00007ffb653d5bf8的第一次机会exception:0x000006BA:RPC服务器不可用。 这是我需要关心的吗?
截至2015年3月26日,问题解决了,看到这个页面底部,一个很脏的伎俩。 截至2014年8月18日,部分解决:DWM是罪魁祸首(见最后的评论)。 我已经使用win32 API构build了自己的窗口样式。 在Windows XP和Windows 7下一切正常。但是,在Windows 8下发生了奇怪的事情:拖动窗口的左边缘导致右侧极端的抖动,而不应该移动。 看看这个 ,你会明白我的意思。 当我拖动右边框时,左侧不会按原样移动。 诚然,有一些闪烁,但这是可以接受的。 看到这个 我用几个标志尝试了SetWindowPos()和(begin/End)DeferWindowPos ,但无济于事。 即使使用SWP_NOREDRAW并阻止所有其他绘画也无济于事。 无论有没有CS_HREDRAW和CS_VREDRAW 。 当然,我正在使用双缓冲。 然而摆脱这种讨厌的抖动似乎是不可能的。 我也尝试了另一个驱动程序的英特尔HD 4000graphics引擎,再次无济于事。 我忽略了什么? 这是Windows 8的错误吗? 顺便说一句,当我打开“拖动时显示窗口内容”选项(在“高级系统设置”菜单中),所有其他应用程序显示相同的行为。 任何帮助将不胜感激。 干杯,爱德蒙。 PS:禁用“拖动时显示窗口内容”是没有select的,因为它是build立在我的应用程序的function。 编辑1:似乎d7samurai正在与同样的问题挣扎。 跟进:我已经尝试了很多东西来摆脱抖动,但没有任何帮助。 问题是W8根本就没有做它应该做的事情。 以SWP_NOREDRAW标志为例。 正如所料,被移动的窗户边的重新粉刷被压制了,迄今为止这么好。 但是…(窗户的)另一边,这仍然是有效的,这个重新粉刷! 这不仅是完全不必要和无用的,而且是用抖动重新绘制的! 而且,绘画比W7和XP要慢两倍。 在这个问题上花了整整一周之后,我完全用W8完成了! 这真的是一个POC和负责这个烂摊子工作的人是精神错乱。 我真的希望W9能够做得更好。 阿门。 你不要这样: 看起来,上述exception并不仅限于W8。 当W7被设置为“最佳外观”或者至less“启用桌面组合”和“在窗口和button上使用视觉样式”时,W7也显示相同的行为。 然后我认为有可能根本不使用SetWindowPos函数,而是通过发送ShowWindow( hWnd, SW_MAXIMIZE )命令并拦截WM_GETMINMAXINFO消息来指定所需的大小和位置。 你猜怎么了? 我仍然有抖动。 唉! 接下来做什么? 是否有可能在较低/较深的层次(钩?)上截取绘画,以便以一种体面的方式重新绘制窗户? 更新日03-26-2015,一个非常肮脏的把戏: find了! […]
我正在为家庭用户开发一个应用程序。 而这个应用程序涉及到完全替代Windows资源pipe理器的自定义应用 我想模仿任务栏的行为。 例如,当您在记事本中单击最大化button时,它不会与任务栏重叠。 我已经尝试使用api到AppBar,但是,当Windows资源pipe理器没有运行,其他窗口与我的任务栏重叠时,AppBar api不起作用。 任何想法我怎么能做到这一点? 如果我可以限制最大化窗口的大小,当有帮助我。 问题是其他应用程序不总是由我写。
我经常从本机C ++ / Win32应用程序中调用ShellExecute来执行GUI中由最终用户select的任何shell项目。 项目是可执行文件/脚本或链接(.lnk)。 在某些对我来说SE_ERR_OOM情况下,以下函数有时会返回8 ( SE_ERR_OOM错误;只是非常简要的logging)。 结果,该项目不被执行。 什么可能导致这个错误? int doExecute(LPCTSTR file, LPCTSTR args, LPCTSTR workDir) { assert(file && *file); HRESULT hRes = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE); assert(hRes == S_OK || hRes == S_FALSE); int code = (int)ShellExecute(NULL, NULL, file, args, workDir, SW_SHOWNORMAL); doLog("ShellExecute returned: %d, %u", code, GetLastError()); // EDIT CoUninitialize(); return code; […]
正如标题所示,我在问什么可以通过点击屏幕上find。 更确切地说,能够检测到一个精确的元素(可以是在通用浏览器上打开新选项卡的+符号,或者在Open Office文档上的File然后Save as…元素)的点击并返回某种types点击了什么string? 通过使用Win32 API,我可以检测到鼠标左键是否被点击过: for(character=1; character<=222; character++) { if(GetAsyncKeyState(character) == -32767) { … switch(character) { case VK_LBUTTON: …; break; … } } } 当检测到点击的时候,我知道它被点击的地方(或者至less是发生点击的窗口的名称): void whichWindow(FILE *f) { HWND foreground = GetForegroundWindow(); char window_title[256]; if(foreground) { GetWindowText(foreground, window_title, 256); fputs(window_title, f); getMenuFromWindow(f, foreground); } else fputs("Problem retrieving window's title name", f); } 但是,我不知道点击了什么 […]
我有作为Windows服务运行的代码,想要确定直接连接的显示器的分辨率。 (是的,我明白,用户可能通过RDP,VDI等与机器交互,所以这并不总是有意义的 – 但这只是一种优化,所以在一般情况下,有一个直接连接桌面,它仍然是有用的。) 我想使用::GetSystemMetrics(SM_CXVIRTUALSCREEN)但它返回0,因为我在会话0中运行。同样, EnumDisplayDevices看起来像它只会用于目前的交互式会话。 即使没有用户login,我们也希望能够做到这一点。 有没有办法探索硬件屏幕分辨率甚至作为一项服务?
我目前正在研究一代垃圾收集器。 这意味着只有最近的对象被遍历,幸存的对象(从已知的根可到达)被提升到老一代。 当对象指向相同或更老的其他对象时,这可以正常工作。 但是,当较旧的对象指向较新的对象时,由于只有较新的对象才会被遍历,所以指向的对象将被错误地收集。 为了避免这种情况,这些对象在每个GC阶段被明确标记和遍历。 显然,这样的“父”对象是可变的,因为通过构造,不变的对象总是指向现有的对象。 所以要成为一个“父母”,一个对象必须在被升级之后被修改,以便它指向一个更新的对象。 要知道哪些老一代的对象指向年轻一代,我正在寻找一种透明地监视内存变化的方法。 为此,我使用内存保护和信号/exception处理。 内存页被设置为只读,这会导致一个信号/exception在写入时被触发,在这种情况下,我将内存保护设置为读写,并将地址logging在某个地方作进一步处理,并在返回代码exception恢复正常。 这样,当GC触发时,我知道在哪里寻找潜在的父母来遍历。 在Linux上,我使用了mprotect / SIGSEGV信号处理的组合。 在Windows上,我打算使用VirtualProtect,但没有find相应的SIGSEGV处理。 所以我的问题: 你将如何在Windows上做到这一点? exception处理API似乎相当混乱。 有没有更好的方法来知道哪些内存区域被修改,所以我不必做所有的簿记? 我的代码是用纯C编写的。目前我需要调用者代码来明确地标记修改的对象,但是这是单调乏味的,容易出错,所以我正在寻找一种透明的方式来做到这一点。 先谢了,弗雷德