• .Net 2.0 Winform部署和安装


    在.Net Framework 1.1下,如果采用Visual .Net 2003的打包程序,我们可以下载.Net 2003安装引导程序来帮助我们把.Net Framework和MDAC之类的打包进去。目前我没有找到.Net 2005的引导程序,很郁闷。采用.Net 2005做安装盘,最郁闷的地方在于,如果没有安装.Net Framework2.0,系统提醒安装,安装后,还需要再叫用户重新点安装程序进行安装。Boss说,必须傻瓜化地安装,不能叫用户点两次。更郁闷的是,程序用了MDAC2.8,在XP SP2后版本,会出现“严重错误”对话框,虽然不影响使用,但给用户体验很不好。怎么办?我只好用unmanaged的VC做了个检测程序(注册表检测)和运行需要的组件。这个程序没有考虑做成通用的,检测了.Net Framework2.0和MDAC 2.8,如果你觉得有用,你可以做成从配置文件里读取需要部署的组件,并自动运行部署。欢迎转载,但不允许删除如下网址:http://www.hzpal.com http://www.glassoo.com

    代码如下:
    // WCXSetup.cpp : Defines the entry point for the console application.
    //

    #include 
    "stdafx.h"
    #include 
    "WCXSetup.h"

    #ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif

    /////////////////////////////////////////////////////////////////////////////
    // The one and only application object

    CWinApp theApp;

    using namespace std;

    int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
    {
        printf(
    "警告:此窗口严禁手工关闭!如果您不小心关闭,请重新点安装程序!");
        
    int nRetCode = 0;
        
        
    if( NeedDotnetFramework() )
        
    {
            ::StartExe(
    "DOTNETFX.EXE");
        }


        
    if( NeedMDAC() )
        
    {
            ::StartExe( 
    "MDAC_TYP.EXE" );        
        }




        
    return nRetCode;
    }


    void StartExe(const char* path)
    {
        SHELLEXECUTEINFO ShExecInfo 
    = {0};
        ShExecInfo.cbSize 
    = sizeof(SHELLEXECUTEINFO);
        ShExecInfo.fMask 
    = SEE_MASK_NOCLOSEPROCESS;
        ShExecInfo.hwnd 
    = NULL;
        ShExecInfo.lpVerb 
    = NULL;
        ShExecInfo.lpFile 
    = path;        
        ShExecInfo.lpParameters 
    = "";    
        ShExecInfo.lpDirectory 
    = NULL;
        ShExecInfo.nShow 
    = SW_SHOW;
        ShExecInfo.hInstApp 
    = NULL;    
        ShellExecuteEx(
    &ShExecInfo);
        WaitForSingleObject(ShExecInfo.hProcess,INFINITE);
    }


    bool NeedMDAC()
    {
        HKEY hKey, hSub1key, hSub2key, hSub3key;     
        
    if (RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE"&hKey) == ERROR_SUCCESS) 
        
    {            
            
    if (RegOpenKey(hKey, "Classes"&hSub1key) == ERROR_SUCCESS) 
            
    {                
                
    if (RegOpenKey(hSub1key, "MDACVer.Version"&hSub2key) == ERROR_SUCCESS) 
                
    {                    
                    
    if (RegOpenKey(hSub2key, "CurVer"&hSub3key) == ERROR_SUCCESS) 
                    
    {                
                        
    char *szData;
                        DWORD dwType, dwLen;
                        szData 
    = new char[101];
                        dwLen 
    = 100;
                        
                        
    if ( ::RegQueryValueEx(hSub3key, "", NULL, &dwType, (unsigned char *)szData, &dwLen ) == ERROR_SUCCESS )
                        
    {    
                            ::RegCloseKey( hSub3key );
                            
    if( strcmp( szData, "MDACVer.Version.2.8" ) > 0 )
                            
    {                            
                                
    return false;
                            }

                        }

                        
    else
                        
    {
                            ::RegCloseKey( hSub3key );
                        }

                    }

                    ::RegCloseKey( hSub2key );                            
                }

                ::RegCloseKey( hSub1key );                            
            }

            ::RegCloseKey( hKey );
        }

        
    return true;
    }


    bool NeedDotnetFramework()
    {
        HKEY hKey, hSub1key, hSub2key, hSub3key,hSub4key;     
        
    if (RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE"&hKey) == ERROR_SUCCESS) 
        
    {            
            
    if (RegOpenKey(hKey, "Microsoft"&hSub1key) == ERROR_SUCCESS) 
            
    {                
                
    if (RegOpenKey(hSub1key, ".NETFramework"&hSub2key) == ERROR_SUCCESS) 
                
    {                    
                    
    if (RegOpenKey(hSub2key, "policy"&hSub3key) == ERROR_SUCCESS) 
                    
    {
                        
    if (RegOpenKey(hSub3key, "v2.0"&hSub4key) == ERROR_SUCCESS) 
                        
    {
                            ::RegCloseKey( hSub4key );
                            ::RegCloseKey( hSub3key );
                            
    return false;
                        }

                        
    else
                        
    {
                            ::RegCloseKey( hSub3key );
                        }

                    }

                    ::RegCloseKey( hSub2key );                            
                }

                ::RegCloseKey( hSub1key );
            }

            ::RegCloseKey( hKey );
        }

        
    return true;
    }


    我不知道这个是不是最好的办法,请大家指点!听说Wise For .Net Installer 5.1版本支持.Net 程序的发布,不过没米:(
    欢迎转载,但不允许删除如下网址:http://www.hzpal.com http://www.glassoo.com
  • 相关阅读:
    terminal下历史命令自动完成功能history auto complete
    Shell中while循环的done 后接一个重定向<
    python 链接hive
    shell 学习基地
    c++ 获取本地ip地址
    c++ 如何实现,readonly
    c++ 语法
    c++ 信号量
    vim插件介绍
    c++ memset 函数 及 坑
  • 原文地址:https://www.cnblogs.com/bookwormzju/p/538785.html
Copyright © 2020-2023  润新知