共4页: 1 2 3 4 
re: HOOK技术的一些简单总结 Richard Wei 2016-08-19 12:23
@陈利敏
可以用先用API Monitor 或者WinDbg的API断点看看对方程序是如何工作的
re: 消息发送杂谈 Richard Wei 2016-05-11 12:18
这里有意思的地方在于面对着一个com对象,你居然没有办法知道到它究竟实现了多少接口。微软自己也也意识到了这个问题, 于是WinRT里就有了IInspectable::GetIids, https://msdn.microsoft.com/en-us/library/br205822(v=vs.85).aspx
re: 挖坑,有空填坑 Richard Wei 2016-05-10 16:51
欢迎回来...
re: 如何抓取扬声器的声音 Richard Wei 2016-01-05 19:36
@josanna
不行就开线程吧,还不行可以尝试提高线程的优先级
re: 客户端技术的一点思考 Richard Wei 2015-12-11 15:35
@游戏狗…
这个需要DUILib库的开发为每个控件实现IAccessible接口,自动测试再通过这个接口查询和操作控件, 思路就那样,手头现成的Demo也我没有.
re: 客户端技术的一点思考 Richard Wei 2015-12-11 14:17
@谢应彪
要点我在这篇文章里都说了 http://www.cppblog.com/weiym/archive/2014/11/15/208885.html

我们的Windows Client就是基于开源的DUILib的, 有兴趣可以试用下 zoom.us
re: 客户端技术的一点思考 Richard Wei 2015-09-18 21:24
@春秋十二月
是的,计算机技术的变化可以说很快,也可以说很慢。快的方面来说,各种新语言新技术新平台层出不穷,好像三天两头在变;慢的方面来说,数据结构和算法,语言范型,网络协议,冯诺依曼体系结构等几十年来都很稳定,练好内功才能以静制动。
@longjoy
按我上面说的做就可以了支持了,公司内部代码,外面应该下载不到...
@test
看来确实是历史原因, 不过对于运行期的程序来说,个人倒是更赞同Windows的做法,忽略内存因素,Windows的UCS2编码相对于其他平台的UTF8更统一和高效。
re: 基于WinDbg的内存泄漏分析 Richard Wei 2015-01-12 16:38
@lchen
这个没啥好方法, 感觉只能通过查看每个堆建立时的堆栈情况来判断
试了下, 貌似就是这样的。实在不行就不要Destroy B了, 用Hide B替代吧
re: 面向对象锁框架的设计与实现 Richard Wei 2014-12-31 14:49
@春秋十二月
理解, 基础库大量用模板我也没反对...
re: 面向对象锁框架的设计与实现 Richard Wei 2014-12-31 09:23
哈哈, 我现在也比较趋向简单的设计, 有时间玩模板的奇淫技巧, 还不如花时间解决几个实际的问题。
曾经思考过C++的编程风格: http://www.cppblog.com/weiym/archive/2013/04/27/199781.html
@bukebushuo
不知道老弟的界面库卖的怎么样了。

DUI支持读屏我已经做了, 就按我上面说的方法。
实际上QQ的界面库也是支持读屏的,有兴趣的话可以在win7/win8上尝试 “控制面板\轻松使用\轻松使用设置中心\启动讲诉人”, 然后在QQ上通过Tab切换控件焦点。
re: 一个高效的内存池实现 Richard Wei 2014-09-23 22:09
@duanyuncanyang
memory pool 本身只负责内存分配,是给对象的operate new 和operate delete调用的,具体参见上面的测试代码
re: 关于SEH的简单总结 Richard Wei 2014-09-22 13:18
@cc
本来就是, C++异常只能捕获软件异常, 硬件异常(如除零,空指针访问)用操作系统的SEH捕获。
re: Windbg实用手册 Richard Wei 2014-09-16 17:31
有人提到中文中夹杂英文的问题,不多说了,在外企呆过的同学应该都会不自觉地有这个习惯,并且有时候错误的中文还不如用原始的英文。
re: HOOK技术的一些简单总结 Richard Wei 2014-05-27 19:57
@allen
刚才有简单测试了下, 测试代码如下:
D3DPRESENT_PARAMETERS ps = {0};
ps.Windowed = TRUE;
ps.SwapEffect = D3DSWAPEFFECT_DISCARD;
ps.BackBufferFormat = D3DFMT_UNKNOWN;

pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL
, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &ps, &g_pD3dDevice);
if(g_pD3dDevice == NULL) break;


LPDIRECT3DDEVICE9 pNewD3dDevice = NULL;
pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL
, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &ps, &pNewD3dDevice);

创建了2个IDirect3DDevice9对象, 然后分别打印它们的虚表指针和内容:

0:000> ?? g_pD3dDevice
struct IDirect3DDevice9 * 0x02815c00
+0x000 __VFN_table : 0x0281899c
0:000> ?? pNewD3dDevice
struct IDirect3DDevice9 * 0x0241bfe0
+0x000 __VFN_table : 0x0241ed7c
0:000> dps 0x0281899c
0281899c 6fe56f19 d3d9!CBaseDevice::QueryInterface
028189a0 6fe56992 d3d9!CBaseDevice::AddRef
028189a4 6fe56969 d3d9!CBaseDevice::Release
028189a8 6fe72587 d3d9!CBaseDevice::TestCooperativeLevel
028189ac 6ff0c6ad d3d9!CBaseDevice::GetAvailableTextureMem
028189b0 6ff49c8f d3d9!CD3DBase::EvictManagedResources
028189b4 6fe6b1c5 d3d9!CBaseDevice::GetDirect3D
028189b8 6fe56ff8 d3d9!CBaseDevice::GetDeviceCaps
028189bc 6fe8d144 d3d9!CBaseDevice::GetDisplayMode
028189c0 6fe7084e d3d9!CBaseDevice::GetCreationParameters
028189c4 6ff0bb74 d3d9!CBaseDevice::SetCursorProperties
028189c8 6ff0c04d d3d9!CBaseDevice::SetCursorPosition
028189cc 6fe8def0 d3d9!CBaseDevice::ShowCursor
028189d0 6fe6e9a0 d3d9!CBaseDevice::CreateAdditionalSwapChain
028189d4 6fe69ac7 d3d9!CBaseDevice::GetSwapChain
028189d8 6fe993ca d3d9!CBaseDevice::GetNumberOfSwapChains
028189dc 6feaf251 d3d9!CBaseDevice::Reset
028189e0 6fe9a064 d3d9!CBaseDevice::Present
028189e4 6feb1418 d3d9!CBaseDevice::GetBackBuffer
028189e8 6fe6bfe9 d3d9!CBaseDevice::GetRasterStatus
028189ec 6ff0c139 d3d9!CBaseDevice::SetDialogBoxMode
028189f0 6ff0c3bf d3d9!CBaseDevice::SetGammaRamp
028189f4 6ff0c4fd d3d9!CBaseDevice::GetGammaRamp
028189f8 6fe85ddb d3d9!CBaseDevice::CreateTexture
028189fc 6ff0ca68 d3d9!CBaseDevice::CreateVolumeTexture
02818a00 6feacb2d d3d9!CBaseDevice::CreateCubeTexture
02818a04 6fe72d69 d3d9!CBaseDevice::CreateVertexBuffer
02818a08 6fe732e6 d3d9!CBaseDevice::CreateIndexBuffer
02818a0c 6fea0127 d3d9!CBaseDevice::CreateRenderTarget
02818a10 6ff0cd88 d3d9!CBaseDevice::CreateDepthStencilSurface
02818a14 6ff0e0e0 d3d9!CBaseDevice::UpdateSurface
02818a18 6fe846ab d3d9!CBaseDevice::UpdateTexture
0:000> dps 0x0241ed7c
0241ed7c 6fe56f19 d3d9!CBaseDevice::QueryInterface
0241ed80 6fe56992 d3d9!CBaseDevice::AddRef
0241ed84 6fe56969 d3d9!CBaseDevice::Release
0241ed88 6fe72587 d3d9!CBaseDevice::TestCooperativeLevel
0241ed8c 6ff0c6ad d3d9!CBaseDevice::GetAvailableTextureMem
0241ed90 6ff49c8f d3d9!CD3DBase::EvictManagedResources
0241ed94 6fe6b1c5 d3d9!CBaseDevice::GetDirect3D
0241ed98 6fe56ff8 d3d9!CBaseDevice::GetDeviceCaps
0241ed9c 6fe8d144 d3d9!CBaseDevice::GetDisplayMode
0241eda0 6fe7084e d3d9!CBaseDevice::GetCreationParameters
0241eda4 6ff0bb74 d3d9!CBaseDevice::SetCursorProperties
0241eda8 6ff0c04d d3d9!CBaseDevice::SetCursorPosition
0241edac 6fe8def0 d3d9!CBaseDevice::ShowCursor
0241edb0 6fe6e9a0 d3d9!CBaseDevice::CreateAdditionalSwapChain
0241edb4 6fe69ac7 d3d9!CBaseDevice::GetSwapChain
0241edb8 6fe993ca d3d9!CBaseDevice::GetNumberOfSwapChains
0241edbc 6feaf251 d3d9!CBaseDevice::Reset
0241edc0 6fe9a064 d3d9!CBaseDevice::Present
0241edc4 6feb1418 d3d9!CBaseDevice::GetBackBuffer
0241edc8 6fe6bfe9 d3d9!CBaseDevice::GetRasterStatus
0241edcc 6ff0c139 d3d9!CBaseDevice::SetDialogBoxMode
0241edd0 6ff0c3bf d3d9!CBaseDevice::SetGammaRamp
0241edd4 6ff0c4fd d3d9!CBaseDevice::GetGammaRamp
0241edd8 6fe85ddb d3d9!CBaseDevice::CreateTexture
0241eddc 6ff0ca68 d3d9!CBaseDevice::CreateVolumeTexture
0241ede0 6feacb2d d3d9!CBaseDevice::CreateCubeTexture
0241ede4 6fe72d69 d3d9!CBaseDevice::CreateVertexBuffer
0241ede8 6fe732e6 d3d9!CBaseDevice::CreateIndexBuffer
0241edec 6fea0127 d3d9!CBaseDevice::CreateRenderTarget
0241edf0 6ff0cd88 d3d9!CBaseDevice::CreateDepthStencilSurface
0241edf4 6ff0e0e0 d3d9!CBaseDevice::UpdateSurface
0241edf8 6fe846ab d3d9!CBaseDevice::UpdateTexture

