关于InstallShield打包的问题

mengqimxz 2004-11-24 12:29:00
我现在给自己的程序打包后,我在脚本文件中创建了快捷方式,现在我安装我自己的程序后如果直接用在桌面上的快捷方式就提示说没有找到数据库,但我要是从安装那里把应用程序发送到桌面快捷方式就一点问题也没有啊

看看自己建立的快捷方式和发送过来的快捷方式的属性有一点区别
就是前者起始位置是空的,而后者不是
有没有谁遇到过这样的问题,帮我看看我是哪里错了
我的添加快捷方式的脚本文件如下
function SetupFolders()
NUMBER nResult;
STRING svPath;
begin
svPath = TARGETDIR ^ "UsbADC.exe"; // 应用程序的路径全名
LongPathToQuote ( svPath , TRUE ); // 使用长路径名
// 创建程序菜单
AddFolderIcon ( "" , " 我的文档" , "" , svPath , "" , 0 , "" , REPLACE );
// 创建桌面图标
AddFolderIcon ( FOLDER_DESKTOP , "我的文档" , svPath ,"" , "" , 0 , "" , REPLACE );
file://nResult = CreateShellObjects( "" ); // 创建Shell对象
return 0; //file://nResult;
end;

那位大虾知道AddFolderIcon()函数的各参数代表的含义
...全文
409 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
星辰游侠 2005-03-05
  • 打赏
  • 举报
回复
installshield
民间导尿管 2004-11-24
  • 打赏
  • 举报
回复
这是绝对路径和相对路径的区别,
AddFolderIcon函数用法去察看文挡,创建桌面图标有多个方法,另选一中试试
老夏Max 2004-11-24
  • 打赏
  • 举报
