环境:win7 32 日文操作系统,InstallShield2014JapaneseProfessionalComp
今天注册2个C#dll, 始终注册不成功。手工执行写好的cmd, 是成功的.
经过实验验证,是由于在带空格的路径中执行引起的.
解决方法有2种:
1. 使用函数转换成短路径名, LongPathToShortPath(STRING).
2. 在appAndwait的参数用""围起来.
稍后整理.
<2010_1227>
注册控件时也发现这一问题,如果不采用LongPathToShortPath(), 调用Regsvr32.exe 不带 /s 参数时, 可以看到路径名称 ' '被截断,
if(LaunchApplication() < 0)这句根本没用, 不能用来判断是否注册成功了. 看来还要调用自己写的注册控件的Dll.
#define REGSVR32_EXE WINSYSDIR^"regsvr32.exe"
export prototype HandInstall_Ocx();
function HandInstall_Ocx()
STRING strProg;
STRING strPathName;
STRING strCmd1;
begin
//手动注册MyTest.ocx, 最终要执行的命令是
//c:/windows/system32/regsvr32.exe -s "x:/program files/xxSoft/bin/MyTest.ocx"
SdShowMsg("正在注册MyTest.ocx...",TRUE);
strProg = REGSVR32_EXE;
strPathName = TARGETDIR^"bin//MyTest.ocx";
//LongPathToShortPath只能用来转换纯全路径名称, 如果加了参数, 转换就不成功
LongPathToShortPath(strPathName);//转8.3文件名格式, DOS格式的长路径名称,
//把路径用/"前后围起来, 前面用了LongPathToShortPath, 这里其实不需要了
strCmd1 = "-s /"" + strPathName + "/"";
//MessageBox(strCmd1,INFORMATION);
if(LaunchApplication (strProg, strCmd1, "", SW_HIDE, INFINITE, LAAW_OPTION_WAIT)<0)then
//实验证明, 无论成功,失败, 都不会进入到这里.
//这里是死代码了.
MessageBox("MyTest.ocx 控件注册失败!", SEVERE);
abort;
endif;
SdShowMsg("正在注册MyTest.ocx...",FALSE);
end;
转自:http://blog.csdn.net/lostspeed/article/details/6053814
参考:http://blog.sina.com.cn/s/blog_71dc20e80100m1of.html
PS:本人其实是创建一个快捷方式,但是看到这篇文章的LongPathToShortPath搞定了
创建快捷方式代码:
szItemName = "画面表示";
szCommandLine = "D:\test2014 abc\appl\a.exe";
szWorkingDir = "";
szIconPath = "";
nIcon = 0;
szShortCutKey = "";
nFlag = REPLACE;
LongPathToShortPath(szCommandLine);
szProgramFolder = FOLDER_DESKTOP;
AddFolderIcon (szProgramFolder, szItemName, szCommandLine, szWorkingDir, szIconPath, nIcon, szShortCutKey, nFlag);