首先我得承认我对于Win32编程还是门外汉,而且更加离谱的是对于NSIS我也是新手,所以碰到一些常规的问题也没办法,证明过程如下。
在我学习NSIS打包过程中,根据需要,需要打包我的.NET Winform程序,而这个程序中涉及到了一个vb控件,而这个控件又不是能够独立运行的,需要一些系统的dll或ocx支持,为了做成一个一体化安装包(.NET Winform程序 + VB控件 + 控件所依赖的系统dll或ocx + .NET Framework(V2.0)),我将软件VB控件提供商的控件安装包给分解了,提取出里面的dll文件。
提取安装包文件工具使用的是Universal Extractor,这里是这个工具的详细信息。
Universal Extractor is a program do to exactly what it says: extract files from any type of archive, whether it's a simple zip file, an installation program, or even a Windows Installer (.msi) package. This is still a work in progress (see details below), but so far it's proven quite useful and I feel others can also benefit from it.
对于Win32 dll原理不熟悉的我,这时候犯了一个很大的错误,错误的认为每个Dll文件都需要注册,于是出现了在安装包执行过程中的Could not find symbol:DllRegisterServer问题。
后来在
晚上
网上搜索解决之道,使用Visual Studio中的Dependence Walker查看dll依赖以及dll中的函数。发现了只有dll文件中有DllRegisterServer和DllUnregisterServer的需要在NSIS脚本中RegDLL和UnRegDLL。比如如下图中所示:
apigid32.dll文件的函数中就没有DllRegisterServer和DllUnregisterServer。
而Winsock控件则有这两个函数,因此有RegDLL和UnRegDLL入口。
将所以需要打包的dll全部检查一遍后,更改NSIS脚本,最后成功安装,“Could not find symbol:DllRegisterServer”的问题终于得到解决。
如需转载,请注明原文出处!