可以看到g_pD3dDevice的虚表地址是0x0281899c, pNewD3dDevice的虚表地址是0x0241ed7c,他们各自拥有自己虚表,尽管虚表里的内容是一样。如果你改变第一个对象的虚表内容,理论上不会影响第二个对象。
@WXX
惭愧,真心热爱计算机的大学毕业时就很厉害了, 昨天看到的 http://www.zhihu.com/question/23241706/answer/24087891

我是大学没努力,工作后根据需要补学而已。
@Won
确实,DWM虚拟化只有在大于125%时才会自动开启
@allen
BitBlt主要针对Monitor DC, 抓某个Monitor的屏幕内容
WindowDC可以抓任何一个窗口的内容, 当然抓时也要BitBlt
re: 基于WinDbg的内存泄漏分析 Richard Wei 2014-02-08 12:22
@jenics
是不是因为你的程序是没有PDB文件的Release版
re: HOOK技术的一些简单总结 Richard Wei 2014-02-07 16:13
@allen
嗯, 单看这句话确实是错的, 但是你要结合我的上下文来看。
我的意思是你这里修改IDirect3DDevice9的虚表内容, 修改的也仅是你当前对象的, 而不会影响其他IDirect3DDevice9对象, 因为他们不是所有对象共享同一虚表的, 但是同一标准C++类的所有对象会共享同一虚表。
re: Window Ghosting Richard Wei 2014-01-09 10:24
@万连文
对假死窗口调用SendMessage应该会一直等待,不会返回, 直到窗口有响应
@Q
多谢指正, 因为具体我也没试过, 只是看微软文档得出的结论,可看这里第一句:http://msdn.microsoft.com/en-us/library/windows/desktop/hh404487(v=vs.85).aspx
@万连文
RDP协议是不公开的,他主要定义了图像的压缩,加密,传输和远程控制等方法, 本身没有定义屏幕采样方法,微软的远程桌面用的应该是mirror driver的抓屏。
effective C++ item 38
re: 关于 "Context" 模式 Richard Wei 2013-11-23 14:11
@万连文
嗯,确实度是关键, 实际上怎样才算一个模块? 它的粒度可以是个小的静态Library, 也可能是个庞大的Service。最关键的就是要保持模块的独立性和层次性,避免形成网状依赖。
re: HOOK技术的一些简单总结 Richard Wei 2013-10-31 16:38
@春秋十二月
同意,相对Unix/Linux的稳定, Windows开发要累得多
re: HOOK技术的一些简单总结 Richard Wei 2013-10-31 10:34
@StarsunYzL
已经加上, 如有不正确的地方,欢迎指正.
re: 远程线程入门 Richard Wei 2013-10-24 19:45
@flighta
如果别人已经保存了你这个DLL的HINSTANCE,你想热替换它,这个恐怕不好弄, 只能让别人Free后再Load。
re: 共享个人写的一个截屏小工具 Richard Wei 2013-10-12 17:52
@唐地坤
关键就是参数CAPTUREBLT, 它让BitBlt把Layered Window抓下来
re: 共享个人写的一个截屏小工具 Richard Wei 2013-10-12 13:20
@唐地坤
不是很明白你的问题,不知道你是不是指这个BitBlt( ... SRCCPY | CAPTUREBLT)
re: 关于Windows窗口框架 Richard Wei 2013-09-09 18:34
@聂晏冰

