请教 WriteProfileBinary 失败的问题?

tangtangbaobao 2009-12-12 05:12:18
在win7下调用WriteProfileBinary,
每次都是提示 “Access Is Denied”
如果 “作为administrator运行” 就可以成功。

请问如何解决?

CWinApp* pApp = ::AfxGetApp();

WINDOWPLACEMENT m_wp;
if (!GetWindowPlacement( (WINDOWPLACEMENT *)&m_wp))
return;
AfxMessageBox(_T("Position"));
if (!pApp->WriteProfileBinary(_T("Position"), _T("{D98D72A9-D143-4847-BEC2-8E1FEEE1F6AC}"), (LPBYTE)&m_wp, sizeof(m_wp)))
{
LPVOID lpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR) &lpMsgBuf,
0,
NULL
);

::MessageBox( NULL, (LPCTSTR)lpMsgBuf, _T("Error"), MB_OK | MB_ICONINFORMATION );
LocalFree( lpMsgBuf );

return;
}
...全文
100 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
tangtangbaobao 2009-12-13
  • 打赏
  • 举报
回复
非常感谢 Tr0j4n。

我用的是VS2008,
出现问题的工程是从一个VC6工程转过来的,
没有毛病的是直接用VS2008创建的。

按照你的方法
我把工程 enable UAC 关了以后就解决了。
MoXiaoRab 2009-12-12
  • 打赏
  • 举报
回复
工程设置问题吧

你是不是用的VC2005?一个工程是从VC6的项目升级过来的,所以没有权限?有权限的是自己创建的?

VS2005,2008工程需要使用Manifest文件,记录“工程依赖项”。所以必须要生成Manifest文件。

设置:Project propert\ linker\ Manifest\ 生成清单:是。

Project propert\ linker\ Manifest Tool\ 嵌入清单:是。

(VC6.0 没有嵌入清单的功能。需要我们自己写出Manifest放入工程,然后编入工程资源中或者放入应用程序层。但是VS2005,2008有自动生成及嵌入清单的功能)

Manifest 文件还有一些功能: 1.设定程序运行用户权限; 2. 支持Microsoft.Windows.Common-Controls.

1. 设定程序运行用户权限: 设置Project propert\ linker\ Manifest\ 启用用户帐户控制(UAC):是;

UAC 执行极别:asInvoker (默认值);

UAC 绕过UI保护:否;

//////////////////////////////////////////////////////////////////////////////////////////////////////////////

2.支持Microsoft.Windows.Common-Controls.

分几种情况: 如果用VS2008 则在生成工程向导中,在“高级功能设定中”,勾选“公共控件清单”项。然后编译工程时按照上述方式选择“生成清单”。 清单自动生成并包含支持Microsoft.Windows.Common-Controls.

如果创建工程时,没有设置此选项,我们可以后期在Project propert\ linker\ Manifest\ 附加清单依赖项:

添 加type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='X86' publicKeyToken='6595b64144ccf1df' language='*'

从VC6.0升级到VS2008的工程。因为VC6.0的Manifest文件是外部的。 VS2008默认是自动生成嵌入式Manifest.所以两个会发生冲突:

error : CVTRES : fatal error CVT1100: duplicate resource. type:MANIFEST, name:2, language:0x0409

LINK : fatal error LNK1123: failure during conversion to COFF: file invalid or corrupt

(推荐解决方案3)

解决方案:1. Project propert\ linker\ 启用增量链接:否;(关闭增量链接)

2. 设置工程属性->配置属性-> 清单工具->输入和输出->嵌入清单,选择[否]

3. 在工程的.rc文件里面删除了manifest块. 删除VC6.0外部Manifest文件。设置生成嵌入式清单,并在附加清单依赖项: Microsoft.Windows.Common-Controls。

( 有什么时候删除VC6.0外部Manifest文件后,编译会出现问题: 嵌入清单:否;编译。。

删除manifest块和VC6.0外部Manifest文件。编译。

嵌入清单:是; 编译。

这个方法或许可以解决 “删除VC6.0外部Manifest文件问题”。不肯定,请多试。


tangtangbaobao 2009-12-12
  • 打赏
  • 举报
回复
如果是权限不够的原因,
为什么在另一个工程里,
不需要run as administrator就可以成功,
希望大侠能告诉我为什么?
MoXiaoRab 2009-12-12
  • 打赏
  • 举报
回复
嵌入manifest,Google下
tangtangbaobao 2009-12-12
  • 打赏
  • 举报
回复
更奇怪的是,
我的这段代码在另一个工程里一点问题都没有,
不需要run as administrator就可以成功
tangtangbaobao 2009-12-12
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 tr0j4n 的回复:]
嵌入manifest文件再试试看
[/Quote]
能不能再说得具体一点?

MoXiaoRab 2009-12-12
  • 打赏
  • 举报
回复
嵌入manifest文件再试试看
zoulie 2009-12-12
  • 打赏
  • 举报
回复
WIN7写系统注册表要有权限的

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