回复
AddFolderIcon
语法:AddFolderIcon (szProgramFolder, szItemName, szCommandLine, szWorkingDir,
szIconPath, nIcon, szShortCutKey, nFlag);
说明:AddFolderIcon函数插入或置换由szProgramFolder指定的程序文件夹中的一个图标。如果程序文件夹不存在,AddFolderIcon创建它。SzProgramFolder可以在一个多级级联式菜单中指定一个子文件夹。如果子文件夹不存在,AddFolderIcon将创建该子文件夹,并且在必要时创建它的父文件夹。
当添加图标到Windows NT下的组时,首先调用ProgDefGroupType来确定组为公用还是专用。缺省时,文件夹图标添加为公用。
参数:
szProgramFolder
指定将图标添加至的文件夹的名称。如果该文件夹不存在,InstallShield创建它。
为添加图标到具体的文件夹,指定全限定路径,如:
"C:\\WINDOWS\\STARTMENU\\PROGRAMS\\ACCESSORIES\\GAMES".
为添加一个快捷方式图标到Windows 95及更高版本的开始程序菜单,给该参数传递一个空字符串(“”)。
注意你也可以在该参数位置传递下列InstallShield系统变量之一:
FOLDER_DESKTOP:将图标添加到桌面文件夹。
FOLDER_STARTUP:将图标添加到启动菜单文件夹。
FOLDER_STARTMENU:将图标添加到开始菜单文件夹。
FOLDER_PROGRAMS:将图标添加到开始菜单\程序文件夹。
你也可以指定一个相对于一个由InstallShield系统变量标识的文件夹的路径,例如,
FOLDER_PROGRAMS ^ "ACCESSORIES\\GAMES"
指定要添加到文件夹的图标名。该名将显示在图标下面。在Windows 95及更高版本下,调用AddFolderIcon添加一个图标到一个程序文件夹时,也在由szCommandLine指定的链接目录中创建一个链接文件。注意开发人员外壳不允许在项目名中有下列字符:/, \, :, ?, <, >, 或 |。
szCommandLine
指定下列情况之一:
s 和图标相联系的可执行文件的全限定名,包括任何命令行参数。为添加一个快捷方式图标到Windows 95及更高版本的开始程序菜单,输入一个链接目录的全限定路径,在那儿你的应用程序存放了它的图标链接文件。
s 全限定路径,如果szItemName是一个子文件夹 。(仅对Windows 95及更高版本、Windows NT 4.0)。
如果命令行包含一个长文件名,它必须由引号包围(括起)。更多信息请查看下面的注解部分。
szWorkingDir
指定应用程序文件所在的目录。(如果szItemName是一个子文件夹则不适用)。为使得包含程序文件的目录为工作目录,给该参数传递一个空字符串(“”)。不要调用LongPathToQuote来把该路径包围(括)在引号中。更多信息请查看下面的注解部分。
szIconPath
定要显示的图标的全限定文件名。(如果szItemName是一个子文件夹则不适用)。不要调用LongPathToQuote来把该路径包围(括)在引号中。更多信息请查看下面的注解部分。
nIcon
指定Windows中由szIconPath指定的可执行文件的的图标序号。(如果szItemName是一个子文件夹则不适用)。图标序号数从0开始,因此为显示可执行文件的第一个图标,指定0;为显示第二个,指定1,如此继续。如果你不使用一个Windows图标,给该参数指定0。
szShortCutKey
指定快捷键(以字符串形式),允许最终用户迅速启动应用程序。例如,如果你想要能通过按下”Ctrl”,”Alt”然后”1”键来打开应用程序,则给该参数传递”Ctrl+Alt+1”。 如果szItemName是一个子文件夹则不适用)。
nFlag
指定图标表现形式。在该参数位置传递下列预定义常量之一或多个。为给该参数传递两个或更多预定义常量,用按位或操作符(|)将那些常量进行组合:
REPLACE:表明文件夹中的当前图标或项目被置换。
RUN_MAXIMIZED:表明程序被装入时必须被最大化。
RUN_MINIMIZED:表明程序被装入时必须被最小化。
NULL:表明没有选项。
返回值:
0:表明函数成功添加或置换指定文件夹中的图标并使可执行文件和图标相关联。
< 0:表明函数没有能添加或置换指定文件夹中的图标并使可执行文件和图标相关联。
注解:
·如果到你的应用程序可执行文件的路径包含长路径名,你必须把该全限定文件名用单引号或双引号括起来。(如果文件名已经被赋给一个变量,传递该变量给LongPathToQuote来插入引号。)注意命令行参数必须不被引号包围。因此,建议从两个分隔的字符串来建立一个szCommandLine字符串。
·不要调用LongPathToQuote来得到作为参数szWorkingDir 和 szIconPath的表达式。InstallShield自动将这些路径括在引号中。
changlele 2004-11-24
  • 打赏
  • 举报
回复
快捷方式添加方法

需要的代码如下:

////////////////////////////////////////////////////////
////////// shortcuts ////////////
///////////////////////////////////////////////////////
function SetupFolders()
string szProgram, szParam;
number nResult;
begin

InstallProgramItems:
nResult = CreateShellObjects ("");
// ShowProgramFolder( SHELL_OBJECT_FOLDER, SW_SHOW );

Delay (2);

return nResult;
end;


/////////////////////////////////////////////////////
//////// Install Finish //////////
/////////////////////////////////////////////////////
function OnFirstUIAfter()
STRING szTitle,szMsg1, szMsg2, szOption1, szOption2;
NUMBER bOpt1, bOpt2;
NUMBER nResult;
begin
Disable(STATUSEX);
bOpt1 = FALSE;
bOpt2 = FALSE;
szMsg1 = SdLoadString(IFX_SDFINISH_MSG1);
szMsg2 = "";
szOption1 = "";
szOption2 = "";
szTitle = "";
SetupFolders();
SdFinishReboot ( szTitle , szMsg1 , SYS_BOOTMACHINE , szMsg2 , 0 );

return 0;

end;

别忘了还有声明部分,加载在教本的最上面
prototype SetupFolders();
oyljerry 2004-11-24
  • 打赏
  • 举报
回复
至于如何做 Uninstall 快捷方式,需要区分一下 IS 版本。
我用的是 InstallShield Developer 8.02,与 Professional 有些微的不同,建议不要用后者,毛病比较多。