怎么取一次?
每次收到消息都要转的, 大概代码如下:
LRESULT CALLBACK XWindow::WndProc(HWND hWnd, UINT uMsg,
WPARAM wParam, LPARAM lParam)
{
XWindow* pThis = NULL;
if (WM_NCCREATE == uMsg)
{
assert(!::IsBadReadPtr((void*)lParam, sizeof(CREATESTRUCT)));
LPCREATESTRUCT lpcs = reinterpret_cast(lParam);
pThis = static_cast(lpcs->lpCreateParams);
pThis->m_hWnd = hWnd;

assert(!::IsBadReadPtr(pThis, sizeof(XWindow)));
::SetWindowLongPtr(hWnd, GWLP_USERDATA, reinterpret_cast(pThis));
}
else
pThis = reinterpret_cast(::GetWindowLongPtr(hWnd, GWLP_USERDATA));

if (pThis)
return pThis->MsgProc(hWnd, uMsg, wParam, lParam);
else
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
re: 关于Windows窗口框架 Richard Wei 2013-09-09 08:52
@jilei
不错, UserData方式也可以用SetProp存储, 但是低效同样也是它的缺点。
re: 关于Windows窗口框架 Richard Wei 2013-09-08 19:16
@avlee
嗯,关键我们希望是面向对象的, 方便的支持多实例, 并且希望是线程安全的,这个框架都很好的满足了。消息处理是窗口程序的根本, 所以简单方便的消息映射也很重要。
记录下, 对于菜单窗口, 可以优化消息WM_MOUSEACTIVATE, 返回MA_NOACTIVATE
@bukebushuo
不敢,最近工作中用到这块东西,所以花点时间总结了下,顺便分享
re: 如何获取桌面截图 Richard Wei 2013-09-02 17:52
@笨笨熊
基本不可能, 这个用户体验也太差了吧
re: 一个高效的内存池实现 Richard Wei 2013-07-29 17:56
@foundwant
确实, 这和分配策略有关。
上面的内存池适合频繁的分配和释放的情况, 但是对于多次连续分配就不适合了。其他一些内存池可参考:http://www.cppblog.com/weiym/archive/2013/04/08/199238.html
re: 理解程序内存 Richard Wei 2013-07-26 15:45
@艾丝凡
恩,文章主要针对C++开发人员的, 没有这方面经验是比较难看懂。
re: COM思想的背后 Richard Wei 2013-07-20 17:52
@WXX
同意, 关于套间、列集/散集, 内部涉及到LPC/RPC技术,微软隐藏了太多东西,尽管Windows操作系统本身用了不少这方面的技术, 但是外部开发人员却因为不好掌控而尽量不用。
re: XP之后Windows的一些变化 Richard Wei 2013-07-20 11:57
@bukebushuo
确实, 关于Windows桌面应用的下降趋势, 我以前有过一篇文章http://www.cppblog.com/weiym/archive/2012/06/21/179645.html
re: 智能指针与库 Richard Wei 2013-06-23 20:18
@cao
惭愧,不敢误人子弟。
re: 5年编程之旅 Richard Wei 2013-06-18 09:28
还很年轻,加油
re: C++编程程序风格的思考方法 Richard Wei 2013-06-08 14:36
这不是偶的文章吗,被斩头去尾了...
re: 突发奇想 之 远程调用 Richard Wei 2013-05-20 00:13
rpc
re: 关于“UI线程” Richard Wei 2013-05-06 15:11
说的不错。其实什么线程都一样, 这里多了个消息队列和消息循环,就被叫为 “UI线程”。
共4页: 1 2 3 4