`
camel2099
  • 浏览: 46144 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

vista开发注意事项及解决方案

阅读更多
1.判断UAC是否启动
BOOL _stdcall IsRunUAC()//判断是否启动UAC
{
BOOL bRet = FALSE;
LONG lErr;
HKEY hKEY;
DWORD dwEnableLUA;
DWORD dwType = REG_DWORD;
DWORD dwSize = sizeof( DWORD );

if( IsVISTA() )
{
lErr = RegOpenKeyEx( HKEY_LOCAL_MACHINE,
_T(“SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System\\”),
0,
KEY_READ,
&hKEY );
if( lErr == ERROR_SUCCESS )
{
lErr = RegQueryValueEx( hKEY,
_T( “EnableLUA” ),
NULL,
&dwType,
(BYTE*)&dwEnableLUA,
&dwSize );
if( lErr == ERROR_SUCCESS )
{
if( 0 == dwEnableLUA )
{
bRet = FALSE;
}
else
{
bRet = TRUE;
}
}
else;

RegCloseKey( hKEY );
}
else;
}
else;

return bRet;
}

以上代码是判断一个注册表键值,不是正规方式。UAC启动要通过重起系统完成,这个标志位不表示当前UAC状态,所以此代码要在系统启动时执行才有效。

2.解决UAC打开时,不同权限之间的应用程序间不能广播消息
Vista UAC打开时,不同权限的应用程序广播消息是收不到的。

UINT UIBroadcastCommand = ::RegisterWindowMessage( SNA_MESSAGE );
ON_REGISTERED_MESSAGE( UIBroadcastCommand, OnFromMessage )

将以下代码加入程序启始位置
BOOL AllowMeesageForVista( UINT uMessageID, BOOL bAllow )//注册Vista全局消息
{
BOOL bResult = FALSE;
HMODULE hUserMod = NULL;

do
{
//vista and later
hUserMod = LoadLibrary( “User32.dll” );
if( NULL == hUserMod ) break;

_ChangeWindowMessageFilter pChangeWindowMessageFilter = (_ChangeWindowMessageFilter)GetProcAddress( hUserMod, “ChangeWindowMessageFilter” );
if( NULL == pChangeWindowMessageFilter )break;

bResult = pChangeWindowMessageFilter( uMessageID, bAllow ? 1 : 2 );//MSGFLT_ADD: 1, MSGFLT_REMOVE: 2
}
while( 0 );

if( NULL != hUserMod )
{
FreeLibrary( hUserMod );
}
else;

return bResult;
}

这里使用Vista提供的标准函数ChangeWindowMessageFilter注册一个全局消息。但是由于系统服务与应用程序间的session不同,所以应用程序无法响应系统服务的广播消息。

3. 系统服务与应用程序的事件通讯

在Vista中高权限进程创建的事件使用低权限进程是无法open的(其它windows也一样)。在创建事件时使用以下代码
DWORD _stdcall MyCreateEvent( HANDLE* phEvent, BOOL bManualReset, BOOL bInitialState, LPCTSTR lpName )
{
DWORD dwRet = 0;
PSID pEveryoneSID = NULL, pAdminSID = NULL;
SID_IDENTIFIER_AUTHORITY SIDAuthWorld = SECURITY_WORLD_SID_AUTHORITY;
EXPLICIT_ACCESS ea[1];
PSECURITY_DESCRIPTOR pSD = NULL;
PACL pACL = NULL;
SECURITY_ATTRIBUTES sa;

*phEvent = NULL;

////////////////////////
do
{
// Create a well-known SID for the Everyone group.
if( !AllocateAndInitializeSid( &SIDAuthWorld,
1,
SECURITY_WORLD_RID,
0, 0, 0, 0, 0, 0, 0,
&pEveryoneSID ) )
{
dwRet = GetLastError();
break;
}
else;

// Initialize an EXPLICIT_ACCESS structure for an ACE.
ZeroMemory( &ea, sizeof(EXPLICIT_ACCESS) );
ea[0].grfAccessPermissions = EVENT_ALL_ACCESS;
ea[0].grfAccessMode = SET_ACCESS;
ea[0].grfInheritance= NO_INHERITANCE;
ea[0].Trustee.TrusteeForm = TRUSTEE_IS_SID;
ea[0].Trustee.TrusteeType = TRUSTEE_IS_WELL_KNOWN_GROUP;
ea[0].Trustee.ptstrName = (LPTSTR) pEveryoneSID;

// Create a new ACL that contains the new ACEs.
dwRet = SetEntriesInAcl( 1, ea, NULL, &pACL );
if( ERROR_SUCCESS != dwRet )
{
break;
}
else;

// Initialize a security descriptor.
pSD = (PSECURITY_DESCRIPTOR)LocalAlloc( LPTR,
SECURITY_DESCRIPTOR_MIN_LENGTH );
if( NULL == pSD )
{
dwRet = GetLastError();
break;
}
else;

if( !InitializeSecurityDescriptor( pSD, SECURITY_DESCRIPTOR_REVISION ) )
{
dwRet = GetLastError();
break;
}
else;

// Add the ACL to the security descriptor.
if (!SetSecurityDescriptorDacl( pSD,
TRUE, // bDaclPresent flag
pACL,
FALSE ) ) // not a default DACL
{
dwRet = GetLastError();
break;
}
else;

// Initialize a security attributes structure.
sa.nLength = sizeof( SECURITY_ATTRIBUTES );
sa.lpSecurityDescriptor = pSD;
sa.bInheritHandle = FALSE;

////////////////
*phEvent = CreateEvent( &sa, bManualReset, bInitialState, lpName );
if( NULL == *phEvent )
{
dwRet = GetLastError();
break;
}
else;
}
while( 0 );

//////////
if( pEveryoneSID )
{
FreeSid( pEveryoneSID );
}
else;

if( pACL )
{
LocalFree( pACL );
}
else;

if( pSD )
{
LocalFree(pSD);
}
else;

return dwRet;
}


(文章来自:码农源库
http://www.vcclass.net/wordpress/?p=26)
分享到:
评论

相关推荐

    vista下使用的h3c上网软件

    3. **readme.txt**:这是一个常见的文本文件,通常包含软件的安装指南、使用说明、注意事项或者版权信息。用户在安装和使用软件之前应该先阅读此文件,以了解软件的正确使用方法和可能的限制。 综上所述,这个...

    解决vista不兼容vb6.0的问题

    #### 四、注意事项 - **测试**:在应用任何兼容性设置之前,请确保先在一台测试机器上进行尝试,避免对生产环境造成不必要的影响。 - **备份**:在修改注册表或系统文件之前,请务必做好备份,以防万一出现问题时...

    xptovista.zip

    标签中的"xptovista"和"xptovista.zip"进一步确认了文件的主题,这可能是一个专门针对XP到Vista升级的解决方案。 "说明_Readme.html"是常见的压缩包内文件,它通常包含有关如何使用包含的文件、注意事项、系统要求...

    Vista下安装XP

    2. 如果你的电脑是预装Vista的品牌机,没有安装光盘,可以寻找其他解决方案,例如通过网络下载安装文件。 完成以上步骤后,重启电脑,你将看到多系统启动菜单,可以选择启动Windows Vista或新安装的Windows XP/2003...

    深入体验VC++项目开发

    #### 三、项目开发注意事项 在进行项目开发时,应注意以下几点: - **软件兼容性**:确保所使用的开发工具和系统环境符合项目要求,避免因软件版本不兼容导致的问题。 - **数据库初始化**:对于依赖数据库的项目,...

    教你 vista下安装ArcGis9.2

    - 在安装过程中遇到任何错误时,记录下错误代码,并搜索相应的解决方案。 - 安装完成后,确保所有组件都能正常工作,并进行必要的更新或补丁安装。 #### 结论 通过上述步骤,用户可以在 Windows Vista 操作系统上...

    vistaghost

    【vista ghost】这个标签表明该工具是专门针对Vista系统的Ghost解决方案。在Windows Vista系统中,由于系统级别的改变,传统的Ghost方法可能不再适用。VistaGhost通过优化和适应Vista环境,确保了Ghost程序的兼容性...

    Android开发工具手册

    ### Android开发工具手册知识点解析 ...以上内容详细介绍了《Android开发工具手册》中的关键知识点,包括主要功能的操作指南、常见问题的解决方法以及使用过程中的注意事项,旨在帮助开发者更好地理解和使用该工具。

    H-JTAG调试详解及其注意事项

    这三者共同构成了H-JTAG的完整调试解决方案。 H-JTAG支持所有基于CORTEX-M3、ARM7、ARM9和XSCALE芯片的调试,并能支持LITTLE-ENDIAN及BIG-ENDIAN数据格式,THUMB及ARM指令集,并兼容SEMIHOSTING技术。H-JTAG还支持...

    win7和vista硬盘启动beini安装方法.doc

    #### 二、解决方案概述 鉴于上述变化,本文介绍了一种新的引导方法,即通过一个名为MouseDos工具箱的软件来实现Beini在Win7或Vista系统上的引导。MouseDos工具箱是基于Grub源代码开发的,集成了许多DOS下的实用工具...

    Gadget新手上路 这些小程序是Windows Vista边栏强大的扩展,早期版本的Windows也能方便地获取.zip

    对于那些想要在早期Windows版本上使用Vista Gadgets的用户,以下是一些步骤和注意事项: 1. 安装Gadget支持:Windows XP和Windows 7默认不支持Gadgets,需要下载并安装“Windows Sidebar for Windows XP”或...

    系统音量控制 适用于win7/vista下 源代码

    6. **开发注意事项**:在使用此源代码时,开发者需要了解Windows SDK和C/C++编程,因为Core Audio API通常用这些语言实现。同时,由于源代码不适用于XP,开发者需要额外处理版本检测和兼容性问题,以确保在不同版本...

    Windows+CE+6.0搭建开发环境及模拟器的使用.pdf

    - **解决方案**: - 在自定义 SDK 时,以模拟器版本的 SDK 为例,进行必要的配置。 - 关键步骤在于调整编译选项,取消勾选 ENABLE KITL(no IMGNOKITL)选项,重新编译生成模拟器版本的内核。 #### 四、总结 通过以上...

    施耐德Ampla问题集锦12.pdf

    总结来说,本篇问题集锦提供了在Vista系统上安装Ampla Web客户端时可能遇到的特定错误代码2869的解决方案,并包含了操作的注意事项和免责声明,对于使用Vista系统的用户来说,是一个宝贵的故障排查参考资料。

    Windows_7搭建WinCE6.0开发环境

    在Windows 7旗舰版上搭建WinCE 6.0开发环境虽然存在一定的挑战,但通过仔细遵循上述步骤和注意事项,可以有效克服这些困难。确保所有软件和服务包正确安装,并注意权限问题和兼容性问题,可以显著提高开发环境的稳定...

    珠海鼎立公司软件开发项目文档

    解决方案是重启电脑后重新安装软件,避免冲突。 4. **杀毒软件对Pilot Pioneer的影响**: - 以卡巴斯基为例,在安装DL-WLAN协议时,如果杀毒软件对DLNDISPROT.SYS进行主动防御,用户需要选择“允许操作”以确保...

    CEGUI0.7.6源码配置编译详细过程.pdf

    6. **注意事项** - 编译完成后,生成的库文件(如CEGUIOgreRenderer.lib和CEGUIOgreRenderer.dll)可用于基于OGRE的应用中集成CEGUI。 - 如需使用其他渲染器,如CEGUIDirect3D10Renderer,同样可以在`config.lua`...

Global site tag (gtag.js) - Google Analytics