12/27/2005

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对象,之后传递接口给外部操作。都用COM实现了整个对象,没必要就因为参数的问题导至组件只能被C/C++调用.那也太划不来了
 


参见


http://www.vckbase.com/document/viewdoc/?id=1404
http://community.csdn.net/Expert/topic/3872/3872346.xml?temp=.1874048
 




一个托管的类指针对象,能转化成void*吗(.NET技术 VC.NET)




混合了MFC和.NET framework的程序,一个函数的参数类型是void*,而现在想传给这个函数的变量类型是一个托管类指针,像__gc MyClass*,传不了,也强制转换不了。在不改变函数参数的前提下,有什么办法吗?




A __gc pointer shall not be cast to a __nogc pointer.
A pinning pointer can be implicitly converted to a __nogc pointer.
This is the only mechanism provided for passing addresses in the common language runtime heap to functions expecting __nogc pointers. The primary use for this is passing such addresses to unmanaged functions in external DLLs.




请问如何判断内置浏览器可以通过GoBack()和GoForward()来“后退、前进”? (.NET技术 C# )




我用的是AxSHDocVw.AxWebBrowser
请问那该如何得知是否可以“后退”或者“前进”呢?




ExecCommand之前QueryStatus或者捕获CommandStateChang事件
参考http://msdn.microsoft.com/library/default.asp?url=/workshop/browser/webbrowser/reference/ifaces/iwebbrowser2/goback.asp
 




CDHtmlDialog 的问题(js关闭ie的问题) (VC/MFC 界面 )




我用CDHtmlDialog 来浏览网页
这个网页中有一个按钮,点击次按钮,会掉用js来关闭IE

但我的CDHtmlDialog能不能捕捉到这个事件呢?

因为我的程序中只使用一个CDHtmlDialog来显示网页,当用户关闭这个CDHtmlDialog的时候我实际是让他ShowWindow(SW_HIDE),而不是真正的关闭,在下次用户要显示另一个网页的时候再show出来

当用户点击网页中的关闭按钮后,我想先捕捉到这个“退出”事件,然后隐藏掉我的CDHtmlDialog


可是现在用户点击网页中的退出按钮,我的dlg仍然还在,但这个CDHtmlDialog已经不可以再用了,好像里面的IE控件被关闭了




如果用户的IE是5.5以上版本,捕获DWebBrowserEvents2::WindowClosing事件
如果用户的IE是5.01及以下版本,捕获WM_PARENTNOTIFY消息并且判断消息来源是否是浏览器控件。
OnQuit是IE专用的事件,浏览器控件不会被触发


参见


http://blog.csdn.net/jiangsheng/archive/2003/11/09/3795.aspx





今天看了回调函数发现有个__stdcall与cdecl 非常不解(VC/MFC 硬件/系统 )




调用约定,使用不同的调用约定,则传递参数的顺序和方式会不同,例如多个参数的入栈顺序会不同,而象__fastcall约定会尽可能的使用寄存器传递参数
因此如果一个__stdcall声明的函数通过__cdecl的方式去调用就会出现错误
cdecl是C语言里面函数调用使用得最多的协议(可以说绝大多数都是这个,Unix/Linux下面清一色都是这个……),主要特性是使用eax寄存器保存返回值(通常对于比较小的类型如此),调用方清栈(所以可以支持变参函数),另外它也是C/C++默认的调用协议(也就是说不额外声明的话,默认就是cdecl的)

stdcall是Windows API标准的调用方式,所有的Windows API都是靠这个调用协议,好像一般callback也都是用这个的……


cdecl 参数从右至左入栈,函数负责清除堆栈,返回值的处理如下
VC:
除了浮点数之外的基本类型和大小小于或者等于8字节的结构根据大小不同保存在EAX或者EAX:EDX组合中
浮点数和双精度数保存在fp0中
大小超过8字节的,或者有构造函数、析构函数、虚函数之一的结构或者类在内存中返回。返回值在内存中时调用者会分配对应大小的内存,并且将其作为隐含的第一个参数传递。函数调用之后调用者负责清除这块内存。
其它:
某些编译器在按值传递有析构函数的类和结构时会强制转换成按地址传递。某些编译器会把所有返回值强制放在内存中

stdcall
同cdecl,但是函数调用者负责清除堆栈

thiscall
VC:
同stdcall,但是this指针在ECX中传递,类和结构类型的返回值强制放在内存中。如果函数参数的数目可变,那么同cdecl,但是this指针成为隐含的第一个参数。
其它:
同stdcall,但是this指针成为隐含的第一个参数。

fastcall
除了开始两个大小小于4字节的参数会通过寄存器传递之外,其它同cdecl。

64位平台上调用约定有所变化,但是我没有做过这方面的研究。

参考文章
http://support.microsoft.com/default.aspx/kb/100832
http://p5.club.163.com/viewArticleByWWW.m?boardId=clanguage&articleId=clanguage_104ffea50e53121&boardOffset=0
http://www.codeproject.com/cpp/FastDelegate.asp




求graphics.h的库函数,我的VC没有这个库函数 (C/C++ C语言)




那个库是16位的。
Visual C++1.5以上版本不支持16位的库。如果你要使用这个图形库,可以使用Visual C++ 1.5版,或者使用Borland 的Turbo C++。




ATL的调用(VC/MFC ATL/ActiveX/COM )




假设我在他机用vc 的ATL新建了一个Simple Object,编译了一个dll;

如果我想在本机新的atl工程中 Composite Control中使用这个dll的接口,
通过CoCreateInstance()可以获取得到这个接口,但是前提是这个dll必须在本机注册,
想请问下,如何在调用接口之前,不手动注册他机编译后的dll,而是通过程序来注册这个dll?




调用COM的DllRegisterServer函数,被调用的COM要作为一个DLL的方式来导入DllRegisterServer。就是说用LoadLibrary函数来读取DLL文件然后调用DllRegisterServer。


HINSTANCE hDLL = ::LoadLibrary("*.dll");
typedef BOOL (_stdcall *lpRegHnd)(void);
lpRegHnd regHND;
regHND = (lpRegHnd)::GetProcess( hDLL, "DllRegisterServer");
if (regHND == NULL )
return -1;
regHND(); //register DLL;
::FreeLibrary( hDLL );
或者调用ShellExecute函数调用Regsvr32 来执行注册。


The RegSvr32 utility installs a DLL as an in-process server. It invokes one
or more functions that are implemented by the application, and exported by
name by the DLL. The primary task of these functions is to create or delete
appropriate registry entries. The following functions can be invoked by
RegSvr32.

a.. DllRegisterServer is used for installing DLLs. It should create any
necessary registry keys.
b.. DllUnregisterServer is used for uninstalling DLLs. It should delete
any registry keys that are no longer needed.
c.. DllInstall is used for both installing and uninstalling DLLs. It can
be used in addition to DllRegisterServer and DllUnregisterServer, or in
place of them. It is intended for DLLs that can be installed in more than
one way. Unlike DllRegisterServer and DllUnregisterServer, which take no
arguments, DllInstall takes two arguments. The first is a Boolean value that
specifies whether the DLL is being installed (TRUE) or uninstalled (FALSE).
The second is a string that can be used to specify which installation
procedure to use.
The following is the RegSvr32 command-line syntax.

regsvr32 [flag1 [flag2 ...] DllName
/u
Uninstall the DLL. If the /i flag is not included DllUnregisterServer will
be invoked.
/i:"string"
Invoke DllInstall. If the /u flag is included, DllInstall is instructed to
uninstall the DLL, by setting the first parameter to FALSE. Otherwise, the
first parameter will be set to TRUE, and DllInstall will install the DLL.
The string following the colon will be passed in as the second parameter to
DllInstall. It is used to specify which installation procedure is to be
used. If /i is used without the colon and string literal, the second
parameter of DllInstall will be set to NULL. Unless the /n flag is included,
DllRegisterServer or DllUnregisterServer will also be invoked.
/n
Do not invoke DllRegisterServer or DllUnregisterServer. This flag can only
be used in combination with /i.
/s
Silent.
/c
Console output.
If no flags are specified, RegSvr32 will install the DLL by invoking
DllRegisterServer.

To register a DLL named DllName.Dll by invoking its DllRegisterServer
function, use the following command:

regsvr32 dllname.dllTo unregister the DLL with DllInstall's "uninstall_1"
procedure without also invoking DllUnregister, use the following command:

regsvr32 /u /n /i:"uninstall_1" dllname.dll




程序里使用 ie 控件的问题(VC/MFC 基础类)




我的问题是, ie 包装类可以很好的工作,但是我不知道怎样取得它的 iWebBrowser2 接口
ie包装类是 vc 自动生成的CWebBrowser2:public CWnd.




CWnd::GetControlUnknown之后QueryInterface IID_IWEbBrowser2。注意GetControlUnknown之后不能Release




CHtmlView中的ScrollBar的问题 (VC/MFC 界面 )




当网页内容超过视图范围时,会有ScrollBar显示出来。
现在我如何使ScrollBar不被显示出来




1.通过修改网页 <frame noscroll="noscroll">
2.http://support.microsoft.com/default.aspx?scid=kb;en-us;Q324419
你也可以自定义浏览器控件的容器,实现IDOCHostUIHandler的GetHostInfo方法。在VC7.0中比较简单一些,你可以直接使用CHTMLView和CDHTMLDialog内建的GetHostInfo方法,或者参考这两个类的源代码,在创建控件的时候使用类似于CBrowserControlSite的容器。在VC6中你需要用http://support.microsoft.com/kb/q236312/这样的方法在创建控件的时候使用自定义的容器。
 




插入USB盘的时候电脑会自动弹出一个打开列表的窗口,询问要做什么,请问如何把我自己的程序加到这个列表中,用我的程序打开? (VC/MFC 硬件/系统)




HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer\AutoplayHandlers
http://msdn.microsoft.com/msdnmag/issues/01/11/autoplay/default.aspx
 




在WEB中读取网上领居的机器上的文件报权限不足,请问如何处理??网上邻居的文件已经设了共享且没加密码。 (.NET技术 ASP.NET )




直接通过网上邻居用此形式就能访问是因为当前登录用户有权限
asp.net进程是运行在服务器的aspnet用户下的,如果权限不足,可以让IIS服务和桌面程序交互,之后编一个桌面程序来和ASP.Net中的程序通讯(推荐),或者修改aspnet用户的权限(不推荐,容易造成安全问题)你也可以临时扮演一个有权限的用户角色。


利用角色扮演类,执行这个类以后就是一管理员身份登陆系统后的权限。
用法:
using System;
using System.DirectoryServices;
using System.Runtime.InteropServices;
using System.Security.Principal;
using System.Security.Permissions;


///
/// 用户模拟角色类。实现在程序段内进行用户角色模拟。
///
public class IdentityImpersonation

{

[DllImport("advapi32.dll", SetLastError=true)]

public static extern bool LogonUser(String lpszUsername, String lpszDomain, String lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken);



[DllImport("advapi32.dll", CharSet=CharSet.Auto, SetLastError=true)]

public extern static bool DuplicateToken(IntPtr ExistingTokenHandle, int SECURITY_IMPERSONATION_LEVEL, ref IntPtr DuplicateTokenHandle);



[DllImport("kernel32.dll", CharSet=CharSet.Auto)]

public extern static bool CloseHandle(IntPtr handle);



// 要模拟的用户的用户名、密码、域(机器名)

private String _sImperUsername;

private String _sImperPassword;

private String _sImperDomain;

// 记录模拟上下文

private WindowsImpersonationContext _imperContext;

private IntPtr _adminToken;

private IntPtr _dupeToken;

// 是否已停止模拟

private Boolean _bClosed;



///

/// 构造函数

///

/// 所要模拟的用户的用户名

/// 所要模拟的用户的密码

/// 所要模拟的用户所在的域

public IdentityImpersonation(String impersonationUsername, String impersonationPassword, String impersonationDomain)

{

_sImperUsername = impersonationUsername;

_sImperPassword = impersonationPassword;

_sImperDomain = impersonationDomain;



_adminToken = IntPtr.Zero;

_dupeToken = IntPtr.Zero;

_bClosed = true;

}



///

/// 析构函数

///

~IdentityImpersonation()

{

if(!_bClosed)

{

StopImpersonate();

}

}



///

/// 开始身份角色模拟。

///

///

public Boolean BeginImpersonate()

{

Boolean bLogined = LogonUser(_sImperUsername, _sImperDomain, _sImperPassword, 2, 0, ref _adminToken);



if(!bLogined)

{

return false;

}



Boolean bDuped = DuplicateToken(_adminToken, 2, ref _dupeToken);



if(!bDuped)

{

return false;

}



WindowsIdentity fakeId = new WindowsIdentity(_dupeToken);

_imperContext = fakeId.Impersonate();



_bClosed = false;



return true;

}



///

/// 停止身分角色模拟。

///

public void StopImpersonate()

{

_imperContext.Undo();

CloseHandle(_dupeToken);

CloseHandle(_adminToken);

_bClosed = true;

}

}
使用的时候在获取权限的时候这样写:
IdentityImpersonation identityImpersonation = new IdentityImpersonation("administrator",
"yourpassword","yourhostname");
identityImpersonation.BeginImpersonate();//开始管理员扮演
//特殊操作
.....
....
identityImpersonation.StopImpersonate(); //结束扮演
 




在基于CSrollView为基类的程序中,使用CRectTracker(橡皮筋类),在视图出现滚动条时,CRectTracker不能正常显示(VC/MFC 界面 )




我的程序中视图基于CSrollView,并且使用了CRectTracker类(橡皮筋类),在视图中没有出现滚动条时,CRectTracker类(橡皮筋类)显示正常,可以正常的随鼠标移动,扩大,缩小等操作;但是当视图出现滚动条时,当CRectTracker类(橡皮筋类)没有被当前视图所包含时,移动视图滚动条,移动视图时则不能出现CRectTracker,不知道这是什么问题?怎么解决?
void CMonitorView::OnDraw(CDC* pDC)
{
CMonitorDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDoc->m_Viewfinder.Draw(pDC) ;//显示矩形“橡皮筋框架”
}

我添加了对应移动滚动条的OnScroll函数以使得OnDraw函数得以响应,
BOOL CMonitorView::OnScroll(UINT nScrollCode, UINT nPos, BOOL bDoScroll)
{
CRect rectTrue ;
CMonitorDoc* pDoc = GetDocument();
ASSERT(pDoc != NULL) ;
pDoc->m_Viewfinder.GetTrueRect(&rectTrue); //获得“橡皮筋框架”
InvalidateRect(&rcClientTrue); //设置待更新显示矩形区域
}
但是问题依然存在




CRectTracker本来就是直接画到屏幕上的,没有通过正常的WM_PAINT消息处理过程来画。
你应该把画图部分封装出来给拖放过程和重画过程共享。MSDN中的DrawCli示例(MFC)可以作为参考。




使用CHtmlView,希望能在页面下载后,使页面自动滚屏 (VC/MFC HTML/XML )




HRESULT CMyDHTMLDialog::scrollToBottom()
{
HRESULT hr= S_FALSE;
IDispatch* spDoc=NULL;
m_pWebBrowseAPPr->get_Document(&spDoc);
if(pDoc)
{
IHTMLDocument2 *pHTMLDoc = NULL;
theResult = pDoc->queryInterface(IID_IHTMLDocument2, (LPVOID*)&pHTMLDoc);
ASSERT(pHTMLDoc);
IHTMLElement *pBody = NULL;
hr= pHTMLDoc->get_body(&pBody);
ASSERT(pBody);
IHTMLElement2 *pElement = NULL;
hr= pBody->QueryInterface(IID_IHTMLElement2,(LPVOID*)&pElement);
ASSERT(pElement);
pElement->put_scrollTop(1000000); // Scroll to bottom.
hr= pElement->Release();
hr= pBody->Release();
hr= pHTMLDoc->Release();
hr= pDoc->Release();
}
return hr;
}




让IE通过程序控制实现滚动的方法,谢谢(VC/MFC 界面)




我想通过程序控制,使IE(Internet Explorer)浏览器滚动起来,比如在IE中输入www.sina.com.cn,由于新浪的首页很长,因此IE会出现一个垂直滚动条,请问如何通过程序控制使IE的水平和垂直滚动条能够滚动起来?我试过了给指IE窗口发送WM_VSCROLL消息,可是不行。请问哪位知道如何实现??谢谢!

我想实现的东西,简单来说,可以抽象成下面的函数:

void ScrollIE(HWND hWndIE, BOOL bVertical)
{
// 如果bVertical为TRUE, 则使句柄hWndIE对应的IE窗口的
// 垂直滚动条从最顶部逐步滚动到最底部,每次向下滚动1/3屏幕;
// 如果bVertical为FALSE, 则使句柄hWndIE对应的IE窗口的
// 水平滚动条从最左端逐步滚动到最右端,每次向右滚动1/3屏幕;

// IE主窗口的内容也应随着滚动条的滚动而相应滚动
}




#include <Mshtml.h>
#include <atlbase.h>
#include <oleacc.h>
void ScrollIE(HWND hWnd, BOOL bVertical)
{
RECT rc;
::GetClientRect(hWnd, &rc);
IHTMLDocument2* pDoc2 = NULL;
LRESULT lRes;
HINSTANCE hInst = ::LoadLibrary( _T("OLEACC.DLL") );

UINT nMsg = ::RegisterWindowMessage( _T("WM_HTML_GETOBJECT") );
::SendMessageTimeout(hWnd, nMsg, 0L, 0L, SMTO_ABORTIFHUNG, 1000, (DWORD*)&lRes );
LPFNOBJECTFROMLRESULT pfObjectFromLresult = (LPFNOBJECTFROMLRESULT)::GetProcAddress( hInst, _T("ObjectFromLresult") );
if ( pfObjectFromLresult != NULL )
{
HRESULT hr;
IHTMLDocument2* pDoc;
hr = (*pfObjectFromLresult)( lRes, IID_IHTMLDocument, 0, (void**)&pDoc);
if ( SUCCEEDED(hr) )
{
CComPtr<IDispatch> spDisp;
CComQIPtr<IHTMLWindow2> spWin;
pDoc->get_Script( &spDisp );
pDoc->Release();
spWin = spDisp;
if (bVertical)
spWin->scroll(0, (rc.bottom -rc.top)/3);
else
spWin->scroll((rc.right-rc.left)/3, 0);

}
}
}
指定一个很大的滚动距离就可以从最顶部滚动到最底部,访问body的scroll*属性可以知道IE窗口的总象素宽度和总的象素高度(包括不可见部分)。


IHTMLDocument2* pDocument;
spWin->get_document(&pDocument);
IHTMLElement* pElement;
pDocument->get_body(&pElement);
IHTMLElement2* pElement2;
pElement->QueryInterface(IID_IHTMLElement2, (void**)&pElement2);
long iHeight;
pElement2->get_scrollHeight(&iHeight);
long iWidth;
pElement2->get_scrollWidth(&iWidth);




如何得到WebBrowser控件里网页的源代码?? (.NET技术 C# )




document.body.innerHTML得到只是body里的源码,我要得到整个网页的源码




using(FileStream stream = new FileStream(@"c:\mafile.txt", FileMode.Create,
FileAccess.Write, FileShare.None) ) {
ComStream cstream = new ComStream( stream );
IPersistStreamInit persistentStreamInit =
(IPersistStreamInit)axWebBrowser1.Document;
persistentStreamInit.Save( cstream, 0 );
http://www.dotnet247.com/247reference/msgs/8/43441.aspx




如何在VC6下生成缩略图? (VC/MFC 图形处理/算法 )




打开jpg 或 bmp 图片文件,快速生成象Windows资源管理器中的缩略图?要求对批量图片处理,速度要快,不是对每副图片直接进行图形变换。
象Windows资源管理器中快速批量生成缩略图一样。




1 只有在要显示之前才生成缩略图
2 在硬盘上生成缓存的交换文件,缓存过大容易造成内存不足影响性能
3 在内存中缓存最近查看的少量缩略图
4 监视文件夹的文件更改以更新内存和磁盘中的缩略图缓存




MFC 与 .NET (.NET技术 .NET Framework)




请比较一下这两者




哪个更有前途?你要二选一?这两个又不是互斥的,只是两个类库而已。


MFC的很多类和函数依赖于线程和模块的状态(包括CString::LoadString,CWnd::AssertValid等等),这样如果你的线程中用到了这些MFC的类和函数,那么这个线程就需要是MFC创建的。MFC的消息和命令的处理流程也和.Net的有区别,以至于在MFC程序中嵌入.Net代码十分繁琐。

.Net 1.0不支持将.Net控件嵌入MFC控件容器,但是从.Net 1.1开始支持了这个做法。MFC 8.0则增加了一些模板类来简化在MFC程序中嵌入WinForm的工作。


MFC的DLL是非托管的,但是可以和托管代码一起工作。托管代码中当然可以引用程序集


混合了非托管代码的程序很可能较难不加修改的移植到其它平台,尤其是在非托管代码包含对特定操作系统的API调用的情况下




为什么在mainframe里给菜单项加消息处理没问题,在view类里这样做菜单项会变灰(.NET技术 VC.NET )




我的SDI程序用CSplitterWindow分为2个View,我想在右边的view里处理菜单消息,结果加了消息映射后菜单还是无效,如果把消息加到mainframe下就好了,请教原因是什么?我想加到View里应该如何做?




命令消息首先被CWinApp类处理,默认的处理流程是CWinApp类->主框架->MDI子框架->活动视图->文档。如果你要自定义处理流程,可以在处理流程中处理这个命令并/或转发到其他CCmdTarget派生类。只有一个视图的时候,视图总是框架的活动视图。用户可以通过界面操作来设置活动视图。如果要用程序设置,调用CSplitterWnd::SetActivePane

参考
http://www.codeproject.com/docview/splitcmdroute.asp




如何保存打印设置(VC/MFC 基础类)




对CPrintDialog
多个打印机,我想选定一个,之后每次打印的时候不需要再选择了。
需要把选定的打印机保存到磁盘中
 




http://support.microsoft.com/kb/q166129/




怎样实现视图的比例缩放(VC/MFC 基础类)




我想在controlBar上放一个Combo Box控件,然后象word那样可以选定缩放比例进行视图缩放?还有,如何controlBar如何停靠在工具栏的右边?




http://www.codeproject.com/docview/McCZoomView.asp
http://msdn.microsoft.com/library/en-us/vcsample/html/_sample_mfc_CTRLBARS.asp
http://search.csdn.net/Expert/topic/714/714468.xml




VB.net使用脚本,如何让脚本访问主程序的过程或函数(.NET技术 VB.NET )




读了《VB-Helper:坚守脚本》
(见http://www.microsoft.com/china/msdn/library/langtool/vbnet/VSFreakOut.mspx)
有很多疑问。
我下载了示例,由两个工程构成,一个主程序,一个DLL
脚本可以访问DLL中的过程和函数,但我不知道DLL中的过程如何去调用主程序的过程(我不知道用没有这个可能性)
我想知道如何才能实现通过脚本去访问主程序中的过程、函数。
例如主程序中有一个模块,其中有一个全局子程序AAA,如何才能使得脚本中可以使用AAA子程序?
顶着有分。恳请大家指教。




.Net可以使用反射,但是你或许会被反射搞昏头。

一个常见的解决方案是声明一些全局对象,类似于IE的脚本引擎中的window对象或者Office自动化中的_Application对象。脚本引擎需要做一些工作来在用户访问之前初始化这些全局对象。全局或者内建函数也是可以考虑的做法。




关于ActiveX使用默认参数的问题(VC/MFC ATL/ActiveX/COM )




我使用ActiveX控件包装了自己的一个类, 但是如何把类方法中缺省默认参数引出去?
也就是说如何在ActiveX中使用缺省的默认参数?




I dont know of any way you can use Class Wizard to add methods that have
optional parameters. The way that I created the methods was to add the
optional parameter in the .odl. The optional parameter needs to be of type
VARIANT. When VB (or anyone else) calls the function without the optional
parameter the VARIANT will contain VARIANT.vt = VT_ERROR VARIANT.scode =
DISP_E_PARAMNOTFOUND.

.idl (may be slightly different syntax in .odl)

[id(1030), helpstring("method Close")] HRESULT Close([in, optional] VARIANT
bSaveChanges, [in, optional] VARIANT strFileName);

.h

STDMETHOD(Close)(THIS_ /*[in, optional]*/ VARIANT varSaveChanges, /*[in,
optional]*/ VARIANT varFileName);

.cpp

STDMETHODIMP CDoc::XDoc::Close
(
VARIANT varSaveChanges
,VARIANT varFileName
)
{
....
}

Check out KB articles
Q154039 How To Pass Optional Arguments to MFC ActiveX Controls
Q158451 How To Call Automation Methods with Variable Argument Lists




如何实现COM中类的嵌套(VC/MFC ATL/ActiveX/COM )




比如:Product类
-Part类
-ADD方法

我调用的时候,可以实现如下:product.part.add




这是通过IDispatch类型的属性来实现的。参加http://msdn.microsoft.com/library/en-us/vcmfc98/html/_mfcnotes_tn065.asp




请问在ActiveX控件里面怎么做出CScrollView那种可以滚动的效果 (VC/MFC ATL/ActiveX/COM )




直接对滚动条进行设置的话就得处理好多消息,还得在画的时候算坐标




在控件里创建一个SCrollView


Designing ActiveX Components with the MFC Document/View Model
By exploiting MFC's poorly understood document/view model, you can give your ActiveX component many great features with relatively little effort

http://www.microsoft.com/mind/0497/mfc.asp




为什么在windows服务程序中WinInet API访问不了外网(VC/MFC 网络编程 )




HttpSendRequest失败, 错误是连接失败。同样的程序在非服务状态下是可以访问外网的。在服务状态下可以访问内网的web服务器,却访问不了外网。难道是服务安全配置的问题?请教




INFO: WinInet Not Supported for Use in Services
http://support.microsoft.com/kb/q238425/




AcitveX控件使用了GDI+后,编译的时候为什么会死机?(VC/MFC ATL/ActiveX/COM )




就在这一步:
Registering ActiveX Control...

我是在App类的InitInstance中初始化的Gdi+,把初始化语句去掉以后就好了,但GDI+的类也不能用了

BOOL CLAvxApp::InitInstance()
{
BOOL bInit = COleControlModule::InitInstance();

if (bInit)
{
if(GdiplusStartup(&m_gdiplusToken, &m_gdiplusStartupInput, NULL)!=Ok){
return FALSE;
}
}

return bInit;
}




不能这样做。CLAvxApp::InitInstance实际上是封装了DLLMain,而GdiplusStartup本质上是加载GDI+的DLL,这会间接调用CLAvxApp::InitInstance封装的DLLMain,造成死锁。你可以在ActiveX的构造函数中初始化GDI+。




如何修改WMV文件的版权信息(VB 多媒体 )




如何修改WMV文件的版权信息!
就是我自己编写的程序已经压缩成WMV了!
没有版权限制!
这时我需要一个程序可以把我自己的WMV文件的版权标题等信息进行任意修改!




参考MetadataEdit示例(MSDN)
http://msdn.microsoft.com/library/en-us/wmform95/htm/sampleapplications.asp

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmform95/htm/iwmheaderinfointerface.asp

http://msdn.microsoft.com/library/en-us/wmform95/htm/workingwithmetadata.asp




WebBrowse中,如何将页面滚动到指定位置(VC/MFC ATL/ActiveX/COM )




例如模仿查找功能,查找一段链接或者一段文字,找到后自动调到该位置。
已经可以拿到页面的各个元素了,但是无法定位它们在页面中的位置。




scrollIntoView


You can also determine the location, width, and height of an object by using a combination of the IHTMLElement::offsetLeft, IHTMLElement::offsetTop, IHTMLElement::offsetHeight, and IHTMLElement::offsetWidth properties. These numeric properties specify the physical coordinates and dimensions of the object relative to the object's offset parent.

For more information about how to access the dimension and location of objects on the page through the Dynamic HTML (DHTML) Document Object Model (DOM), see Measuring Element Dimension and Location.

http://msdn.microsoft.com/workshop/author/om/measuring.asp




如何在MFC程序中不使用Unicode编译而创建支持Unicode的窗口? (VC/MFC 进程/线程/DLL )




现在我需要让程序窗口(使用了MFC)支持Unicode文字的显示,如果能进行Unicode版的编译就很好了,
可是由于程序原来的设计就没有考虑到Unicode版编译的问题,移植的工作量非常大,
我在网上看到有人介绍了一种方法:在非Unicode版的程序上,通过调用RegisterClassExW来注册窗口类,调用CreateWindowExW来创建窗口,使得窗口成为支持Unicode的窗口.
我在一个没使用MFC的程序中用此法成功了,可是在用了MFC的程序中却无法成功,程序没有报错,但创建的窗口却不是Unicode的(IsWindowUnicode()返回false)
请问这是为什么?有办法解决吗?




Create your window in a seperate module. Write a COM object such as ActiveX, for example.

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowfunctions/iswindowunicode.asp

The character set of a window is determined by the use of the RegisterClass function. If the window class was registered with the ANSI version of RegisterClass (RegisterClassA), the character set of the window is ANSI. If the window class was registered with the Unicode version of RegisterClass (RegisterClassW), the character set of the window is Unicode.




通过IHTMLElement的put_innerText方法更改对象的内容为什么会自动转换为HTML代码呢? (VC/MFC ATL/ActiveX/COM )




代码如下:

IHTMLDocument3 *doc;
IHTMLElement *ele;
CppWebBrowser1->Document->QueryInterface(IID_IHTMLDocument3,(void**)&doc);
HRESULT ret = doc->getElementById(L"insScript", &ele);
if(ret == S_OK)
{
ele->put_innerText(L"<script language=javascript>\r\n</script>");
}

这样插入的脚本并不会执行, 而且断行地方,会自动加上<br/>,这可不是我想要的啊?




void CCEditView::OnInsertScript()
{
CInsertScriptDlg* pDlg = new CInsertScriptDlg();
CString strPos = "BeforeEnd";
pDlg->m_strScript = "Insert your script here:";

if ( pDlg->DoModal() == IDOK )
{
IHTMLElement *pElement= NULL;
if (SUCCEEDED(HrGetElementFromSelection(&pElement)))
{
CString strScript = (!pDlg->m_bVB) ?
("&nbsp<script Language=JScript>\n<!-- \n" + pDlg->m_strScript + "\n// -->\n</script>")
: ("&nbsp<script Language=VBScript>\n<!-- \n" + pDlg->m_strScript + "\n' -->\n</script>");
BSTR bstrPos = strPos.AllocSysString();
BSTR bstrContent = strScript.AllocSysString();
pElement->insertAdjacentHTML( bstrPos, bstrContent );
::SysFreeString(bstrPos);
::SysFreeString(bstrContent);
pElement->Release();
}
}
delete pDlg;
}

12/25/2005

网络钓鱼?Nomination of Microsoft Award for Customer Excellence

这两个月连续有两人经过我的安全教育之后仍旧把自己的银行帐户信息、社会保险号什么的给骗子了,一次是电话诈骗,声明是受害者的银行的合作伙伴,已经有了银行帐户号码等信息,但是为了发送礼品,需要支票上的流水号,但是电话误导受害者读出来的位置实际上是需要保密的数据。另一次是伪造paypal网站,用email欺骗用户登录。一直以来我的邮箱里面也不断出现我的ebay、paypal帐户即将被关闭,要打开网页输入我的个人信息验证——尽管我在这些站点并没有帐户。对于这些明显是网络诈骗(Phishing,也被称为网路钓鱼)的邮件,我都是直接拖到垃圾箱。但是,大约一个月之前,我收到这样一封怀疑是网络诈骗的email:


Dear Sheng Jiang,
Thank you for being a great contributor to Microsoft Visual Studio 2005.
You have been nominated to receive the Award for Customer Excellence. This award recognizes your extraordinary contribution to the Visual Studio 2005 product and will be shipped to you without charge.  Please click the following link to arrange shipment of your award:
www.microsoft-ace.com
Should you have any questions about this award, please contact (email omitted).
All the best,
S. Somasegar
Corporate Vice President,
Microsoft Developer Division
看起来很像一封真实的信件。但是,这封email十分可疑,因为它来自www.microsoft-ace.com而不是Microsoft.com,而且这个站点的SSL证书已经过期。一个whois查询显示www.microsoft-ace.com的注册人是


Saltmine Inc.
710 Second Avenue
Suite 1100
Seattle, WA 98104
US
Domain Name: MICROSOFT-ACE.COM


随后,我在Somasegar的BLOG上留言询问http://blogs.msdn.com/somasegar/archive/2005/11/19/494871.aspx ,一个叫Kunal Sikka的人回复说这封email的内容是真的:


The Award for Customer Excellence program is very much a Microsoft program and offer is a genuine offer. The fulfillment of the award is handled by an external vendor. Very much like ancillary processes of other Microsoft programs are handled by vendors - eg: the survey of the MVP program.
Re: the SSL certificate. The vendor involved informed us rather late that their SSL certificate has expired. We have asked the vendor to update their SSL security certificate ASAP and we are expecting that to happen any day.


但是既然任何一个人都可以像我一样在上面留言,我也无从验证Kunal Sikka的评论的真伪。OK,我自己来看看710 Second Avenue, Suite 1100到底是什么公司。Google搜索给出的第一个页面http://mspublisher.saltmine.com/privacy.aspx看起来是微软的Publisher2003站点——Google搜索出问题了?第二个站点看起来才是公司的网站:http://saltmine.com/Aboutus/ContactUs.aspx,和前面的结果在同一个主域名下。且慢,第一个站点到底是什么?打开根目录看看:http://mspublisher.saltmine.com/看起来十分地像一个Microsoft Publisher 2003站点——但是Microsoft Publisher 2003站点为什么不在http://office.microsoft.com下面?这肯定又是一个网络钓鱼站点!


且慢,网站可能是网络钓鱼站点,但是也可能是真的微软合作伙伴。搜索一下Publisher Service Provider Program找到了关于这个项目的介绍http://office.microsoft.com/en-us/assistance/HA010772371033.aspx,点上面的Click to register for PSPP链接,发现了什么?打开了http://mspublisher.saltmine.com/!这个是微软的合作伙伴!


看起来判断是否是网络钓鱼站点的标准不仅仅要判断站点域名,而且要上官方网站搜索合作公司信息?还是且慢。微软的网站上可没有提到这个Award for Customer Excellence。http://www.microsoft-ace.com/ 现在也上不去了,所以我现在无从验证这个网站到底是否是钓鱼站点——但是这更增加了我的怀疑:这个网站是因为网络钓鱼还是别的什么原因所关闭的吗?


参见


12/24/2005

Jiangsheng的CSDN Digest (Dec 2005)

CSDN 讨论总结系列:



关于读XML字串的一个小问题(VC/MFC 基础类)




loadXML之后文档指针已经正常获得,但是文档的内容始终为空




MSXML4的文档对象的async属性默认是真,这时候Load是异步的,要等待对象触发事件再访问文档内容。也可以把文档的async属性设置成false切换到同步模式,这样Load调用之后就可以读DOM了。




.Net和MFC哪个更有前途,大家来讨论一下 (.NET技术 非技术区)




我是计算机专业大三的学生,我这学期已经学完了C++,教材是Essencial C++,但我自己把C++ Primer看完了,正在看Effective C++。我觉得自己基础比较扎实,因为以前C学得也可以。 我现在有点疑惑,不知道该学MFC还是学.Net。 因为听说明年64位操作系统就要出来了。所以学.Net很有前途,但是.Net的正宗语言是C#,不是C++,而我没学过C#,并且听人说C#在底层实现上比较差。 我想问一下,MFC和.Net哪个更有前途。




MFC是在API的基础上封装出来的一个类库,给C++程序员在Windows上快速开发用的。
.Net类库是在Windows非托管API的基础上封装出来的一个托管类库,给程序员在各种Windows平台上跨平台开发用的。

如果你是一个C++程序员,要进行非托管程序开发,那么你不能用.Net类库。如果要进行托管程序开发,你可以选择.Net类库,但是有时也需要在工程中加入对Windows非托管API和MFC的调用,例如http://blog.joycode.com/jiangsheng/archive/2005/03/19/46065.aspx




我使用MSXML DOM创建XML文件,怎么在文件开头写上一些注释? (VC/MFC HTML/XML)




比如我想写上:
<?xml-stylesheet href="a.xsl" _fcksavedurl=""a.xsl"" type="text/xsl" ?>




CreateProcessInstruction




VS2005的类设计器是怎么用的? (.NET技术 VC.NET)




我下了profession的rtm版,找来找去都没找到这个类设计器在哪里?
原有的代码能用类设计器吗,还是说要新建的?




Class Designer is not included in the current version of Visual C++ 2005.

C++ support will not be included in the Class Designer until a future release of Visual Studio, hopefully Visual Studio 2006.




关于继承CTreeCtrl类后,怎样能在初始化控件时同时加入ITEM(VC/MFC 界面)




我建一个类是从CTreeCtrl派生的。我想在自定义类里加入初始化控件的时候,自动加载几个ITEM到控件中。请问怎么做?比如说我的CMyTreeCtrl是继承CTreeCtrl的,然后我用CMyTreeCtrl定义一个控件,我想这控件在初始化时就有我自定义的默认的几项在里边。




把插入项目的代码放在PresubclassWindow里面。对话框是通过SubclassWindow来关联已经创建的子窗口和成员变量的,所以WM_CREATE等消息的处理函数不会总是被调用。




多线程环境下CLISTCTRL切换和刷新慢的问题如何解决(VC/MFC 界面 )




环境:WIN2000 SP4
VS2003。NET
本地运行了自己开发的一个网络服务器软件(没有问题的)
然后运行客户端,
客户端的主界面重载了ONEARSE( ),用来设置背景图片,本身是个对话框程序
原来使用的是LISTBOX监控窗口,刷新和程序切换,界面都没有问题,
改用CLISTCGTRL控件的REPORT模式做监控窗口后,出现问题
CLISTCTRL控件的刷新,在一直保持在TOP WINDOW位置的时候,正常
但是如果有其他程序占用TOP WINDOW位置,然后切换,如果已经连接到服务器(客户端本身也是多线程),那么经常在切换的时候出现CLISTCTRL控件要等一些时间才出现,其他部分却完全正常,
或者把鼠标移动到CLISTCTRL上,也能一点但刷新出来,
但是如果立即最小化,又最大化,通常能立即恢复
在WIN98下调试发现也有这问题,但是以前使用LISTBOX没有任何问题

界面上的CLISTCTRL采用定时刷新机制,间隔3-5秒
同时各线程在收到消息后也会发送立即刷新消息,然后主截面就立即刷新CLISTCTRL控件内容
为了防止闪动,在刷新函数中使用了SETREDRAW( )函数
请各位帮忙分析原因,




估计是SetRedraw的问题
用虚列表+CListCtrl::Update,更新的项目不可见的话没必要SetRedraw这么兴师动众


http://www.codeguru.com/Cpp/data/mfc_database/article.php/c1127




怎么将两个xml文件合并在一个xml文件中?(VC/MFC HTML/XML)




现在两个xml文件,文件的格式都是相似的,比如:
<?xml version="1.0" encoding="UTF-16" ?>
<inforoot informationtime="2005-11-15 14:34:15">
<iedate date="2005-11-08">
<webname mbrid="0" number="2">update.cnnic.cn:80</webname>
</iedate>
</inforoot>

现在我想新建一个xml,然后将2个xml文件的内容都复制到这个新的xml文件中,变成这样:
<?xml version="1.0" encoding="UTF-16" ?>
<root>
<inforoot informationtime="2005-11-15 14:34:15">
<iedate date="2005-11-08">
<webname mbrid="0" number="2">update.cnnic.cn:80</webname>
</iedate>
</inforoot>
<inforoot informationtime="2005-11-16 14:34:15">
<iedate date="2005-11-09">
<webname mbrid="0" number="8">www.sina.com</webname>
</iedate>
</inforoot>
</root>
请问具体该怎么做?
最好有例子或者代码提示,谢谢!




用XSLT来做转换。用document函数就可以导入XML文件。如果你需要导入同一个文件两次,你可能更喜欢用一个变量来保存导入的文件内容。参见http://msdn.microsoft.com/library/default.asp?url=/library/en-us/xmlsdk/html/b24aafc2-bf1b-4702-bf1c-b7ae3597eb0c.asp




使用vc.net中使用API的问题 (.NET技术 VC.NET)




在程序中使用了GlobalAlloc,如果不在from1.h中加入#include <windows.h>,则编译会出现:
error C3861: “GlobalAlloc”: 即使使用参数相关的查找,也未找到标识符
C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\PlatformSDK\Include\WinBase.h(1624): error C2365: “GlobalAlloc” : 重定义;以前的定义是“原先未知的标识符”
,如果在from1.h中加入#include <windows.h>,则编译会出现:
error C2039: “GetObjectW” : 不是“System::Resources::ResourceManager”的成员
这条语句是系统自动生成的,是我在加入一个com控件量系统自动加入
如果解决,在vc.net中使用API的问题怎样使用sdk中的函数




把GetObjectW undef掉,用的时候直接调ANSI或UNICODE版本。在包含windows.h之后
#undef GetObject




如何实现模拟ctrl+alt+delete三键? (Java J2SE / 基础类 )




java.awt.Robot robot=new java.awt.Robot();
robot.keyPress(java.awt.event.KeyEvent.VK_CONTROL);
robot.keyPress(java.awt.event.KeyEvent.VK_ALT);
robot.keyPress(java.awt.event.KeyEvent.VK_DELETE);

robot.keyRelease(java.awt.event.KeyEvent.VK_DELETE);
robot.keyRelease(java.awt.event.KeyEvent.VK_ALT);
robot.keyRelease(java.awt.event.KeyEvent.VK_CONTROL);
这样写为什么不成功?




It is handled differently by operation systems. For example, in windows 2000 and above, it is registered as a hotkey by winlogon.exe, and is handled in a window on the SAS desktop, not the application desktop. You need to open the SAS desktop, and broadcast a WM_HOTKEY message. However, I doubt you can do this in your java virtual machine.

Reference:
www.codeproject.com/system/alt_control_delete.asp




基于对话框的数据库应用程序问题(VC/MFC 界面 )




我的程序用ado实现。现在想加入一个打印功能。查了一下资料,好象只有视图类有可以加打印。但我的程序是基于对话框的。比方说有个查询功能,结果显示在一个对话矿上,如何将它打印呢?




http://msdn.microsoft.com/library/en-us/dncdev00/html/vc0300.asp




如何获得rm,rmvb,avi,wmv,mp3...等文件的头信息? (专题开发/技术/项目 多媒体/流媒体开发 )




如题,能得到播放时间,视频大小。。。tag信息
有通用的函数吗?
请高手指教,最好有源码,delphi的最好




没有通用的函数。
你可以用Windows Media Format SDK里面的WMReader对象打开Windows Media Player支持的文件,之后读取相关信息。参见http://msdn.microsoft.com/library/en-us/wmform95/htm/aboutthewindowsmediaformatsdk.asp。Real的SDK中有rm、rmvb的格式规范(或者查Real提供给IETF的Internet Draft-RealMedia File Format)。mp3可以去查MPEG-1(ISO 11172)的标准文档。AVI文件中的信息可以用AVIFileInfo来获取。




关于gdi+中Image类显示图片的问题 (VC/MFC 基础类 )




通常我们可以用Image(L"c:\\1.jpg")来加载显示图片
但如果图片文件包含在其它文件中,需要用CFile来读到缓冲区中,再加载,
以下段代码为什么不能正常显示图片?谢谢!
void CMy1Dlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting

SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;

// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}

CFile file;
file.Open("c:\\1.jpg", CFile::modeRead);
int bufSize = (int)file.GetLength();
char *pBuf = new char[bufSize];
file.Read(pBuf, bufSize);
WCHAR *ws = new WCHAR[bufSize];
MultiByteToWideChar(CP_ACP, 0,pBuf, bufSize,ws, bufSize);

Graphics graphics(GetDC()->m_hDC);
Image image(ws);
graphics.DrawImage(&image,0, 0, 400, 300);
}




Use COleStreamFile instead of CFile, and use CreateMemoryStream to create a stream in memory.


COleStreamFile image_stream ;
image_stream.CreateMemoryStream(NULL);
img.Save(image_stream.GetStream(), Gdiplus::ImageFormatBMP);


Before reading from the memory stream returned by GetStream, call SeekToBegin.




高分提问!如何对XML文件排序?100分送上,UP有分!(.NET技术 VB.NET )




两个问题:
比如我有如下XML文档,读取时如何根据level和finishDate对每个shmItem排序?
我尝试使用XPathDocument和XPathNavigator,但是如果xml文档中包含中文,初始化就很慢,请各位指教是怎么回事?

<?xml version="1.0" encoding="gb2312"?>
<!--Powered By Ranran.-->
<shemes>
<shmItem>
<id>632698120068125000</id>
<title>文章一</title>
<level>0</level>
<finishDate>2005-12-10</finishDate>
<tips>中文内容
</tips>
</shmItem>
<shmItem>
<id>632698120068125300</id>
<title>titles23</title>
<level>3</level>
<finishDate>2005-12-10</finishDate>
<tips>some content
</tips>
</shmItem>
</shemes>




<?xml version="1.0" encoding=>指明文档使用的编码。写一个XSLT来转。用XSLT查询XML的时候排序。




工程能够正常修改,使用,但是左边工作区里ClassView下一个对话框的类不见了, FileView里有相应的.cpp.h文件,怎么才能使得那个类重新显示(VC/MFC 基础类 )


VC保存时,文件莫名其妙的没了...




保存文件时,经常有这样的警告“有其他进程正在使用本文件”。一般情况下,忽略警告,第二次保存文件时就没有警告了。在某次保存时,出现警告,多按了几次CTRL+S,结果文件没了。不幸中的万幸,我用FinalData把那个丢失的文件找回来了,原文件里大半是乱码,工程目录下多了个MVCDD.TMP的文件,里面就是丢失的代码,完好。想弄清楚这到底是VC的问题还是VA的问题,或是其他问题。




如果使用的是VC6,而且没有打SP6补丁,那么关闭Norton防火墙,或者升级VC。这个问题的详细资料参考微软知识库文章FIX: "Cannot Save File" Error Message in the Visual C++ IDE http://support.microsoft.com/kb/822856/




如何将asf格式的文件分成包发送到网络上?(专题开发/技术/项目 多媒体/流媒体开发 )




问题描述:结点A有一个asf格式的文件,结点B以流媒体的形式从结点A那里获得数据,然后调用media player进行播放。
现在是,结点A如何将asf格式的文件以包的形式发送出去???




Topic in microsoft.public.windowsmedia.sdk
how to use IWMWriterSink::OnDataUnit

Q:
I want to use IWMWriterSink::OnDataUnit() to get the
compressed sample. I modify the WMVNetWrite sample
application for test app, add the following:

IWMWriterNetSink->QurryInterfaceIID_IWMWriterSink,
m_pWriterSink)

m_pWriterSink->AllocateDataUnit();
m_pWriterSink->OnDataUnit();

then use the INSSBuffer::GetBufferAndLength(),but the
buffer content is null! I don't know how to use the
interface: If the OnDataUnit is a callback function, it
should be inherented by a class , otherwise , query
interface to get it, but where and how to call the
OnDataUnit function.
I am waiting for your help
regards
billy

A:
If you want to override OnDataUnit() method of a network sinker. You need to
do these steps:


1. Define a new class that inherits from IWMClientConnections2,
IWMRegisterCallback, IWMWriterNetworkSinkobject, and IWMAddressAccess2
interfaces.


For example:

class CMyWMNetSink : public IWMWriterNetworkSink,
public IWMClientConnections2,
public IWMRegisterCallback,
public IWMAddressAccess2

2. Besides declare the constructor and the destructor of this class,
you also need to declare all methods of the inherited interfaces.

For example:
virtual HRESULT STDMETHODCALLTYPE OnDataUnit(
/* [in] */ INSSBuffer __RPC_FAR *pDataUnit);
3. Implement the constructor of this class
a) Set the reference count to 1
b) Create an internal IWMWriterNetworkSink object m_pNetworkSink by
using WMCreateWriterNetworkSink() function.
4. Implement IUnknow interfaces.
a) Implement AddRef() and Release() method just like you implement
other COM interfaces.
b) Imlplement QueryInterface() method. Return "this" pointer when
querying the supported interfaces, such as IID_IWMWriterNetworkSink,
IID_IWMWriterSink and etc.
5. Implement all other interfaces this class supports. Pass the calls
to the internal IWMWriterNetworkSinker object. Add your own code before or
after the calls.
For example:
HRESULT STDMETHODCALLTYPE CMyWMNetSink::OnDataUnit(
/* [in] */ INSSBuffer __RPC_FAR *pDataUnit)
{
////////////////////////////////////////////
// You can add you code here
////////////////////////////////////////////
IWMWriterSink * pWriterSink = NULL;
HRESULT hr = S_OK;
hr = m_pNetworkSink->QueryInterface( IID_IWMWriterSink, (void
**)&pWriterSink ); if ( FAILED( hr ) ) {return hr;}
hr = pWriterSink->OnDataUnit( pDataUnit ); if ( FAILED( hr ) ) { pWriterSink->Release(); return hr;}
pWriterSink->Release();

/////////////////////////////////////////////////
// You can also add you code here
/////////////////////////////////////////////////
return hr;
}

