正式会员享受无限制浏览网站功能和高速网盘下载,赶快加入本站吧!
您需要 登录 才可以下载或查看,没有账号?立即注册
x
今天注册2个C#dll, 始终注册不成功。手工执行写好的cmd, 是成功的.
经过实验验证,是由于在带空格的路径中执行引起的.
解决方法有2种:
1. 使用函数转换成短路径名, LongPathToShortPath(STRING).
2. 在appAndwait的参数用""围起来.
注册控件时也发现这一问题,如果不采用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;
复制代码 |