今天注册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;