6. Create an instance of this class in your program. Get the
IWMWriterNetworkSink interface from this instance.
For example:
IWMWriterNetworkSink * pNetworkSink = NULL;
CMyWMNetSink * pMySink = new CMyWMNetSink();
if ( pMySink == NULL ) { return E_OUTOFMEMORY; }
hr = pMySink->QueryInterface( IID_IWMWriterNetworkSink, (void
**)&pNetworkSink ); if ( FAILED( hr ) ) { return hr; }

7. Then you can use this IWMWriterNetworkSink interface in your
program.
--
Thanks!
Gangjiang Li
Microsoft Corp.
Windows Media Format SDK




如何用DirectShow实现将一批BMP图片和指定的MP3合成一个MPEG或AVI文件(VC/MFC 图形处理/算法 )




去看DirectShow示例里面那个desktop push的sample filter CPushSourceDesktop.
(SDK root)\Samples\C++\DirectShow\Filters\PushSource,在网上找一找曾经开源的软件CamStudio的源代码。




一种自定义的图形格式如何在windows的文件管理器里缩略图显示出来(VC/MFC ATL/ActiveX/COM )




就象photoshop和CorelDraw的文件一样, 这种格式按理说Windows是不认识的, 但我们在用缩略图方式查看文件时却可以显示这样的图片, 为什么?如果我们自己有一种格式需要写出自己的图形回显程序才能显示的, 如何通知WINDOWS呢?




