杉宫竹苑工作室

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1943|回复: 0

在 InstallShield 中执行带空格路径的 exe

[复制链接]
发表于 2017-3-1 18:35:47 | 显示全部楼层 |阅读模式

正式会员享受无限制浏览网站功能和高速网盘下载,赶快加入本站吧!

您需要 登录 才可以下载或查看,没有账号?立即注册

x
今天注册2个C#dll, 始终注册不成功。手工执行写好的cmd, 是成功的.
经过实验验证,是由于在带空格的路径中执行引起的.

解决方法有2种:
1. 使用函数转换成短路径名, LongPathToShortPath(STRING).
2. 在appAndwait的参数用""围起来.

注册控件时也发现这一问题,如果不采用LongPathToShortPath(), 调用Regsvr32.exe 不带 /s 参数时,  可以看到路径名称 ' '被截断,
if(LaunchApplication() < 0)这句根本没用, 不能用来判断是否注册成功了. 看来还要调用自己写的注册控件的Dll.
  1. #define REGSVR32_EXE WINSYSDIR^"regsvr32.exe"  
  2. export prototype HandInstall_Ocx();  
  3. function HandInstall_Ocx()  
  4. STRING strProg;  
  5. STRING strPathName;  
  6. STRING strCmd1;  
  7. begin  
  8.     //手动注册MyTest.ocx, 最终要执行的命令是   
  9.     //c:/windows/system32/regsvr32.exe -s "x:/program files/xxSoft/bin/MyTest.ocx"  
  10.     SdShowMsg("正在注册MyTest.ocx...",TRUE);                                         
  11.     strProg = REGSVR32_EXE;     
  12.     strPathName = TARGETDIR^"bin//MyTest.ocx";  
  13.     //LongPathToShortPath只能用来转换纯全路径名称, 如果加了参数, 转换就不成功  
  14.     LongPathToShortPath(strPathName);//转8.3文件名格式, DOS格式的长路径名称,   
  15.       
  16.     //把路径用/"前后围起来, 前面用了LongPathToShortPath, 这里其实不需要了  
  17.     strCmd1 = "-s /"" + strPathName + "/"";  
  18.     //MessageBox(strCmd1,INFORMATION);  
  19.     if(LaunchApplication (strProg, strCmd1, "", SW_HIDE, INFINITE, LAAW_OPTION_WAIT)<0)then  
  20.         //实验证明, 无论成功,失败, 都不会进入到这里.  
  21.         //这里是死代码了.  
  22.         MessageBox("MyTest.ocx 控件注册失败!", SEVERE);   
  23.         abort;  
  24.     endif;                                                
  25.     SdShowMsg("正在注册MyTest.ocx...",FALSE);  
  26. end;  
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SgzyStudio

GMT+8, 2024-5-19 20:00 , Processed in 0.102867 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表