東坡下載:內(nèi)容最豐富最安全的下載站!

幫助|文件類型庫(kù)|最新更新|下載分類|排行榜

編程相關(guān)破解相關(guān)編程工具反編譯安裝制作程序源碼軟件補(bǔ)丁數(shù)據(jù)庫(kù)Visual Studiovc++visualbasicdreamweaver

首頁(yè)編程開發(fā)編程相關(guān) → DotNet4應(yīng)用程序打包工具 3.5.4 升級(jí)版【附源碼+分析】

DotNet4應(yīng)用程序打包工具

DotNet4應(yīng)用程序打包工具3.5.4 升級(jí)版【附源碼+分析】

  • 大。38KB
  • 語(yǔ)言:中文
  • 平臺(tái):WinXP, win7, WinAll
  • 更新:2017-09-27 08:32
  • 等級(jí):
  • 類型:編程相關(guān)
  • 網(wǎng)站:暫無(wú)
  • 授權(quán):免費(fèi)軟件
  • 廠商:
  • 產(chǎn)地:國(guó)產(chǎn)軟件
好用好玩 50%(0)
坑爹 坑爹 50%(0)
軟件介紹軟件截圖相關(guān)軟件軟件教程網(wǎng)友評(píng)論下載地址

相關(guān)推薦: DotNet4打包工具 DotNet4

    DotNet4應(yīng)用程序打包工具可以打包dotNet2.0  3.5  4乃至所有在注冊(cè)表中添加過注冊(cè)表項(xiàng)的應(yīng)用程序。

    DotNet4應(yīng)用程序打包工具源碼分析

    入口函數(shù):

    int WinMain(HINSTANCE hInstance,HINSTANCE hPreInstance,LPSTR lpCmdLine,int nCmdShow)
    {
    DialogBox(hInstance,MAKEINTRESOURCE(MainWinDL),0,DlgProc);
    return 0;
    }

    好吧,入口函數(shù)很簡(jiǎn)單,只是創(chuàng)建了一個(gè)窗體,并注冊(cè)了窗口過程函數(shù)

    -----------------------------

    窗口過程

    //窗口過程
    BOOL CALLBACK DlgProc (HWND hDlg, UINT message,WPARAM wParam, LPARAM lParam)
    {
       switch (message)
       {
    case WM_INITDIALOG :
    OnInitDlg(hDlg);
    return TRUE ;
    case WM_COMMAND :
    switch (LOWORD(wParam))
    {
    case IDC_STATIC_Name:
    ShellExecute(hDlg,"open","http://www.cnblogs.com/liulun",NULL,NULL,SW_SHOWNORMAL);
    break;
    case IDC_BUTTON1:
    GetFile(hDlg,IDC_EDIT1);
    break;
    case IDC_BUTTON3:
    GetFile(hDlg,IDC_EDIT3);
    break;
    case IDC_RADIO1:
    CheckRadio(hDlg,IDC_RADIO1,"SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v2.0.50727");
    break;
    case IDC_RADIO2:
    CheckRadio(hDlg,IDC_RADIO2,"SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v3.5");
    break;
    case IDC_RADIO3:
    CheckRadio(hDlg,IDC_RADIO3,"SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v4");
    break;
    case IDC_RADIO_ELSE:
    CheckRadio(hDlg,IDC_RADIO_ELSE,"");
    break;
    case IDOK:
    ReleaseTar(hDlg);
    ReplaceICO(hDlg);
    BagTar(hDlg,IDC_EDIT3);
    BagTar(hDlg,IDC_EDIT1);
    BagStr(hDlg);
    Alert("打包成功");
    break;
    case IDCANCEL:
    EndDialog (hDlg, 0) ;
    return TRUE ;
    }
    break;
       }
       return FALSE ;
    }

    在這個(gè)過程函數(shù)里

    接收到的每個(gè)消息都執(zhí)行了一個(gè)或幾個(gè)函數(shù)

    那么,我們就一個(gè)函數(shù)一個(gè)函數(shù)的講

    -------------------------------------------------------

    窗口初始化消息里

    我們默認(rèn)選中了dotNet4的單選按鈕

    void OnInitDlg(HWND hwnd)
    {
    HWND cld = ::GetDlgItem(hwnd,IDC_RADIO3);
    ::SendMessage(cld,BM_SETCHECK,1,0);
    ::SetDlgItemText(hwnd,IDC_EDIT2,"SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v4");
    LastCheckRdioId = IDC_RADIO3;
    }

    ---------------------------------------------------------

    四個(gè)單選按鈕的單擊事件

    設(shè)置了文本框的內(nèi)容,

    并記錄了當(dāng)前選中的是哪個(gè)單選按鈕

    void CheckRadio(HWND hwnd,int rdioID,LPCSTR val)
    {
    if(rdioID == LastCheckRdioId)
    {
    return;
    }
    ::SetDlgItemText(hwnd,IDC_EDIT2,val);
    LastCheckRdioId = rdioID;
    }

    ------------------------------------------------------------

    選擇文件

    把選中的文件路徑賦值給相應(yīng)的文本框

    //得到文件
    void GetFile(HWND hwnd,int EDITId)
    {
    char szFile[MAX_PATH] = {0};
    OPENFILENAME ofn;
    memset(&ofn, 0, sizeof(OPENFILENAME));  
    ofn.lStructSize = sizeof(OPENFILENAME);    
    ofn.lpstrFile = szFile;  
    ofn.nMaxFile = MAX_PATH;  
    ofn.lpstrFilter = "應(yīng)用程序 (.exe)\0*.exe\0\0";
    ofn.lpstrDefExt = "exe";  
    ofn.lpstrTitle = "選擇exe文件";
    ofn.nFilterIndex = 1;  
    ofn.lpstrFileTitle = NULL;  
    ofn.nMaxFileTitle = 0;  
    ofn.lpstrInitialDir = NULL;
    if(GetOpenFileName(&ofn))
    {
    SetDlgItemText(hwnd,EDITId,szFile);
    }
    }


    --------------------------------------------------------------------

    從資源中讀取宿主程序,并按指定的文件名,釋放到當(dāng)前目錄下

    //釋放資源
    int ReleaseTar(HWND hwnd)
    {
    ::GetDlgItemText(hwnd,IDC_EDIT1,szFilePath,MAX_PATH);
    ::strcat(szFilePath,".bag.exe");

    HMODULE hInstance = ::GetModuleHandle(NULL);
       HRSRC hResID = ::FindResource(hInstance,(LPCSTR)IDR_BIN1,"bin");
       HGLOBAL hRes = ::LoadResource(hInstance,hResID);
       LPVOID pRes = ::LockResource(hRes);
       DWORD dwResSize = ::SizeofResource(hInstance,hResID);
    if(!dwResSize)
    {
    return 0;
    }
       HANDLE hResFile = CreateFile(szFilePath,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);    
       DWORD dwWritten = 0;
       WriteFile(hResFile,pRes,dwResSize,&dwWritten,NULL);
       CloseHandle(hResFile);
       if(dwResSize == dwWritten);
    {
    return 1;
    }
    return 0;
    }

    ---------------------------------------------------------------------------

    替換宿主程序的ICO圖標(biāo)資源

    這里需要重點(diǎn)說明一下:

    要想更新一個(gè)應(yīng)用程序的資源

    必須先知道這個(gè)資源的ID

    GetIcoIndex函數(shù)的工作就是獲取資源ID的

    因?yàn)橐话愕膽?yīng)用程序圖標(biāo)資源都會(huì)有兩個(gè)

    所以獲取了兩個(gè)圖表資源的ID

    其他的WINAPI就不多解釋了~~

    int GetIcoIndex(HMODULE hExe,int index[])
    {
    HRSRC hRes;
    int iLoop;
    int i = 0;
    for(iLoop = 1;;iLoop++)
       {
           hRes = FindResource(hExe, MAKEINTRESOURCE(iLoop), RT_ICON);
    if (NULL == hRes)
    {
    if(iLoop == 60)
    {
    break;
    }
    continue ;
    }
           else
    {
    index[i]  = iLoop;
    i +=1;
    if(i == 2)
    {
    break;
    }
    }
       }
    return 1;
    }
    int ReplaceICO(HWND hwnd)
    {
    HMODULE hSrcExe,hDestExe;
    HANDLE hUpdateRes;
    HRSRC hRes;
    HRSRC hResLoad;
    char *lpResLock;
    int result;
    char szFile[MAX_PATH+1] = {0};
    int hSrcIndex[2] = {0};
    int hDestIndex[2] = {0};
    ::GetDlgItemText(hwnd,IDC_EDIT1,szFile,MAX_PATH);
    hSrcExe = LoadLibrary(szFile);
    hDestExe = LoadLibrary(szFilePath);
    GetIcoIndex(hSrcExe,hSrcIndex);
    GetIcoIndex(hDestExe,hDestIndex);
    for(int i=0;i<2;i++)
    {
    hRes = FindResource(hSrcExe, MAKEINTRESOURCE(hSrcIndex[i]), RT_ICON);
    hResLoad=(HRSRC)LoadResource(hSrcExe,hRes);
    lpResLock=(char*)LockResource(hResLoad);
    FreeLibrary(hDestExe);
    hUpdateRes=BeginUpdateResource(szFilePath,FALSE);
    result=UpdateResource(hUpdateRes,RT_ICON,MAKEINTRESOURCE(hDestIndex[i]),MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL),lpResLock,SizeofResource(hSrcExe,hRes));
    EndUpdateResource(hUpdateRes, FALSE);
    }
    FreeLibrary(hSrcExe);
    return result;
    }

    ---------------------------------------

    為宿主程序增加目標(biāo)程序資源和dotNet安裝包資源

    增加的資源也是需要標(biāo)明ID的

    因?yàn)樗拗鞒绦驎?huì)根據(jù)約定好的ID來得到這些資源

    EditId參數(shù)就是這些資源的ID

    int BagTar(HWND hwnd,int EditId)
    {
    HANDLE hFile;
    DWORD dwFileSize,dwBytesRead;
    LPBYTE lpBuffer;
    char szFile[MAX_PATH+1] = {0};
    ::GetDlgItemText(hwnd,EditId,szFile,MAX_PATH);
    hFile = CreateFile(szFile,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
    dwFileSize = GetFileSize(hFile, NULL);
    lpBuffer = new BYTE[dwFileSize];
    ReadFile(hFile, lpBuffer, dwFileSize, &dwBytesRead, NULL);
    HANDLE hResource = BeginUpdateResource(szFilePath, FALSE);
    UpdateResource(hResource,RT_RCDATA,MAKEINTRESOURCE(EditId),MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),(LPVOID)lpBuffer,dwFileSize);
    EndUpdateResource(hResource, FALSE);
    delete [] lpBuffer;
    CloseHandle(hFile);
    return 1;
    }

    --------------------------------------------------------

    把注冊(cè)表項(xiàng)的路徑也當(dāng)作資源打包進(jìn)宿主程序

    我們約定這個(gè)資源的ID為1039

    int BagStr(HWND hwnd)
    {
    char szFile[MAX_PATH+1] = {0};
    ::GetDlgItemText(hwnd,IDC_EDIT2,szFile,MAX_PATH);
    HANDLE hUpdateRes=BeginUpdateResource(szFilePath,FALSE);
    int result=UpdateResource(hUpdateRes,RT_RCDATA,MAKEINTRESOURCE(1039),MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL),(LPVOID)szFile,::strlen(szFile));
    EndUpdateResource(hUpdateRes, FALSE);
    return 0;
    }

    -------------------------------------------------------------

    其他的一些代碼如下

    #include <Windows.h>
    #include <ShlObj.h>
    #include "resource.h"

    TCHAR szFilePath[MAX_PATH + 1];

    int LastCheckRdioId;
    //提示
    void Alert(LPCSTR msg)
    {
    MessageBox(NULL,msg,"系統(tǒng)提示",MB_OK);
    }

    PC官方
    安卓官方手機(jī)版
    IOS官方手機(jī)版

    DotNet4應(yīng)用程序打包工具截圖

    下載地址

    DotNet4應(yīng)用程序打包工具 3.5.4 升級(jí)版【附源碼+分析】

    熱門評(píng)論
    最新評(píng)論
    發(fā)表評(píng)論 查看所有評(píng)論(0)
    昵稱:
    表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
    字?jǐn)?shù): 0/500 (您的評(píng)論需要經(jīng)過審核才能顯示)

    編輯推薦

    本類軟件必備

    編程UltraEditvc++6.0Notepad++編譯VBILSpyHopper數(shù)據(jù)MySQLoracleaccess設(shè)計(jì)DreamweaverfireworksFlash

    報(bào)錯(cuò)

    請(qǐng)簡(jiǎn)要描述您遇到的錯(cuò)誤,我們將盡快予以修正。

    轉(zhuǎn)帖到論壇
    輪壇轉(zhuǎn)帖HTML方式

    輪壇轉(zhuǎn)帖UBB方式