http://www.codeproject.com/shell/thumbextract.asp




请问创建线程是用afxBeginThreaD还是应该用CREATETHREAD? (VC/MFC 进程/线程/DLL )




为什么我用调试工具调试时,总是提醒说不应该用AFXBEGINTHREAD而应该用CREATETHREAD?




both C runtime and MFC need some special initialization to function properly, so if you need MFC support, use AfxBeginThread. otherwise use _beginthreadex. DO NOT use CreateThread, since you are almost always using C runtime.




请问这个东西用脚本能实现么? (其他开发语言 脚本语言(Perl ,Python))




我有一个链接
http://mtgroup.ict.ac.cn/~zhp/ICTCLAS.htm

这个链接里面有一个输入框,看不到的朋友我把代码也贴上来。

<body background="ICTCLAS/images/blegtext.gif" bgcolor="#CCCCCC" text="#000000" link="#993300" vlink="#0000FF" alink="#FF9900">

<FORM action="/ictclas-cgi/ictclas_c" method=post>
<P>输入句子段落:
<P><TEXTAREA name=address rows=6 cols=101>张华平于1978年3月出生于江西省波阳县。</TEXTAREA>
<P><INPUT type=submit value=切分标注 name=submit1> <INPUT type=reset value=重置>
</FORM>