Developer版本创建快捷方式的时候无法填入一个string,所以Uninstall 的快捷方式要在脚本中做。
选中 InstallScript,在 OnFirstUIAfter 事件(即安装完成)加入代码

szFilename = UNINSTALL_STRING;
nResult = StrFind(szFilename,".exe");
if ( ( StrFind(szFilename,"\"") < 0 ) && ( nResult >= 0 ) ) then
StrSub(szMsg1,szFilename,0,nResult + 4);
StrSub(szMsg2,szFilename,nResult + 4,200);
szFilename = "\"" + szMsg1 + "\"" +szMsg2;
UNINSTALL_STRING = szFilename;
endif;

AddFolderIcon("我的程序组", "卸载xxx软件", szFilename,
INSTALLDIR, WINDIR ^ "System32\\msiexec.exe", 0, "",NULL);

在 UNINSTALL_STRING 这个 IS 的系统全局常量里面保存了对当前这个安装程序的卸载参数,但 8.02 还有点儿毛病,""的使用不正确导致无法正确使用。所以在用 AddFolderIcon 方法创建快捷方式之前,我先处理了一下 UNINSTALL_STRING,在参数前面对文件路径加入了""。
随后用 AddFolderIcon 在“我的程序组”下创建了一个叫做“卸载xxx软件”的快捷方式,工作路径是INSTALLDIR(无所谓咯),图标文件是系统目录下的 "System32\\msiexec.exe" 的第一个图标——你可以用你自己的。

OK啦,只是要注意一个问题:程序组创建给当前用户还是所有人?
如果你的安装流程中有询问用户安装给个人还是所有人,那么 AddFolderIcon 会自动根据其设置的参数选择。否则,你可以用这样的代码来修正一下这个问题:

if (Is (USER_ADMINISTRATOR, szIsData) = TRUE) then
ProgDefGroupType (COMMON);
else
ProgDefGroupType (PERSONAL);
endif;
ProgDefGroupType (COMMON)就是告诉相关的函数操作的时候将针对所有人。但如果没有系统管理员权限(比如windows2000/xp),是无法对COMMON环境进行操作的,因此我加了一个判断限制一下。

这样程序就很完整了:

if (Is (USER_ADMINISTRATOR, szIsData) = TRUE) then
ProgDefGroupType (COMMON);
else
ProgDefGroupType (PERSONAL);
endif;

szFilename = UNINSTALL_STRING;
nResult = StrFind(szFilename,".exe");
if ( ( StrFind(szFilename,"\"") < 0 ) && ( nResult >= 0 ) ) then
StrSub(szMsg1,szFilename,0,nResult + 4);
StrSub(szMsg2,szFilename,nResult + 4,200);
szFilename = "\"" + szMsg1 + "\"" +szMsg2;
UNINSTALL_STRING = szFilename;
endif;

AddFolderIcon("我的程序组", "卸载xxx软件", szFilename,
INSTALLDIR, WINDIR ^ "System32\\msiexec.exe", 0, "",NULL);
mengqimxz 2004-11-24
  • 打赏
  • 举报
回复
谢谢楼上的几位阿,changlele(梦幻水晶)我也是你的方法了,可是还是不行,问题还是没有解决
changlele 2004-11-24
  • 打赏
  • 举报
回复
我以前就是这样做才明白StartIn得作用的
changlele 2004-11-24
  • 打赏
  • 举报
回复
你可以做一个测试,这样测试
编个程序让它生成一个文件

做两个安装包。
1 把StartIn设置成为<TARGETDIR>
获得得结果是,文件是在安装得目录下

2不设置StartIn
获得得结果是,文件是在桌面上
changlele 2004-11-24
  • 打赏
  • 举报
回复
原因很简单
快捷方式上有个StartIn这个选项,选项中加入下面东西即可解决问题
StartIn <TARGETDIR>
因为你调用得数据库文件是在<TARGETDIR>中,如果这个不指定得话
就默认成为桌面了。

16,548

社区成员

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

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

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