Files
2026-06-13 00:05:19 +08:00

411 lines
9.7 KiB
C++

//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include <System.IOUtils.hpp>
#include <Winerror.h>
#include "GlobalUnit.h"
#include "SplashFormUnit.h"
#include "MessageFormUnit.h"
//---------------------------------------------------------------------------
USEFORM("SplashFormUnit.cpp", SplashForm);
USEFORM("MainFormUnit.cpp", MainForm);
USEFORM("MessageFormUnit.cpp", MessageForm);
//---------------------------------------------------------------------------
HWND hWnd = NULL;
HINSTANCE u_hMMDll = NULL,
u_hCMDll = NULL,
u_hCSDll = NULL,
u_hQRDll = NULL;
void InitUserPath()
{
SplashForm->ShowProgress( "配置用户路径..." );
String strAppPath = TPath::GetFullPath(ExtractFilePath(Application->ExeName));
g_strExecutePath = strAppPath.c_str();
TCHAR filePath[MAX_PATH];
SHGetSpecialFolderPath(NULL, filePath, CSIDL_LOCAL_APPDATA, TRUE);
String strLocPath = filePath;
strLocPath += L"\\iChangzuo";
if(!DirectoryExists( strLocPath, false)){
ForceDirectories( strLocPath );
}
#ifdef _LITE_
strLocPath += L"\\Ac_ProLite\\";
#else
strLocPath += L"\\Ac_Pro\\";
#endif
g_strUserPath = strLocPath.c_str();
if(!DirectoryExists( strLocPath, false)){
ForceDirectories( strLocPath );
}
if(!DirectoryExists( strLocPath + L"Help", false)){
ForceDirectories( strLocPath + L"Help" );
}
if(!DirectoryExists( strLocPath + L"header", false)){
ForceDirectories( strLocPath + L"header" );
String strSrc = strAppPath + L"Header\\default.jpg",
strDest = strLocPath + L"Header\\default.jpg";
if( FileExists( strSrc, false ) )
CopyFile( strSrc.c_str(), strDest.c_str(), FALSE );
}
strLocPath += L"Profile\\";
strAppPath += L"Profile\\";
bool bCover = false;
if( DirectoryExists( strAppPath, false ) ){
if( !DirectoryExists( strLocPath, false) ){
ForceDirectories( strLocPath );
bCover = true;
}
}
else{
return;
}
String strSubPathShort[3] = { "dt_eerp", "ml_bursa", "sf_lyres" },
strDefaultFile[3][2] = { {"uflid.jst","lidshr.lux"},
{"frm0000.lmd","shr0000.lmd"},
{"Lcyh00000.dhy","Lcyh00001.dhy"} };
for( int i=0; i<3; i++ ){
String strOriPath = strAppPath + strSubPathShort[i],
strSubPath = strLocPath + strSubPathShort[i];
if( DirectoryExists( strOriPath, false ) ){
if( !DirectoryExists( strSubPath, false ) ){
ForceDirectories( strSubPath );
bCover = true;
}
else{
for( int j=0; j<2; j++ ){
String strExistFile = strOriPath + L"\\" + strDefaultFile[i][j],
strNewFile = strSubPath + L"\\" + strDefaultFile[i][j];
HANDLE hOriFile = CreateFile( strExistFile.c_str(), GENERIC_READ, FILE_SHARE_READ,
NULL, OPEN_EXISTING, 0, NULL );
if( hOriFile && hOriFile!=INVALID_HANDLE_VALUE ){
HANDLE hNewFile = CreateFile( strNewFile.c_str(), GENERIC_READ, FILE_SHARE_READ,
NULL, OPEN_EXISTING, 0, NULL);
if( hNewFile && hNewFile!=INVALID_HANDLE_VALUE ){
DWORD dwSizeOri = GetFileSize( hOriFile, NULL ),
dwSizeNew = GetFileSize( hNewFile, NULL );
FILETIME ftModifyOri, ftModifyNew;
GetFileTime( hOriFile, NULL, NULL, &ftModifyOri );
GetFileTime( hNewFile, NULL, NULL, &ftModifyNew );
if( dwSizeOri>dwSizeNew || CompareFileTime( &ftModifyOri, &ftModifyNew )>0 )
bCover = true;
CloseHandle( hNewFile );
}
else{
bCover = true;
}
CloseHandle( hOriFile );
}
else if( j==0 ){
return;
}
}
}
}
else{
return;
}
}
TSearchRec sr;
int iAttr = 0;
for( int i=0; i<3; i++ ){
String strOriPath = strAppPath + strSubPathShort[i],
strSubPath = strLocPath + strSubPathShort[i];
if (FindFirst(strOriPath + L"\\*.*", iAttr, sr) == 0) {
do {
String strExistFile = strOriPath + L"\\" + sr.Name,
strNewFile = strSubPath + L"\\" + sr.Name;
bool bCopy = true;
if( !sr.Name.Compare(strDefaultFile[i][0]) || !sr.Name.Compare(strDefaultFile[i][1]) ){
bCopy = bCover;
}
else if( FileExists( strNewFile, false ) ){
HANDLE hOriFile = CreateFile( strExistFile.c_str(), GENERIC_READ, FILE_SHARE_READ,
NULL, OPEN_EXISTING, 0, NULL );
if( hOriFile && hOriFile!=INVALID_HANDLE_VALUE ){
HANDLE hNewFile = CreateFile( strNewFile.c_str(), GENERIC_READ, FILE_SHARE_READ,
NULL, OPEN_EXISTING, 0, NULL);
if( hNewFile && hNewFile!=INVALID_HANDLE_VALUE ){
FILETIME ftModifyOri, ftModifyNew;
GetFileTime( hOriFile, NULL, NULL, &ftModifyOri );
GetFileTime( hNewFile, NULL, NULL, &ftModifyNew );
CloseHandle( hNewFile );
if( CompareFileTime( &ftModifyNew, &ftModifyOri )>=0 ){
bCopy = false;
}
}
CloseHandle( hOriFile );
}
else{
bCopy = false;
}
}
if( bCopy ){
CopyFile( strExistFile.c_str(), strNewFile.c_str(), FALSE );
if( !sr.Name.Compare(L"smtd.dhy") ){ //本地风格需处理时间戳
HANDLE hOriFile = CreateFile( strExistFile.c_str(), GENERIC_READ, FILE_SHARE_READ,
NULL, OPEN_EXISTING, 0, NULL );
if( hOriFile && hOriFile!=INVALID_HANDLE_VALUE ){
HANDLE hNewFile = CreateFile( strNewFile.c_str(), GENERIC_WRITE, FILE_SHARE_WRITE,
NULL, OPEN_EXISTING, 0, NULL);
if( hNewFile && hNewFile!=INVALID_HANDLE_VALUE ){
FILETIME ftCreate;
GetFileTime( hOriFile, &ftCreate, NULL, NULL );
SetFileTime( hNewFile, &ftCreate, NULL, NULL );
CloseHandle( hNewFile );
}
CloseHandle( hOriFile );
}
}
}
}
while( FindNext(sr)==0 );
FindClose(sr);
}
}
}
int LoadDlls()
{
SplashForm->ShowProgress( "加载媒体模块..." );
u_hMMDll = LoadLibrary(L"MediaModule.dll");
if( u_hMMDll==NULL ){
return 1;
}
else if( GetMMFunctions(u_hMMDll)==S_FALSE ) {
return 2;
}
SplashForm->ShowProgress( "加载编曲模块..." );
u_hCMDll = LoadLibrary(L"CompModule.dll");
if( u_hCMDll==NULL ){
int err = GetLastError();
return 3;
}
else if( GetCMFunctions(u_hCMDll)==S_FALSE ) {
return 4;
}
SplashForm->ShowProgress( "加载网络模块..." );
u_hCSDll = LoadLibrary(L"ClientService.dll");
if( u_hCSDll==NULL ){
return 5;
}
else if( GetCSFunctions(u_hCSDll)==S_FALSE ) {
return 6;
}
u_hQRDll = LoadLibrary(L"QRcode.dll");
if( u_hQRDll ){
GetQRFunctions(u_hQRDll);
}
return 0;
}
void FreeDlls()
{
if( u_hCMDll ){
FreeLibrary( u_hCMDll );
u_hCMDll = NULL;
}
if( u_hMMDll ){
FreeLibrary( u_hMMDll );
u_hMMDll = NULL;
}
if( u_hCSDll ){
FreeLibrary( u_hCSDll );
u_hCSDll = NULL;
}
if( u_hQRDll ){
FreeLibrary( u_hQRDll );
u_hQRDll = NULL;
}
}
int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
hWnd = FindWindow( (LPCTSTR)APPNAME, NULL );
if( hWnd ){
SendMessage( hWnd, UM_RESTORE, 0, 0 );
if( !ParamStr(1).IsEmpty() ){
int BUF_SIZE = 256;
TCHAR szName[]=TEXT("MyFileMappingObject");
LPTSTR pBuf;
HANDLE hMapFile = CreateFileMapping(
INVALID_HANDLE_VALUE, // use paging file
NULL, // default security
PAGE_READWRITE, // read/write access
0, // max. object size
BUF_SIZE, // buffer size
szName); // name of mapping object
if( hMapFile ){
pBuf = (LPTSTR) MapViewOfFile(hMapFile, // handle to map object
FILE_MAP_ALL_ACCESS, // read/write permission
0,
0,
BUF_SIZE);
if( pBuf ){
wcscpy( pBuf, ParamStr(1).c_str() );
SendMessage( hWnd, UM_LOADPROJECT, 0, wcslen(pBuf) );
UnmapViewOfFile(pBuf);
}
CloseHandle(hMapFile);
}
}
return 0;
}
try
{
Application->Initialize();
Application->MainFormOnTaskBar = true;
Application->Title = APPNAME;
// 获取DPI
HDC hdc = GetDC(NULL);
if (hdc != NULL) {
g_xDpi = GetDeviceCaps(hdc, LOGPIXELSX);
g_yDpi = GetDeviceCaps(hdc, LOGPIXELSY);
ReleaseDC(NULL, hdc);
}
g_szFont7 = int(7 * 96.0 / g_yDpi + 0.5);
g_szFont8 = int(8 * 96.0 / g_yDpi + 0.5);
g_szFont9 = int(9 * 96.0 / g_yDpi + 0.5);
g_szFont10 = int(10 * 96.0 / g_yDpi + 0.5);
g_szFont11 = int(11 * 96.0 / g_yDpi + 0.5);
g_szFont12 = int(12 * 96.0 / g_yDpi + 0.5);
g_szFont16 = int(16 * 96.0 / g_yDpi + 0.5);
//显示启动图片
SplashForm = new TSplashForm(Application);
SplashForm->Show();
InitUserPath();
String strErr;
switch(LoadDlls()){
case 1:
strErr = "加载媒体模块失败!";
break;
case 2:
strErr = "获取媒体模块函数失败!";
break;
case 3:
strErr = "加载编曲模块失败!";
break;
case 4:
strErr = "获取编曲模块函数失败!";
break;
case 5:
strErr = "加载网络服务模块失败!";
break;
case 6:
strErr = "获取网络服务函数失败!";
break;
default:
break;
}
MessageForm = new TMessageForm(Application);
MessageForm->Position = poDesktopCenter;
if( !strErr.IsEmpty() ){
delete SplashForm;
FreeDlls();
MessageForm->ShowMessage( strErr, MB_ICONERROR|MB_OK );
delete MessageForm;
return 0;
}
Word Saved8087CW = Default8087CW;
System::Set8087CW(0x133f);
Application->CreateForm(__classid(TMainForm), &MainForm);
Application->MainForm->Visible = false;
delete SplashForm;
SplashForm = NULL;
if( !g_lstFonts.empty() ){
Application->MainForm->Visible = true;
MessageForm->Position = poMainFormCenter;
Application->Run();
}
delete MessageForm;
FreeDlls();
System::Set8087CW(Saved8087CW);
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
// catch (...)
// {
// try
// {
// throw Exception("");
// }
// catch (Exception &exception)
// {
// Application->ShowException(&exception);
// }
// }
return 0;
}
//---------------------------------------------------------------------------