</body>

可以看到这里面有关textarea ,还有一个叫做“切分标注的”button。我要做的是模拟在textarea里面输入数据,然后点击“input”button,然后接收到服务器端传回来的结果。
不知道这个事情我能不能用什么语言来做。什么语言都可以。




用Win32::OLE创建一个Internet.Application就可以
#launch an Internet Explorer window and search for ACC map
#for more information about automating Internet Explorer
#see my article http://www.codeproject.com/shell/AutomateShellWindow.asp


use Win32::OLE qw(EVENTS);
my $URL = "http://maps.google.com/";
my $IE = Win32::OLE->new("InternetExplorer.Application")
|| die "Could not start Internet Explorer.Application\n";
Win32::OLE->WithEvents($IE,\&Event,"DWebBrowserEvents2");
$IE->{visible} = 1; #invisible by default
$IE->Navigate($URL);
Win32::OLE->MessageLoop();
sub Event {
my ($Obj,$Event,@Args) = @_;
print "Here is the Event: $Event\n";
if ($Event eq "DocumentComplete") {
my $IEObject = shift @Args;
print "Sender: $IEObject\n";
print "URL: " . $IEObject->Document->URL . "\n";
if($IEObject->Document->URL eq $URL)
{
SetEditBox($IEObject->Document,"q","1212 Rio Grande St., Austin, TX 78701");
ClickButton($IEObject->Document,"submitq");
}
}
if ($Event eq "OnQuit") {
print "User Closed Internet Explorer, quiting";
#Win32::OLE->WithEvents($IE,\&Event,"DWebBrowserEvents2");
undef $IE;
Win32::OLE->QuitMessageLoop();
exit(0);
}
}
sub SetEditBox {
my ($IEDocument,$name, $value) = @_;
my $forms = $IEDocument->forms;
for (my $i = 0; $i < $forms->length; $i++) {
my $form = $forms->item($i);
if (defined($form->elements($name))) {
$form->elements($name)->{value} = $value;
}
return;
}
}
sub ClickButton{
my ($IEDocument,$name) = @_;
my $forms = $IEDocument->forms;
for (my $i = 0; $i < $forms->length; $i++) {
my $form = $forms->item($i);
if (defined($form->elements($name))) {
$form->elements($name)->click;
}
return;
}
}




