Jiangsheng的CSDN Digest (Oct 2005)

CSDN 讨论总结系列:

在default桌面中如何获取Winlogon桌面位图(VC/MFC 进程/线程/DLL )


为何我的服务程序只能获取default的桌面位图,但不能获取Winlogon桌面的?怎么才能做到象DameWare Mini Remote Control那样既可获取default的桌面位图,也支持Winlogon下的位图?


使用
HDESK OpenDesktop(
LPTSTR lpszDesktop, // name of the desktop to open
DWORD dwFlags, // flags to control interaction with other applications
BOOL fInherit, // specifies whether returned handle is inheritable
DWORD dwDesiredAccess // specifies access of returned handle
);

BOOL SetThreadDesktop(
HDESK hDesktop // handle to the desktop to assign to this thread
);
 

讲下window station 和desktop。它们主要是用于服务程序,一般的应用程序不必使用它们。它们可以用来对服务进行保护。运行在不同的window station 或不同的desktop下的应用程序,不能互相发送消息、挂钩、使用同一个clipboard等等。主要是出于安全的目的。


服务程序一般使用的是LocalSystem帐户,拥有自己的window station,和Default桌面,这个window station是不能于用户交互的,也就是说,你不能在上面显示窗口,它也不接受用户的鼠标、键盘等输入。

使用用户帐户登录以后,看到的桌面,是WinSta0(window station)下的Default(desktop).
WinSta0下有3个桌面:
WinLogon :以Logon对话框的形式出现.当用户登录以后,WinLogon.exe切换到Default desktop.
Default :这是Explorer.exe和所有用户程序窗口出现的地方,也就是我们通常使用windows看见的地方.应用程序就运行在这个桌面上
Screen saver :系统空闲的时候,运行屏保的桌面.

当在“计算机管理”中选择一个服务,修改属性,选择“登录”标签页的“允许服务与桌面交互”,那么该服务就使用的是WinSta0(window station)下的Default(desktop). 也就可以与服务进行交互操作了。这时,能获取default的桌面位图,因为线程的桌面就是WinSta0下的Default。要想同时获得Winlogon桌面位图,应该先把线程的桌面设置成Winlogon。


OpenInputDesktop返回就是当前活动桌面
基于对话框的程序的时候,是因为你的权限不够,所以在winlogon下会返回空。利用返回值为空的方法不适合服务。
使用的是系统权限(运行在服务下),当程序切换到winlogon前,先用OpenInputDesktop得到当前桌面,再用GetUserObjectInformation就可以得到当前的桌面的名字,是default。切换后,再用同样的方法得到的是winlogon。再切换回来,得到的是default。

说个小插曲,第一次做的时候,只切换到winlogon,程序没有自动切换回default。只好重新启动。


连接时报某个接口ID未定义的问题 (VC/MFC ATL/ActiveX/COM)


Linking...
MainFrm.obj : error LNK2001: unresolved external symbol _IID_IExtractImage
Debug/DVBTools.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.

但我的头文件定义了,也包含了下面的定义
//BB2E617C-0920-11d1-9A0B-00C04FC2D6C1
DEFINE_GUID(IID_IExtractImage,
0xBB2E617C, 0x0920, 0x11d1, 0x9A, 0x0B, 0x00, 0xC0, 0x4F, 0xC2, 0xD6, 0xC1);


在没有包含Initguid.h的地方,DEFINE_GUID宏创建外部引用来使用GUID值,在包含Initguid.h的地方,DEFINE_GUID重定义DEFINE_GUID宏以产生GUID的定义。
如是没有在任何地方添加Initguid.h,会得到一个链接错误:"unresolved external symbol." ,如果同样的GUID包含Initguid.h两次,会得到编译错误"redefinition; multiple initialization."要解决这些问题,请确认Initguid.h只包含一次。同样的,不要包含Initguid.h到预编译头文件中去,因为预编译头文件会被每个源文件包含。


我怎么样将自己定义VIEW,比如我自己做了一个可以改变单行颜色的clistctrl我想在view里面使用此功能(VC/MFC 界面)


我要做一个列表视Listview,但系统默认的CListView类没有单行改变颜色的功能,只能自己做一个新

