在vista下创建快捷方式的问题!解决了在给100分。

etre 2008-12-13 03:20:52
我做了一个自己的安装程序,不是用installshield 和 windows installer.中间有段程序是用来为程序创建快捷方式的。这段代码如下:
HRESULT hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (PVOID *) &psl);
if (SUCCEEDED(hres))
{
IPersistFile* ppf;

// Set the path to the shortcut target and add the description.
psl->SetPath(ExePath);
psl->SetWorkingDirectory(WorkingDirectory);
psl->SetArguments(Arguments);
psl->SetIconLocation(iconPath,0);
// Query IShellLink for the IPersistFile interface for saving the
// shortcut in persistent storage.
hres = psl->QueryInterface(IID_IPersistFile, (PVOID *) &ppf);
if (SUCCEEDED(hres))
{
WCHAR wszTemp[MAX_PATH];
MultiByteToWideChar(CP_ACP, 0, PathLink, -1, wszTemp, MAX_PATH);
// Save the link by calling IPersistFile::Save.
hres = ppf->Save(wszTemp, TRUE);
ppf->Release();
}
psl->Release();
}

这段代码在xp,2000上执行是完全没有问题的,由于我想执行的安装是每个用户有一份安装程序,也就是说我想把快捷方式创建到这个目录下:

C:\Users\ <user name>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\ <companyName>

但是运行结果却是创建到了目录下:

C:\ProgramData\Microsoft\Windows\Start Menu\Programs\CCI

也就是说我本来想执行per-user installation,但是vista自动地执行了all-user installation.

其中wszTemp得到的值还是正确的C:\Users\ <user name>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\ <companyName>

但是一经过hres = ppf->Save(wszTemp, TRUE),就被创建到了C:\ProgramData\Microsoft\Windows\Start Menu\Programs\CCI目录下,希望高手指教。

但我用同样的程序创建桌面快捷方式又是正确的。在C:\Users\ <user name>\AppData\Roaming\Microsoft\Windows\目录下
...全文
202 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
yu3000 2008-12-15
  • 打赏
  • 举报
回复
所有相关的可执行程序的名字都不能有install,update的关键字样,包括对这个可执行程序的描述里也不能有这些字样(描述可以从右键菜单的属性中看到)。
etre 2008-12-13
  • 打赏
  • 举报
回复
我是以当前用户在执行的,当前用户加入管理中群组中,UAC是打开的。

我是当前用户创建的,应该创建在
C:\Users\ <user name>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\ <companyName>
目录下啊。

但是运行结果却是创建到了目录下:

C:\ProgramData\Microsoft\Windows\Start Menu\Programs\CCI
的公共上当下

也就是说我本来想执行per-user installation,但是vista自动地执行了all-user installation.

其中wszTemp得到的值还是正确的C:\Users\ <user name>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\ <companyName>

但是一经过hres = ppf->Save(wszTemp, TRUE),就被创建到了C:\ProgramData\Microsoft\Windows\Start Menu\Programs\CCI目录下,希望高手指教。

但我用同样的程序创建桌面快捷方式又是正确的。在C:\Users\ <user
name>\AppData\Roaming\Microsoft\Windows\目录下
而非在
C:\ProgramData\Microsoft\Microsoft\Windows\目录下。

如果是权限问题为什么桌面快捷快捷又成功创建在C:\Users\ <user
name>\AppData\Roaming\Microsoft\Windows\下了呢?


现在我自己通过分析.lnk文件的格式,直接在C:\Users\ <user name>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\ <companyName>目录下写lnk文件已成功了,但就是通过windows的com组件方法不成功。
wsyangli21 2008-12-13
  • 打赏
  • 举报
回复
我想知道,我的MP3系统被我删了 怎么才能修复好啊 谢谢 指点下好吗 我的QQ447074366 帮下忙 大哥哥们

oyljerry 2008-12-13
  • 打赏
  • 举报
回复
是否是当前user执行,以当前admin启动程序,Run as administrator
ilovedrv 2008-12-13
  • 打赏
  • 举报
回复
VC编译出来的应用程序在vista下运行,有可能因为权限问题,不能成功运行。

用以下办法,给应用程序添加一个manifest文件,程序运行时系统就会跳出UAC对话框,获得管理权限。

1.打开应用程序的源代码工程

2.添加一个“custom”资源,"resource type"填24,把资源ID改为1,然后把以下内容复制到资源内容中保存

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
version="1.0.0.0"
processorArchitecture="X86"
name="mulitray.exe.manifest"
type="win32"
/>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>

3.重新编译应用程序,此时会发现,广用程序的图标在vista下会多出一个小盾标志, 就是System令牌
sys0007 2008-12-13
  • 打赏
  • 举报
回复
应该是权限的问题,试试用管理员权限启动看创建成功不。

可以通过在EXE添加manifest来让程序其他弹出UAC框以管理员权限启动

3,248

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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