VC.NET无法启动调试:计算机调试管理服务器被禁用?怎么办?? (.NET技术 VC.NET )




有些网络管理员为了安全起见,禁止一般用户调试程序。你可以使用WinDbg( Debug Tools For Windows)来调试看看




Visual C++ 2005 Express 能否编译出不依赖.net平台的程序 (C/C++ 工具平台和程序库 )




Download the Windows Platform SDK and create a windows or console application.




请教一个C++.NET中定义消息映射函数的问题 (.NET技术 VC.NET)




用MSVisual C++.NET新建一个MFC Application工程.
1、在框架程序的头文件(比如MainFrm.h)中有这样的定义:
#define WM_MYPNP (WM_USER + 100)

//定义消息映射函数:
afx_msg void OnPtoP();

2、然后在程序文件(比如MainFrm.cpp)中这样定义:
BEGIN_MESSAGE_MAP(CMainFrame,CFrameWnd)
ON_MESSAGE(WM_MYPNP ,OnPtoP)
END_MESSAGE_MAP()

void CMainFrame:: OnPtoP()
{
}


在C++6.0是可以的,但在C++.NET(2003)中不行。
编译通不过。
erre:C2440 'static_cast' connot convert from 'void (__thiscall CMainFrame::*)(void)' to ''LRESULT(__thiscall CWnd::*)(PARAM,LPARAM)




afx_msg LRESULT OnPtoP(PARAM,LPARAM);
Visual C++ 6.0 does not check the function signature, and VC2003 uses static_cast to check it.




怎样使DLL中的窗体或对话框PreTranslateMessage能有用呢?(VC/MFC 进程/线程/DLL)




一般情况下DLL 的窗体或对话框,是不能响应这个PreTranslateMessage函数的,
而被主程序窗口响应了。
怎么样使这个函数在DLL的窗体中也能响应呢?有效呢?
我主要是想在DLL的窗体中用工具提示类?
m_ToolTipCtrl.RelayEvent(pMsg);
return CDialog::PreTranslateMessage(pMsg);




PreTranslateMessage is called by a MFC message pump. If the message pump is not a MFC one, your PreTranslateMessage won't be called. Export a PreTranslateMessage function from your DLL and call it in the message pump.


BOOL CXXXDlg::PreTranslateMessage(MSG* pMsg)
{
    // TODO: Add your specialized code here and/or call the base class
    if(m_pDLLExportedPreTranslateMessage(pMsg))
        return true;
    return CDialog::PreTranslateMessage(pMsg);
}

Reference
http://support.microsoft.com/kb/q140850/




Dhtml的应用问题!(Delphi 网络通信/分布式开发)




我的Dhtml总是提示,不支持此接口.!!!
MailDhtml.DocumentHTML:='<html><body></body></html>';
self.MailDhtml.DocumentHTML :='HtmlBuffer.htm'




Re: DHTML CONTROL MICROSOFT UPDATE DISASTER
by Carlos Rocha <carlosCLEARTHISrocha@[EMAIL PROTECTED] > Feb 28, 2005 at 10:40 PM



Dick,


This was post in a Delphi's newsgroup,


"With all the stuff surrounding Hotfix KB891781 breaking applications that use DHTMLED.OCX, it might be not entirely Microsoft's fault after all. After some investigation, this is what I found:


1. DHTMLEDLib_TLB.pas declares:


TDHTMLEdit = class(TOleControl)


2. OleCtrls.pas declares:


TOleControl = class(TWinControl, IUnknown, IOleClientSite,
IOleControlSite, IOleInPlaceSite, IOleInPlaceFrame, IDispatch,
IPropertyNotifySink, ISimpleFrameSite, IServiceProvider)


3. OleCtrls.pas implements a method of IOleClientSite:


function TOleControl.GetContainer(out container: IOleContainer): HResult;
begin
Result := E_NOINTERFACE;
end;


Now, if your application uses TDHTMLEdit, you can trace the call to its DOM member in debug mode in Delphi (I use D2005). You will see that when you try to access DOM, the new version of DHTMLED.OCX makes a call back to your application requesting IOleContainer of your TDHTMLEdit component. The trace arrives at the GetContainer line in OleCtrls.pas, and that is exactly where "No such interface" comes from. Your own application returns it to DHTMLED.OCX, which in turn denies its access to the DOM object.


As was noted somewhere, this does not happen to VB applications. VB implements IOleClientSite.GetContainer, Borland VCL (both Delphi and C Builder) doesn't, and that is the difference and the cause of this problem.


I'm not a big specialist in this stuff. Can somebody suggest how exactly to implement GetContainer? And where - modify OleCtrls.pas, DHTMLEDLib_TLB.pas, or maybe create my own class, descendant of TDHTMLEdit?"