视,新视图从CView继承。请问我接下来怎么用自定义的Clistctrl来填充视口啊?


如果你的CListCtrl扩展类没有增加成员变量或者虚函数(这似乎是一种缚手缚脚的扩展),那么你可以直接把任何窗口类类型为SysListView32的CWnd对象指针直接转化为你的CListCtrl扩展类指针使用。

如果你的CListCtrl扩展类在CListCtrl的基础上增加了成员变量或者虚函数,那么推荐用基于CFormView(或者更麻烦一些,CCtrlView)的类来替代基于CListView的实现:在FormView的对话框上放一个列表控件,在FormView大小变化时移动列表控件以充满视图。如果你希望让视图类而不是视图中的控件来处理和响应消息,你需要捕捉控件收到的用户输入消息并通过发送WM_NOTIFY通知转发到视图,以及捕捉视图收到的控制消息并转发到控件。使用这种方法也可以自行封装基于CCtrlView的自定义控件视图类。

如果你的CListCtrl扩展类不依赖于控件的状态——也就是说,由调用者手动初始化而不是自行处理创建消息,那么可以声明一个CListCtrl扩展类对象,之后调用CWnd::Attatch连接到CListView派生类对象来接管窗口过程。

其它的通用控件扩展类也可以使用上述方法移植到CCtrlView派生类。

其他的方法包含:

把Ctrl和View中重复的功能作成模板(可以参考CHTMLEditCtrl/CHTMLEditView的实现)
单独编写Ctrl和View,把Ctrl和View中重复的代码作成辅助函数供窗口的消息相应函数调用。


VC 2003.net的Crt代码里头的memcmp函数 (C/C++ C++ 语言)


其中一段是:

test eax,1
jz short main_loop

mov cl,[esi]
cmp cl,[edi]
jne short not_equal
add esi,1
add edi,1
sub eax,1
jz short done ; eax is already 0

main_loop:
mov cl,[esi]
mov dl,[edi]
cmp cl,dl
jne short not_equal

mov cl,[esi+1]
mov dl,[edi+1]
cmp cl,dl
jne short not_equal

add edi,2
add esi,2

sub eax,2
jnz short main_loop
done:
pop edi
pop esi
retnull:
ret ; _cdecl return

上面的我死活没有想懂,为什么要两个字节一起比较?


前面还有

or edx,edi
and edx,3 ; edx=0 iff buf1 are buf2 are aligned
jz short dwords

只要 dst , src 是 DWORD 对齐的,就一次比较 4 个字节

dwords:
mov ecx,eax
and eax,3 ; eax= counter for tail loop

shr ecx,2
jz short tail_loop_start
; counter was >=4 so may check one dword
rep cmpsd

jz short tail_loop_start
 

看来在不太增加代码复杂度的情况下每两字节可以少执行一次跳转。这部分是在两个缓冲区的起始地址没有对齐的情况下进行的。这样就是为了在性能上的一个折中,如果单个字节比较的话,跳转就太多,浪费CPU时钟,如果设置多余2个字节的比较的话,代码又太过冗长,超出了short的跳转范围,那么选择每两个字节进行比较的话,性能不但有所提升,而且代码也比较紧凑,没有超出short跳转的范围


Com如何导出自定义结构 (VC/MFC ATL/ActiveX/COM)


我想通过com的接口函数输入,输出一个自定义的结构.该结构内部还包含一个自定义的union.我该怎么作.我建立的是atl工程.(vc6.0中的atl).我的struct和别人的不同(我的struct里面不全是简单的数据结构(如int,char....),我的struct里面还包含一个union),那我该怎么办?
那有没有好的方法能解决复合型的struct(就是struct里面,不仅仅只有简单的数据类型(int,char...)还包含其他的复杂结构(struct, union.....))


对于普通的C++接口,任何自定义类型都可以作为接口函数类型,但如果是自动化接口,接口函数的参数必须是OLE变量类型,这时需要把自定义类型通过某种些技巧转化成等价的OLE变量类型,比如直接把结构封装成COM对象,之后传递接口给外部操作。都用

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值