15,979
社区成员
发帖
与我相关
我的任务
分享
typedef struct _FileInfo{
public:
UINT uResourceID;
TCHAR * ptzFileType;
char * pszOutputFileName;
}FileInfo, *PFileInfo;
2、将文件加入到工程中。
3、做一个全局数组,用于说明哪些资源需要释放。
FileInfo g_files[] = {
{IDR_FILE2 ,_T("FILE"), "..\\..\\bin\\ChnCharInfo.dll"},
{IDR_FILE3 ,_T("FILE"), "..\\..\\bin\\CarTypeManager.dll"},
{IDR_FILE1 ,_T("FILE"), "..\\..\\bin\\ZKTD.dll"},
{IDR_FILE4 ,_T("FILE"), "..\\..\\bin\\CKTD.dll"},
{IDR_FILE5 ,_T("FILE"), "..\\..\\bin\\EncryptDecrypt.dll"},
......
4、关键函数。
//创建快捷方式
BOOL CPropertyPage5::CreateLink(LPCTSTR pszFile,LPCTSTR pszDirectory)
{
CoInitialize(NULL);
HRESULT hres;
IShellLink* psl;
IPersistFile* ppf;
hres = CoCreateInstance(CLSID_ShellLink,NULL,CLSCTX_INPROC_SERVER,IID_IShellLink,(void**)&psl);
if(FAILED(hres)) return FALSE;
psl->SetPath(pszFile);//设置源文件名
// psl->SetDescription("C:\\123");//设置备注
// psl->SetRelativePath("C:\\123",0);//目标位置
//起始位置--这个一定要设,因为载入INI文件是在起始位置找的,不设置此值将在桌面上找
CString strWorkingDirectory( pszFile );
strWorkingDirectory = strWorkingDirectory.Left( strWorkingDirectory.ReverseFind('\\') + 1 );
psl->SetWorkingDirectory( strWorkingDirectory );
hres = psl->QueryInterface(IID_IPersistFile,(void**)&ppf);
if(FAILED(hres)) return FALSE;
OLECHAR wszDirectory[MAX_PATH] = { 0 };
#ifdef _UNICODE
wcscpy_s( wszDirectory,sizeof(wszDirectory)/sizeof(OLECHAR),pszDirectory );
#else
MultiByteToWideChar(CP_ACP,0,pszDirectory,-1,wszDirectory,MAX_PATH);
#endif
hres=ppf->Save(wszDirectory,STGM_READWRITE);//LPCOLESTR
ppf->Release();
psl->Release();
CoUninitialize();
return TRUE;
}
//释放资源文件到指定的文件
bool CPropertyPage5::ExtractResource(LPCTSTR lpName,LPCTSTR lpType,LPCTSTR lpFilePath,bool bOverWrite)
{
if(bOverWrite==false)
{
CFileFind ff;
if(ff.FindFile(lpFilePath)) return false;
}
HMODULE hModule = AfxGetInstanceHandle();
HRSRC res=FindResource(hModule,lpName,lpType);
if(res==NULL) return false;
HGLOBAL gl=::LoadResource(hModule,res);
if(gl==NULL) return false;
char * lp=(char*)::LockResource(gl); // 查找,加载,锁定资源
if(lp==NULL) return false;
TCHAR path[MAX_PATH] = {0};
_tcscpy_s(path,sizeof(path),lpFilePath);
_tcscpy_s(_tcsrchr(path,'\\')+1,sizeof(path)-(_tcsrchr(path,'\\')-path+1),_T(""));
CreateMultiDir(path);
HANDLE fp;
if(bOverWrite)
fp=CreateFile(lpFilePath,GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,0,NULL);
else
fp=CreateFile(lpFilePath,GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_NEW,0,NULL);
bool ret = false;
if(fp != INVALID_HANDLE_VALUE)
{
CString strProgress;
strProgress.Format( _T("正在复制文件 %s"),lpFilePath );
SetDlgItemText(IDS_PROGRESS,strProgress);
DWORD dwRecvWritedVolumes=0,dwWritedVolumes=0,dwTotalVolumes=::SizeofResource(hModule,res);
while( dwWritedVolumes < dwTotalVolumes )
{
if( dwWritedVolumes + theApp.m_dwWriteVolumesOnce <= dwTotalVolumes )
{
if( WriteFile(fp,lp+dwWritedVolumes,theApp.m_dwWriteVolumesOnce,&dwRecvWritedVolumes,NULL) == FALSE )
ret = false;
}
else
{
if( WriteFile(fp,lp+dwWritedVolumes,dwTotalVolumes-dwWritedVolumes,&dwRecvWritedVolumes,NULL) == FALSE )
ret = false;
}
// SetFilePointer(fp,0,NULL,FILE_END);//设置文件指针到文件尾
//记录写入的数据大小
dwWritedVolumes += dwRecvWritedVolumes;
m_dwWritedFileVolumes += dwRecvWritedVolumes;
m_Progress.SetPos( m_dwWritedFileVolumes );
//做一次消息循环
MSG msg;
while( PeekMessage( &msg,NULL,0,0,PM_REMOVE ) )
{
if( !AfxGetApp()->PreTranslateMessage( &msg ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
}
}
}
::CloseHandle (fp); //关闭句柄
::FreeResource (gl); //释放内存
return ret;
}
5、开始释放资源。
BOOL CPropertyPage5::StartInstall()
{
DWORD dwTotalVolumes = GetTotalVolumes();
m_Progress.SetRange32(0,dwTotalVolumes);
CPropertySheet * pSheet=(CPropertySheet*)GetParent();
CPropertyPage3 * m_page3=(CPropertyPage3*)( pSheet->GetPage(2) );
CString strDirectory=m_page3->m_strDirectory;//安装程序目的文件夹
BOOL bCreateShortcut=m_page3->m_bCheckShortcut;//是否创建快捷方式
BOOL bCreateProgramFolder=m_page3->m_bCheckProgram;//是否创建开始菜单程序组
if( strDirectory[strDirectory.GetLength()-1] != '\\' )
strDirectory += '\\';
CreateMultiDir( strDirectory );
//写Uninstall.txt文件
CFile file;
char buf[ MAX_PATH + 8 ];
CString strUninstallFile = strDirectory + _T("Uninstall.txt");
BOOL bUninstallFile = file.Open( strUninstallFile,CFile::modeCreate | CFile::modeReadWrite | CFile::typeText );
CString strFile;
strFile.Format( _T("%s %d\r\n"),strDirectory,RES_DIRECTORY );
if( bUninstallFile )
{
memset( buf,0,MAX_PATH + 8 );
#ifdef _UNICODE
WideCharToMultiByte( CP_ACP,0,strFile,strFile.GetLength(),buf,MAX_PATH+8,0,0 );
#else
strcpy( buf,strFile );
#endif
file.Write( buf,strlen( buf ) );
}
//开始写文件
m_dwWritedFileVolumes = 0;//所有已经写入的文件体积
TCHAR tzOutputFileName[MAX_PATH];
int i,nCount = sizeof(g_files)/sizeof(FileInfo);
for( i = 0; i < nCount; i++ )
{
#ifdef _UNICODE
MultiByteToWideChar(CP_ACP,0,g_files[i].pszOutputFileName,-1,tzOutputFileName,MAX_PATH);
#else
strcpy( tzOutputFileName,g_files[i].pszOutputFileName );
#endif
CString strOutputFileName = tzOutputFileName;
strOutputFileName.Delete( 0,_tcslen(_T("res\\Files\\")) );
strOutputFileName.Insert( 0,strDirectory );
ExtractResource(MAKEINTRESOURCE(g_files[i].uResourceID),g_files[i].ptzFileType,strOutputFileName,true);
Sleep( 10 );
}
//创建快捷方式
CString strAppPath,strUninstallPath,strLink;
if( bCreateShortcut )
{
SetDlgItemText(IDS_PROGRESS,_T("正在建立应用程序快捷方式..."));
//获取“桌面”所在位置
SHGetSpecialFolderPath(m_hWnd,strLink.GetBuffer(MAX_PATH),CSIDL_COMMON_DESKTOPDIRECTORY,TRUE);
strLink.ReleaseBuffer();
if( strLink[strLink.GetLength()-1] != '\\' ) strLink += '\\';
strLink += theApp.m_strTitle;
strLink += _T(".lnk");
strAppPath = strDirectory;
strAppPath += theApp.m_strAppName;
strAppPath += _T(".exe");
CreateLink( strAppPath.GetBuffer(strAppPath.GetLength()),strLink);
strFile.Format( _T("%s %d\r\n"),strLink,RES_FILE );
if( bUninstallFile )
{
memset( buf,0,MAX_PATH + 8 );
#ifdef _UNICODE
WideCharToMultiByte( CP_ACP,0,strFile,strFile.GetLength(),buf,MAX_PATH+8,0,0 );
#else
strcpy( buf,strFile );
#endif
file.Write( buf,strlen( buf ) );
}
}
//创建开始菜单程序组
if( bCreateProgramFolder )
{
SetDlgItemText(IDS_PROGRESS,_T("正在创建开始菜单程序组..."));
CString strStart;//获取“开始菜单程序组”所在位置
SHGetSpecialFolderPath( m_hWnd,strStart.GetBuffer(MAX_PATH),CSIDL_COMMON_PROGRAMS,TRUE);
strStart.ReleaseBuffer();
if( strStart[strStart.GetLength()-1] != '\\' ) strStart += '\\';
strStart += theApp.m_strTitle;
if( strStart[strStart.GetLength()-1] != '\\' ) strStart += '\\';
CreateMultiDir(strStart);
strLink = strStart;
strLink += theApp.m_strTitle;
strLink += _T(".lnk");
CreateLink(strAppPath.GetBuffer(strAppPath.GetLength()),strLink);
strUninstallPath = strDirectory;
strUninstallPath += _T("Uninstall.exe");
strLink = strStart;
strLink += _T("\\卸载.lnk");
CreateLink(strUninstallPath.GetBuffer(0),strLink);
strFile.Format( _T("%s %d\r\n"),strStart,RES_DIRECTORY );
if( bUninstallFile )
{
memset( buf,0,MAX_PATH + 8 );
#ifdef _UNICODE
WideCharToMultiByte( CP_ACP,0,strFile,strFile.GetLength(),buf,MAX_PATH+8,0,0 );
#else
strcpy( buf,strFile );
#endif
file.Write( buf,strlen( buf ) );
}
}
//写注册表
SetDlgItemText(IDS_PROGRESS,_T("正在写入系统注册表信息..."));
WriteRegedit( strUninstallPath );//写注册表
//写加密狗驱动
SetDlgItemText(IDS_PROGRESS,_T("正在写入加密锁驱动..."));
CString strSoftDogFilePath = strDirectory + _T("SoftDogSetup.dll");
HINSTANCE hSoftDogDll = LoadLibrary( strSoftDogFilePath );
if( hSoftDogDll != NULL )
{
InstDriver = (INSTDRIVER)GetProcAddress(hSoftDogDll, "InstDriver");
UninstallDriver = (UNINSTALLDRIVER)GetProcAddress(hSoftDogDll, "UninstallDriver");
DriverDialog = (DRIVERDIALOG)GetProcAddress(hSoftDogDll, "DriverDialog");
GetDogDriverInfo = (GETDOGDRIVERINFO)GetProcAddress(hSoftDogDll, "GetDogDriverInfo");
int nRet = InstDriver(INSTALL_ONLY_USB_DOG_DRVIER);
if(nRet)
{
if (nRet == 3008)
{
MessageBox( _T("安装加密锁驱动失败,请以管理员身份登录操作系统,然后重试!"),_T("错误"),MB_ICONERROR );
}
else
{
MessageBox( _T("安装加密锁驱动失败请重试!"),_T("错误"),MB_ICONERROR );
}
}
FreeLibrary( hSoftDogDll );
}
SetDlgItemText( IDS_PROGRESS,_T("安装完成!") );
m_Progress.SetPos( dwTotalVolumes );
pSheet->SetWizardButtons(PSWIZB_FINISH);
CancelToClose();
return TRUE;
}
copy /b head.exe + data.7z Setup.exe