回复人: ly_liuyang(Liu Yang LYSoft http://lysoft.7u7.net)


首先,保存Delphi系统下的OleCtrls.Pas到你的程序所在目录
然后修改部分代码,增加IOleContainer接口

TOleControl = class(TWinControl, IUnknown, IOleClientSite,
IOleControlSite, IOleInPlaceSite, IOleInPlaceFrame, IDispatch,
IPropertyNotifySink, ISimpleFrameSite, IOleContainer)

//IOleContainer
function EnumObjects(grfFlags: Longint; out Enum: IEnumUnknown):
HResult; stdcall;
function LockContainer(fLock: BOOL): HResult; stdcall;
function ParseDisplayName(const bc: IBindCtx; pszDisplayName:
POleStr; out chEaten: Longint; out mkOut: IMoniker): HResult; stdcall;

function TOleControl.EnumObjects(grfFlags: Integer;
out Enum: IEnumUnknown): HResult;
begin
Result := E_NOTIMPL;
end;

function TOleControl.LockContainer(fLock: BOOL): HResult;
begin
Result := E_NOTIMPL;
end;

function TOleControl.ParseDisplayName(const bc: IBindCtx;
pszDisplayName: POleStr; out chEaten: Integer;
out mkOut: IMoniker): HResult;
begin
Result := E_NOTIMPL;
end;

并修改
function TOleControl.GetContainer(out container: IOleContainer):
HResult;
begin
container:= Self;
Result:= S_OK;
end;
 




CArray使用中的问题(VC/MFC 界面 )




我在View类中定义了CArray<int,int>m_plist;编译出现8个错误,主要有:
syntax error : missing ';' before '<'
error C2501: 'CArray' : missing storage-class or type specifiers
error C2059: syntax error : '<'
这是什么错误啊,
2。我理解CArray中第一个int就是这个数组中的存储的数据类型,那么第二个int是表示什么意思呢?看MSDN也没明白。


我定义了CArray<CLine,CLine>m_plist;
CLine data;

m_plist.add(data);
怎么会出现这样一个奇怪的错误
cannot convert parameter 1 from 'class CLine' to 'class CLine'




CArray<class TYPE, class ARG_TYPE>
TYPE
这个模板参数指明了存储在数组中的对象的类型。TYPE这个参数是CArray的返回值。
ARG_TYPE
这个模板参数指明了用来访问数组中的对象的参数的类型,通常是TYPE的参考。ARG_TYPE是用来传递给CArray的参数的类型。


you need a copy constructor to pass a class by value.
you can also use CArray<CLine,CLine& > to pass a class by reference.




如何创建一个没有地址栏的IE窗口 (VC/MFC 网络编程)




不希望让用户看到打开网页的地址,所以想创建一个没有地址栏的IE窗口,但不影响用户做其他操作时,仍能打开一个有地址栏的IE窗口。




http://www.codeproject.com/shell/AutomateShellWindow.asp

IWebBrowser2::put_AddressBar
http://msdn.microsoft.com/workshop/browser/webbrowser/reference/ifaces/iwebbrowser2/addressbar.asp





为什么WebBrowser下载完成一个页触发两次onDocumentComplete事件 (Delphi VCL组件开发及应用)




为什么WebBrowser下载完成一个页触发两次onDocumentComplete、onNavigateComplete、onNavigateComplete事件。
如果在这些事件下作处理数据容易出错,请教一下大家不如何解决。




因为你浏览的页面可能有框架,每个单独的框架都可能会触发DocumentComplete事件。
框架集页面会最后触发DocumentComplete事件。
发送事件的对象可以通过DocumentComplete事件的第一个参数访问


procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject;
const pDisp: IDispatch; var URL: OleVariant);
var
CurWebrowser: IWebBrowser;
TopWebBrowser: IWebBrowser;
Document: OleVariant;
WindowName: string;
begin
CurWebrowser := pDisp as IWebBrowser;
TopWebBrowser := (Sender as TWebBrowser).DefaultInterface;
if CurWebrowser = TopWebBrowser then
ShowMessage('Complete document was loaded')
else
begin
Document := CurWebrowser.Document;
WindowName := Document.ParentWindow.Name;
ShowMessage(Format('Frame "%s" was loaded', [WindowName]));
end;
end;




怎么获得当前登入到2000,xp帐户的类型??? (VC/MFC 基础类)




比如,判断当前是一个管理员帐户,或是一个受限帐户?




Use IsUserAnAdmin
However, if you need to check a limited user account, You need to either use CheckTokenMembership, or construct a security descriptor and perform an access check.

You may need to use GetTokenInformation if you also target NT4.0
// whoami.cpp
// cl whoami.cpp /c1 /c
// link whoami.obj /nodefaultlib msvcrt.lib advapi32.lib kernel32.lib /align:16
//
//
//

#pragma comment(lib,"Advapi32.lib")

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <Windows.h>

#define UULEN 256
int main(int argc,char *argv[])
{
//OpenProcess();
HANDLE hp , htoken;
char buff[2560];
unsigned long size = 2560;

TOKEN_USER *tuser;
PTOKEN_GROUPS tgroup;
PTOKEN_OWNER towner;
PTOKEN_SOURCE tsource;
PSID sid;
char user[UULEN], domain[UULEN];
SID_NAME_USE snu;

hp = htoken = INVALID_HANDLE_VALUE;
hp = GetCurrentProcess();

if(!OpenProcessToken(hp, TOKEN_QUERY | TOKEN_QUERY_SOURCE , &htoken))
{
printf("OpenProcessToken error : %u\r\n", GetLastError());
goto exit_main;
}
if(!GetTokenInformation(htoken, TokenUser, (void*)buff, size, &size))
{
printf("GetTokenInformation error : %u\r\n", GetLastError());
goto exit_main;
}
tuser = (TOKEN_USER*)buff;
sid = tuser->User.Sid;
size = UULEN;
if(!LookupAccountSid(NULL, sid, user, &size, domain, &size, &snu))
{
printf("LookupAccountSid error : %u\r\n", GetLastError());
goto exit_main;
}
// printf("you are '%s\\%s'\r\n", domain, user);
printf( "Domain : %s\nUser : %s\n", domain, user);

size = UULEN *10;
if(!GetTokenInformation(htoken, TokenGroups , (void*)buff, size, &size))
{
printf("GetTokenInformation error : %u\r\n", GetLastError());
goto exit_main;
}
tgroup = (PTOKEN_GROUPS)buff;
int len ;
len = tgroup->GroupCount;
printf( "Group :\n");
int i;
for( i = 0; i< len ; i++)
{
sid = tgroup->Groups[i].Sid ;
size = UULEN;
if(!LookupAccountSid(NULL, sid, user, &size, domain, &size, &snu))
{
//printf("LookupAccountSid error : %u\r\n", GetLastError());
break;
}
printf("\t[%d] %s\n",i+1, user );
}

size = 2560;

if(!GetTokenInformation(htoken,TokenOwner, (void*)buff, size, &size))
{
printf("GetTokenInformation error : %u\r\n", GetLastError());
goto exit_main;
}

towner = (PTOKEN_OWNER)buff;
sid = towner->Owner;
size = UULEN;

if(!LookupAccountSid(NULL, sid, user, &size, domain, &size, &snu))
{
printf("LookupAccountSid error : %u\r\n", GetLastError());
goto exit_main;
}

printf( "Owner : %s\n", user );

size = 2560;

if(!GetTokenInformation(htoken,TokenSource, (void*)buff, size, &size))
{
printf("GetTokenInformation error : %u\r\n", GetLastError());
goto exit_main;
}
tsource = (PTOKEN_SOURCE ) buff;
tuser = (TOKEN_USER*)buff;
sid = tuser->User.Sid;
size = UULEN;

printf( "Source : %.8s\n", tsource->SourceName );


exit_main:
if(htoken != INVALID_HANDLE_VALUE)CloseHandle(htoken);
if(hp != INVALID_HANDLE_VALUE)CloseHandle(hp);
return 0;
}




MFC基于Dialog如何得到屏幕右下角坐标(可用位置) (VC/MFC 界面 )




如何得到屏幕右下角坐标(可用位置)?
int cx = GetSystemMetrics( SM_CXSCREEN );
int cy = GetSystemMetrics( SM_CYSCREEN );

这样可以得到分辨率。但是我需要知道是不是下边有一个任务栏会占据一定高度。又或许任务栏在右边。总之,需要知道可用位置的最右下位置




SystemParametersInfo

This function, with the flag SPI_GETWORKAREA, retrieves the size of the work
area on the primary display monitor. The work area is the portion of the
screen not obscured by the system taskbar or by application desktop
toolbars.
The parameter rc is a RECT structure that receives the coordinates of the
work
area, expressed in virtual screen coordinates




创建WORD.DOCUMENT组件的时候,用CLSCTX_INPROC_HANDLER、CLSCTX_LOCAL_SERVER有什么区别 (VC/MFC ATL/ActiveX/COM )




CLSCTX_INPROC_HANDLER,方式创建的时候,怎么获取MSWORD中的Applicaiton,Document接口。我试了几次好像都不行。
用CLSCTX_LOCAL_SERVER方式创建COM的时候,可以轻松的获取上面提到的接口,单无法做内嵌到其他窗口的功能。




Word是进程外组件,无法使用CLSCTX_INPROC_HANDLER来创建。你可以集成Active Document来嵌入Word这样的Active Document Server。
You're doing some things te hard way. Since you've used #import,
there were several helpful things generated for you that you aren't
using. Most notably is all the smart pointers derived from _com_ptr_t!
You also need to learn how to work with VARIANTs. The _variant_t class
makes it easy.
try
{
Word::_ApplicationPtr pWordApp ;
HRESULT hr = pWordApp.CreateInstance(
__uuidof( Word::Application ) ) ;
if ( hr == S_OK )
{
Word::DocumentsPtr pDocs = theApp.m_pWordApp->Documents ;
_variant_t vtFilename( _T("C:\\MyFile.doc") ) ;
Word::_DocumentPtr pDoc = pDocs->Open( &vtFilename ) ;
// etc.
}
}
catch ( _com_error & ce )
{
CString strMsg ;
strMsg.Format( _T("%s\n%S"), ce.ErrorMessage(),
(LPCWSTR)ce.Description() ) ;
AfxMessageBox( strMsg, MB_OK | MB_ICONSTOP ) ;
}
To my knowledge, Microsoft assumes that anyone smart enough to choose C++ is smart enough not to need documentation. :) They provide all documentation for the Office Automation interface directed to VB users.


If you've got the October 2001 MSDN Library, and are using Word 2000,
like me, the path for the documentation is as follows:
Office Developer Documentation
- Office 2000 Documentation
- Microsoft Office 2000 Language Reference
- Microsoft Word 2000 Reference
- Microsoft Word Visual Basic Reference

For other versions of MSDN or Word, this may obviously vary.
It's actually not too hard to translate. Look at the VB help, then look
at the corresponding object interface in your TLH file. You should see
the analogies.




怎样用VB连接局域网中电脑上的数据库(access,sql,dbf) (VB 数据库(包含打印,安装,报表) )




你应该使用C/S架构的数据库服务器,例如SQL Server, Oracle或者DB2。基于文件的数据库访问很容易造成数据库损坏。参考http://support.microsoft.com/kb/300216/




VC++.net中如何使用正则表达式?(.NET技术 VC.NET )




.Net类库里面System.Text.RegularExpression的用法和其他语言大同小异

VBS引擎那个导入就可以用,不管是VC6还是VC7用法都是一样的。但是要注意一下版本问题,导入随IE3发布的RegExp 1.0组件的类型库兼容性最好,但是默认导入的是最新版本的类型库。导入非默认类型库的方法可以参考http://msdn.microsoft.com/library/en-us/vclang/html/_predir_The_.23.import_Directive.asp,版本区别可以参考http://msdn.microsoft.com/library/en-us/script56/html/vtoriVersionInformation.asp

