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

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

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

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

DotNet4應用程序打包工具

DotNet4應用程序打包工具3.5.4 升級版【附源碼+分析】

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

DotNet4應用程序打包工具可以打包dotNet2.0  3.5  4乃至所有在注冊表中添加過注冊表項的應用程序。

DotNet4應用程序打包工具源碼分析

入口函數(shù):

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

好吧,入口函數(shù)很簡單,只是創(chuàng)建了一個窗體,并注冊了窗口過程函數(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 ;
}

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

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

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

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

窗口初始化消息里

我們默認選中了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;
}

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

四個單選按鈕的單擊事件

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

并記錄了當前選中的是哪個單選按鈕

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

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

選擇文件

把選中的文件路徑賦值給相應的文本框

//得到文件
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 = "應用程序 (.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);
}
}


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

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

//釋放資源
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圖標資源

這里需要重點說明一下:

要想更新一個應用程序的資源

必須先知道這個資源的ID

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

因為一般的應用程序圖標資源都會有兩個

所以獲取了兩個圖表資源的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;
}

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

為宿主程序增加目標程序資源和dotNet安裝包資源

增加的資源也是需要標明ID的

因為宿主程序會根據(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;
}

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

把注冊表項的路徑也當作資源打包進宿主程序

我們約定這個資源的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官方
安卓官方手機版
IOS官方手機版

DotNet4應用程序打包工具截圖

下載地址

DotNet4應用程序打包工具 3.5.4 升級版【附源碼+分析】

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

編輯推薦

本類軟件必備

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

報錯

請簡要描述您遇到的錯誤,我們將盡快予以修正。

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

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