一些其他的类库也支持正则表达式,例如
http://www.boost.org 或者 http://ourworld.compuserve.com/homepages/John_Maddock/regexpp.htm




最新的Platform SDK for Windows Server 2003 SP1 如何支持VC6.0?(VC/MFC 界面)




好不容易把Platform SDK for Windows Server 2003 SP1下载并安装好了,却发现文档里面写这个版本的SDK不支持VC 6.0,如果使用这个库在VC6.0里面编译的话将会导致连接错误。
请问大家,有没有办法能够使这个版本的SDK能够在VC6.0里面用使用




可以,安装Visual C++ Toolkit 2003就可以升级编译器。
但是,Visual C++ Toolkit 2003编译出来的目标文件和VC6的其他模块不兼容,比如调试器。推荐的方法还是使用免费的VC 2005 Express。




安装VC时出现的问题(VC/MFC 非技术类 )




在复制完所有文件后.
弹出一对话框,对话框内容为:
Setup was unable to create a DCOM user account in
order to register C:\program files\visual studio\Common\tools\Vs-Ent98\vanalyzr
\valec.exe 按确定按钮后,显示安装不完全成功




BUG: "Setup Was Unable to Create a DCOM User Account" Error Message in Visual Studio 6.0
http://support.microsoft.com/?scid=kb;en-us;257413&spid=3042&sid=10




关于 Extension Dll (VC/MFC 进程/线程/DLL)




在一个扩展Dll中导出一个CWnd的派生类JScollWnd,我还能不能在另一个扩展Dll中从JScollWnd派生出(不是导出)类CSGrid?如果能,那么JScollWnd前面的AFX_EXT_CLASS在第二个扩展Dll中将被解释成什么呢?如果不能,还有其他的办法吗?




http://msdn.microsoft.com/library/en-us/vccore/html/_core_mutual_imports.asp




在发布用VC++.net 2003开发的用于Web页面的OCX控件时如何去掉对.net环境的依赖(.NET技术 VC.NET)




现在依赖于msvcr71.dll,但很客户端都没有这个文件,OCX控件自动下载后,无法自动注册




msvcr71.dll不是.Net的一部分。再发布的步骤可以参考http://support.microsoft.com/default.aspx?scid=kb;en-us;326922、http://msdn.microsoft.com/workshop/delivery/download/overview/inf.asp


参见


Redistributing MFC, ATL, and OLE DB Templates Applications


http://msdn.microsoft.com/library/en-us/vccore/html/vcoriRedistributingMFCATLOLEDBTemplatesApplications.asp


Redistributing Microsoft Visual C++ 6.0 Applications


http://www.msdn.microsoft.com/library/en-us/dnvc60/html/redistribvc6.asp
 




C++/CLI 结构体数组使用(.NET技术 VC.NET)




想要使用结构体数组,例如:

value struct pix
{
int x;
int y;
};

然后建立一个该结构体的数组:
array<pix^>^ points=gcnew array<pix^>(10);

现在想要通过一个循环给结构体初始化:
for(int i=0;i<10;i++)
p[i]->x=5; ///这里为何不对呢?应该怎么做才正确?错误提示为:Object reference not
set to an instance of an object.




you need to allocate the elements on the managed heap first.
see http://msdn2.microsoft.com/en-us/library/dtbydz1t.aspx




怎样用tab键把焦点移到子对话框上?(VC/MFC 基础类 )




我建了一个对话框程序,在主对话框上加入了一个子对话框,但是发现tab键只能在主对话框的其他控件之间切换,怎样才能使焦点移到子对话框上啊?




Use DS_CONTROL as a window style for the child dialog

If the you can not tab out from the child dialog, try overriding PreTranslateMessage in your child dialogs and call the parent 's PreTranslateMessage first, return TRUE if it does. Otherwise, return through CDialog::PreTranslateMess




MIDL中如何定义返回BSTR数组的方法(VC/MFC ATL/ActiveX/COM)




为什么这样定义只能返回第一个串,第二个开始都是无效地址。
HRESLUT GetStrings([out]short*psize,[out,size_is(,*psize)]BSTR**ppstrs);

说明一下我把该COM方法代码改写为本地客户端内的函数后,可以正确调用。




You can not pass a array in a short variable. see How To Pass Arrays Between Visual Basic and C
http://support.microsoft.com/default.aspx?scid=KB;EN-US;Q207931




AfxBeginThread启动工作线程出现的问题(VC/MFC 进程/线程/DLL )




VC.net 2003提示说:error C2665: “AfxBeginThread” : 2 个重载中没有一个可以转换参数 1(从“UINT (LPVOID)”类型) d:\softwares\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\include\afxwin.h(4105): 可能是“CWinThread *AfxBeginThread(AFX_THREADPROC,LPVOID,int,UINT,DWORD,LPSECURITY_ATTRIBUTES)”
d:\softwares\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\include\afxwin.h(4108): 或 “CWinThread *AfxBeginThread(CRuntimeClass *,int,UINT,DWORD,LPSECURITY_ATTRIBUTES)”
试图匹配参数列表“(overloaded-function, CClientSocket *, int)”时


我是这么用的:AfxBeginThread(ClientThread,pClientSocket,THREAD_PRIORITY_NORMAL);
其中ClientThread函数原型为UINT ClientThread(LPVOID pParam),pClientSocket为一个指向CSocket类的指针。




不要传递CSocket*,和大多数MFC类一样,这个MFC类不是线程安全的
把socket句柄强制转换成LPARAM类型再传递过去。


void CListeningSocket::OnAccept(int nErrorCode)
{
CSocket::OnAccept(nErrorCode);
CSocket socket;
if (Accept(socket))
{
SOCKET hSocket= socket.Detach();
AfxBeginThread(AcceptConnection, (LPVOID)hSocket);
}
}


UINT AcceptConnection( LPVOID pParam )
{

SOCKET hSocket = (SOCKET)(pParam);
CSocket Socket;
Socket.Attach( hSocket ); // gives resource exception
.
.
.
.
}




如何用javascript调用VC++的函数(VC/MFC 基础类)




有一个网页作为资源放在VC++资源里 用HtmlView可以显示 但是如何使网页里的javascript与C++通信呢?也就是javascript调用C++的函数 注意这个网页是作为资源存在的 而不是写在C++里的




http://blog.csdn.net/jiangsheng/archive/2003/11/09/3795.aspx
http://blog.csdn.net/jiangsheng/archive/2004/06/27/27807.aspx
http://blog.csdn.net/jiangsheng/archive/2004/07/06/35567.aspx
http://blog.csdn.net/jiangsheng/archive/2004/11/07/170742.aspx




动态创建的控件在自己的事件中销毁自己安全吗(Delphi VCL组件开发及应用)




我写了一个不可视控件,内部有个线程(用的是BeginThread,未用TThread),
线程函数的参数就是“Self”:

BeginThread(nil,0,@_WkrThreadProc,Pointer(Self),CREATE_SUSPENDED,dwThreadId);

另外控件有个私有的用AllocateHWnd()建立的隐藏窗口。


使用者调用控件的Start()方法后,Start()内启动线程,线程在工作中,不断用
PostMessage投递自定义的消息到隐藏窗口(线程退出前的最后一个消息是自定义
的WM_THREAD_END),隐藏窗口的窗口过程处理消息并调用事件点火代码触发事件,
WM_THREAD_END消息仅仅就是触发控件的OnEnd(Sender: TObject)事件,没有其他代码。

控件的destructor中先等待线程的结束(如果线程还在运行),清理一些成员,
然后DeallocateHWnd隐藏窗口,

-----------------------------
我的问题是:如果使用者动态创建控件,并在在控件的OnEnd事件里把控件自身销毁,
比如Sender.Free()是安全的吗?




你的 控件的OnEnd事件, 已经是在对应窗口的线程中调用,估计这里问题不大,
关键是你的destructor 中有否正确释放资源


Firing an event is like calling a method or function. So the event
handler is called from the object itself, which is still alive at that
time, and therefore it is potentially dangerous to delete it. It's OK to
delete if you are sure that the method where the event is fired from no
longer refers to any of the member variables (or resources). However, I strongly recommend the following COM IOleObject implementation:

pIOleObject->Close(); //notify the object, so it can close itself gracefully
pIOleObject->Release();//free your reference to the object




MFC编写ActiveX,在属性页中如何得到控件的指针(VC/MFC ATL/ActiveX/COM )




http://support.microsoft.com/kb/205670




如何使用WindowsAPI提供的MD5加密函数(VC/MFC 基础类 )




WinXP, VC7.1

在MSDN中,有几个函数介绍:MD5Init();MD5Update();MD5Final();

Header: Declared in MD5.h.
Library: Included as a resource in CryptDLL.dll

我在程序中#include <MD5.h>
#import <CryptDLL.dll> //加不加都没用
但编译器还是提示找不到那几个函数,请问这是什么原因?




http://msdn.microsoft.com/library/default.asp?url=/library/en-us/devnotes/winprog/md5init.asp

This function has no associated header file or import library. You must use the LoadLibrary or GetProcAddress functions to dynamically link to Cryptdll.dll.




Webbrowser的控制下载(Delphi VCL组件开发及应用 )




Webbrowser有onbeforeNavigate 可以判断是什么网址以及终止该操作。但是onDownloadBegin中如果获取当前下载对象的url以及如何终止呢??第二次提这个问题,我想在wb做的浏览器中,选择性的下载的一些对象,一些受排斥的对象,如js. falsh. image等,能进行选择性的阻止!!




www.codeproject.com/atl/vbmhwb.asp
虽然是面向VB设计的,但是Delphi也应该可以用




如何使用VC来更改"工作组"或"域" (VC/MFC 硬件/系统 )




在WinXP/2003中可以使用WMI。参见http://www.microsoft.com/technet/scriptcenter/guide/sas_wmi_osjn.mspx
http://www.microsoft.com/technet/scriptcenter/topics/networking/05_atnc_dns.mspx和http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/WDdnclinicscripting.mspx




怎样使CListctrl第一列中的各项居中显示(VC/MFC 界面 )




同样是“LVCFMT_CENTER”,为什么第二列和第三列都能居中,可第一列实际显示就是偏左呢?




MSDN documentation:


If a column is added to a list-view control with index 0 (the leftmost column) and with LVCFMT_RIGHT or LVCFMT_CENTER specified, the text is not right-aligned or centered. The text in the index 0 column is left-aligned. Therefore if you keep inserting columns with index 0, the text in all columns are left-aligned. If you want the first column to be right-aligned or centered you can make a dummy column, then insert one or more columns with index 1 or higher and specify the alignment you require. Finally delete the dummy column.




怎样使加到CListCtrl中的图标居中显示(VC/MFC 基础类 )




我在对话框程序中的一个CListCtrl第二列加入了图标,怎样才能使它们居中显示?文字居中就可以,假如图标就不行了。




use customerdraw
see http://blog.csdn.net/jiangsheng/archive/2003/11/20/3796.aspx and http://msdn.microsoft.com/library/en-us/shellcc/platform/commctls/listview/notifications/nm_customdraw_listview.asp




问三个问题,都是与IE有关的(VC/MFC HTML/XML )




我做了一个ActiveX控件,在网页中使用,现有三个问题想问一下,不知道能否实现:
1、能否调出IE的下在对话框下载文件,就像IE右键中的“目标另存为”
2、能否在控件里控制在新窗口中打开一个链接
3、能否控制IE的前进后退的历史列表




1 用一个隐藏的浏览器控件浏览到文件
2 http://www.codeproject.com/shell/AutomateShellWindow.asp
3 http://msdn.microsoft.com/workshop/browser/travellog/travellog.asp




产生不重复随机数的问题 (VB 基础类)




生成 1 到 250 的125个随机数,要求无重复数




You can shuffle an array of natural numbers between 1 and 250; however, you don't need to complete the shuffling since you merely need 125 numbers.


From http://en.wikipedia.org/wiki/Shuffle:

In computer science, shuffling is equivalent to generating a random permutation of the cards. There are two basic algorithms for doing this, both popularized by Donald Knuth. The first is simply to assign a random number to each card, and then to sort the cards in order of their random numbers. This will generate a random permutation, unless two of the random numbers generated are the same. This can be eliminated either by retrying these cases, or reduced to an arbitrarily low probability by choosing a sufficiently wide range of random number choices.

The second, generally known as the Knuth shuffle or Fisher-Yates shuffle[1], is a linear-time algorithm (as opposed to the previous O(n log n) algorithm if using efficient sorting such as mergesort or heapsort), which involves moving through the pack from top to bottom, swapping each card in turn with another card from a random position in the part of the pack that has not yet been passed through (including itself). Providing that the random numbers are unbiased, this will always generate a random permutation.

Notice that great care needs to be taken in implementing the Knuth shuffle; even slight deviations from the correct algorithm will produce biased shuffles. For example, working your way through the pack swapping each card in turn with a random card from any part of the pack is an algorithm with nn different possible execution paths, yet there are only n! permutations. A counting argument based on the pigeonhole principle will clearly show that this algorithm cannot produce an unbiased shuffle, unlike the true Knuth shuffle, which has n! execution paths which match up one-to-one with the possible permutations.

Whichever algorithm is chosen, it is important that a source of truly random numbers is used as the input to the shuffling algorithm. If a biased or pseudo-random source of random numbers is used, the output shuffles may be non-random in a way that is hard to detect, but easy to exploit by someone who knows the characteristics of the "random" number source.

References
D. Aldous and P. Diaconis, "Shuffling cards and stopping times", American Mathematical Monthly 93 (1986), 333–348
Trefethen, L. N. and Trefethen, L. M. "How many shuffles to randomize a deck of cards?" Proceedings of the Royal Society London A 456, 2561–2568 (2000)

http://www.math.washington.edu/~chartier/Shuffle/
http://www2.toki.or.id/book/AlgDesignManual/BOOK/BOOK4/NODE151.HTM




窗口句柄失效时抛出的异常是什么?如何捕获?如何获取当前IE窗口的URL(VC/MFC 基础类 )




我在MFC程序里检查各个IE窗口的URL并进行相应的处理。可是有时候用户关闭某个窗口程序就会出现异常
(因为这时候窗口句柄已经失效了)。如何捕捉该异常呢?另外能否直接获取当前激活的IE窗口的URL?
相关代码:

SHDocVw::IShellWindowsPtr m_spSHWinds;
if (m_spSHWinds.CreateInstance(__uuidof(SHDocVw::ShellWindows)) != S_OK)
{
CoUninitialize();
return EmptyString;
}
int n = m_spSHWinds->GetCount();
for (int i = 0; i < n; i++)
{
//....
}




http://blog.joycode.com/jiangsheng/archive/2005/10/20/65489.aspx




VC2003中新建了一个MFC的程序,如何加入一个ACTIVEX控件(.NET技术 VC.NET )




http://msdn.microsoft.com/library/en-us/vccore/html/vcgrfWhereIsClassWizardInVisualCNET.asp




在htm中接受com控件发出的事件(VC/MFC ATL/ActiveX/COM )




我为客户做了一个com控件有一些事件(如OnStateChange)发出,客户要求用htm调用。
一开始,一切正常htm中调用代码如下:

<OBJECT ID="DvdPlayCtl" CLASSID="CLSID:EE9626A3-976C-470C-8282-07AB2FE2F85F"></OBJECT>

<SCRIPT language="JavaScript">

DvdPlayCtl.attachEvent("OnStateChange", MyOnStateChange);

function MyOnStateChange(state,info)
{
alert("state change to "+state+" ,"+info);
}
</script>
则一旦com的状态发生改变就发出OnStateChange事件,htm就可以正常接受并提示,但后来客户要求用
另一种方式声明com控件,代码如下:

<SCRIPT language="JavaScript">
var DvdPlayCtl = new ActiveXObject("DvdPlayCtl.DvdPlayCtl");
</script>
即动态生成此com控件,则运行htm时以前的代码DvdPlayCtl.attachEvent部分出错:“对象不支持此操作”




1、在com中增加一个属性OnStateChange,其类型为IDispatch *并为其添加put方法。

2、在put方法的实现中将传进的DISPATCH型指针赋给自己的成员变量IDispatch *m_pDispatch。

STDMETHODIMP CDvdPlayCtl::put_OnStateChange(IDispatch *newVal)
{
// TODO: Add your implementation code here
m_pDispatch = newVal;
return S_OK;
}

3、定义成员函数void Send_Event(int state, TCHAR * info);在发送事件的函数中添加以下代码:
if (m_pDispatch != NULL)
{
CComVariant* pvars = new CComVariant[2];

pvars[1] = state;//回调函数的第一个参数
pvars[0] = info;//回调函数的第二个参数

DISPPARAMS disp = { pvars, NULL, 2, 0 };
HRESULT hr = m_pDispatch->Invoke(0, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, NULL, NULL, NULL);
delete[] pvars;
}
注意:
1、pvars的填充与函数参数顺序是相反的
4、在htm中如下调用
<script language="JavaScript">

var DvdPlayCtl = new ActiveXObject("DvdPlayCtl.DvdPlayCtl");

DvdPlayCtl.OnStateChange = OnStateChange;
DvdPlayCtl.OnError = OnError;

function OnStateChange(state,info)
{
alert("state change to "+state+" ,"+info);
}
</script>




類似VC的界面中,左邊的樹形控件不是添加一個控件,而是在MainFrm中定義的一個變量,如何做它的雙擊響應事件(VC/MFC 界面)




控件的通知消息是发给父窗口的,但是MFC也支持消息反射,所以你可以在控件的父窗口主框架中处理消息,或者从CTreeCtrl派生一个类来处理反射的消息。参考微软技术文章TN062 消息反射。




如何检测显示器是否处于休眠状态 (Delphi Windows SDK/API )




休眠状态是指用SendMessage(Handle, WM_SYSCOMMAND, SC_MONITORPOWER, -1)关闭的




The GetDevicePowerState function is supposed to retrieve the current power state of the specified device. However, Apps may fail to use GetDevicePowerState on the display, as they can't get a handle on "\\.\Display#", while the # index is 1-based, or "\\.\LCD", for security reasons.

If you are trying to do this on Windows XP, then you can use SetupDiGetDeviceRegistryProperty and Property: SPDRP_DEVICE_POWER_DATA to get the power management information. This is documented in the Windows XP DDK.

The WMI Class Win32_DesktopMonitor does not report the power state. use SPI_GETPOWEROFFACTIVE or DeviceIOControl with IOCTL_VIDEO_GET_POWER_MANAGEMENT will simply reports power management is enabled or not. SPI_GETPOWEROFFACTIVE just determines whether the power-off phase of screen saving is enabled or not.

BTW, you can always use the SetThreadExecutionState or other APIs (you have used) to switch ON the monitor no matter the monitor is in the ON or OFF state.

References

http://msdn.microsoft.com/library/en-us/Display_r/hh/Display_r/VideoMiniport_Functions_b47b2224-5e0b-44af-9d04-107ff1299381.xml.asp

http://msdn.microsoft.com/library/en-us/wmisdk/wmi/win32_desktopmonitor.asp




使用CWebBrowser2的打印功能时,可不可以去掉文件路径的打印(VC/MFC 网络编程 )




如我们打印www.csdn.net主页
在打印出的页面左下脚会有

http://www.csdn.net/

如何去掉,请朋友们帮忙解决


附:打印代码
void CMyDlg::OnBtPrint()
{
// Verify the Web Browser control is valid.
LPDISPATCH lpDispApp = m_wndBrowser.GetApplication();
if(lpDispApp)
{
// Get the HTMLDocument interface.
LPDISPATCH lpDispDoc = m_wndBrowser.GetDocument();
if (lpDispDoc != NULL)
{
// Get the IOleCommandTarget interface so that we can dispatch the command.
LPOLECOMMANDTARGET lpTarget = NULL;
if (SUCCEEDED(lpDispDoc->QueryInterface(IID_IOleCommandTarget,(LPVOID*) &lpTarget)))
{
// Execute the print preview command. The control will handle the print preview GUI.
// OLECMDID_PRINTPREVIEW is defined in "docobj.h".
lpTarget->Exec(NULL, OLECMDID_PRINTPREVIEW, 0, NULL, NULL);
lpTarget->Release();
}
lpDispDoc->Release();
}
lpDispApp->Release();
}
}
 




其实IE是可以设置打印出来的Header和Footer的.

1. 构造一个其实是SafeArray的VARIANT,这个SafeArray包含Header和Footer两个元素,
然后在在Exec的倒数第二个VARIANT参数那里传进去,这样真实打印出来的时候就是
你想要的设置了. 具体设置方法非常复杂,MSDN里面搜索一下
Printing with the Internet Explorer WebBrowser Control,有非常详细论述.Microsoft都说只能Workaround.
2. 当倒数第二个VARIANT参数是NULL的时候,IE会用你在IE里的页面设置.

3. PRINTPREVIEW的时候,无论你在倒数第二个参数设了多么多东西,IE也只会用回IE自己的页面设置. 所以无论你怎么设,通过IE的打印预览,你无法看到你编程设置的Header和Footer, 你设的Header和Footer只有OLECMDID_PRINT才能奏效. 这时可以用虚拟打印机来调试程序的.

4. 也可以Hack一下,打印或者打印预览前保存注册表里面的设置,然后设为你想要的,打印后再恢复回去.页面设置在注册表里的位置MSDN好像有讲,自己也可以搜注册表搜到.

上面讨论以IE6 SP1为准.其他版本的有一定程度上不同


http://support.microsoft.com/support/kb/articles/Q267/2/40.ASP
http://msdn.microsoft.com/workshop/browser/mshtml/reference/constants/idm_print.asp
http://msdn.microsoft.com/workshop/browser/hosting/printpreview/reference/behaviors/headerfooter.asp




请问在ActiveX控件里面怎么做出CScrollView那种可以滚动的效果(VC/MFC ATL/ActiveX/COM )




直接对滚动条进行设置的话就得处理好多消息,还得在画的时候算坐标




Designing ActiveX Components with the MFC Document/View Model
By exploiting MFC's poorly understood document/view model, you can give your ActiveX component many great features with relatively little effort

http://www.microsoft.com/mind/0497/mfc.asp




axWebBrowser 后退\前进的问题 (.NET技术 C# )




WinForm 中用 axWebBrowser 控件,有前进\后退的按钮,默认是 Enable = false,怎么能在点击网页中的连接后,激活后退按钮,退到首次访问页面后,禁止后退按钮,同理前进按钮. 也就是说,当有可后退旱,后退按钮激活,当可前进时,前进按钮激活,否则禁止.




捕获commandstatechange事件
参考http://support.microsoft.com/kb/q836128




mdi方式下,建立多个doc/view模版的方法(VC/MFC 界面 )




mdi方式下,建立多个doc/view模版的方法?
msdn中的帮助里有个例子,mdidocvw只有实现,没有过程讲解,看不懂。
程序开始的时候有一个模版,但是第二个怎么加,手动建立3个类?




Creation of Multiple Dynamic Views. How to initilize and use additional different views in your MDI app by using Doc / view architecture. Example code of OpenGL window and a Dialog window.

http://www.codeproject.com/docview/MultiViewsMFC_MDI.asp

Create additional classes. Use ClassWizard, WizardBar, or ClassView to create additional document, view, and frame-window classes beyond those created automatically by AppWizard.

http://msdn.microsoft.com/library/en-us/vccore98/html/_core_sequence_of_operations_for_building_mfc_applications.asp




如何给Richedit加上英文单词拼写检查功能?(Delphi VCL组件开发及应用)




Adding Spell Check and Synonym Info to a Text Editor, using Word Automation

http://www.codeproject.com/com/AutoSpellCheck.asp