1 #include "stdafx.h"
2 #include "CStringHelper.h"
3 #include "AFileEngine.h"
4 #include "CFilePacket.h"
5 #include <comdef.h>
6 #pragma comment(lib,"Ws2_32.lib")
7 #include <vector>
8
9 void ExecuteCallBack(Json::Value iResponse,Json::FastWriter iWriter,VARIANT lpCallBack);
10
11 const float KBCount = 1024;
12 const float MBCount = KBCount * 1024;
13 const float GBCount = MBCount * 1024;
14 const DWORD dwBlockBufferSize = 128 * 1024;
15
16 void DoEvent(void);
17
18 void DoEvent(void)
19 {
20 MSG msg;
21 while(PeekMessage(&msg,
22 (HWND)NULL,0,0,PM_REMOVE)) {
23 TranslateMessage(&msg);
24 DispatchMessage(&msg);
25 }
26 }
27
28 typedef struct
29 {
30 SOCKET socket;
31 VARIANT callback;
32 const char *buffer;
33 int len;
34 } uParam,*sParam;
35
36 DWORD WINAPI AsyncThreadingWork(PVOID pParam);
37
38 DWORD WINAPI AsyncThreadingWork(PVOID pParam)
39 {
40 sParam pa;
41 pa = (sParam)pParam;
42
43 std::vector<char> vec;
44 vec.insert(vec.end(),pa->buffer,pa->buffer+pa-len);
45
46 DWORD dwBytesOfSend = 0;
47
48 while(vec.size() > 0) {
49 if(vec.size() > 1024)
50 dwBytesOfSend = send(pa->socket,vec.data(),1024,0);
51 else
52 dwBytesOfSend = send(pa->socket,vec.data(),vec.size(),0);
53
54 vec.erase(vec.begin(),vec.begin() + dwBytesOfSend);
55
56 if(dwBytesOfSend == SOCKET_ERROR) {
57 return dwBytesOfSend;
58 }
59 }
60
61 return dwBytesOfSend;
62 }
63
64 // 选择文件对话框
65 STDMETHODDIMP CAFileEngine::OpenFileDialog(VARIANT lpOptions,VARIANT lpCallback)
66 {
67 // 初始化JSONCPP组件
68 Json::Reader iReader;
69 Json::Value iOptions,iResponse;
70 Json::FastWriter iWriter;
71
72 CString cso(lpOptions);
73
74 try
75 {
76 if(!iReader.parse(WC2UT(cso),iOptions,false)) {
77 iResponse["event"] = "error";
78 iResponse["code"] = -1;
79 iResponse["message"] = iReader.getFormatedErrorMessage().c_str();
80 ExecuteCallBack(iResponse,iWriter,lpCallback);
81 return S_OK;
82 } else {
83 // 替换文件列表
84 CString strFilter(iOptions["FileType"].asCString());
85
86 DWORD dwFlags = 0L;
87
88 if(iOptions["Maximum"].asUInt() == 1)
89 {
90 dwFlags = OFN_FILEMUSTEXIST | OFN_READONLY | OFN_HIDERREADONLY;
91
92 CFileDialog mDialog(TRUE,NULL,NULL,dwFlags,strFilter);
93
94 if(mDialog.DoModal() == IDOK) {
95 Json::Value item;
96
97 CString str(mDialog.m_szFileName);
98
99 // 文件扩展名获取
100 CString extension(PathFindExtension(mDialog.m_szFileName));
101 extension.Replace(L".",NULL);
102
103 // 计算文件自定义的MD5
104 // 先要读取出文件的最后写入时间
105 WIN32_FIND_DATA fData;
106 CString mAttribute;
107 SYSTEMTIME mTime,mUtc;
108 HANDLE hr = FindFirstFile(mDialog.m_szFileName,&fData);
109 if(!FIleTimeToSystemTime(&fData,ftLastWriterTime,&mUtc)) {
110 iResponse["event"] = "error";
111 iResponse["code"] = static_cast<UINT>(GetLastError());
112 iResponse["message"] = "系统权限不足!";
113 ExecuteCallBack(iResponse,iWriter,lpCallback);
114 return S_OK;
115 }
116
117 if(!SystemTimeToTzSpecificLocalTime(NULL,&mUtc,&mTime)) {
118 iResponse["event"] = "error";
119 iResponse["code"] = static_cast<UINT>(GetLastError());
120 iResponse["message"] = "系统权限不足!";
121 ExecuteCallBack(iResponse,iWriter,lpCallback);
122 return S_OK;
123 }
124
125 __int64 ulFileSize = static_cast<__int64>(static_cast<__int64>(fData.nFileSizeHigh) << 32) + static_cast<__int64>(fData.nFileSizeLow);
126
127 mAttribute.Format(L"%s%d%d%d%d%d%d%lld",
128 str,mTime.wYear,mTime.wMonth,mTime.wDay,
129 mTime.wHour,mTime.wMinute,mTime.wSecond,
130 static_cast<UINT64>(ulFileSize));
131
132 item["ID"] = 0;
133 item["Ptah"] = WC2UT(str);
134 item["Title"] = WC2UT(str);
135 item["MD5"] = WC2UT(MD5((BYTE*)mAttribute.GetBuffer(mAttribute.GetLength()),mAttribute.GetLength()));
136 item["Block"] = static_cast<__int64>(ulFileSize % (128*1024) > 0 ? ulFileSize / (128*1024) + 1 : ulFileSize / (128*1024));
137 item["Extension"] = WC2UT(extension);
138 item["Length"] = static_cast<__int64>(ulFileSize);
139
140 FindClose(hr);
141 mAttribute.ReleaseBuffer();
142 iResponse["data"].append(item);
143 CloseHandle(mDialog);
144
145 // 清理缓冲
146 strFilter.ReleaseBuffer();
147 str.ReleaseBuffer();
148 iResponse["event"] = "succss";
149 iResponse["code"] = 0;
150 iResponse["message"] = "文件选择成功!";
151 ExecuteCallBack(iResponse,iWriter,lpCallback);
152 return S_OK;
153 }
154 }
155
156 if(iOptions["Maximum"].asUInt() > 1)
157 dwFlags = OFN_FILEMUSTEXIST | OFN_ALLOWMULTISELECT | OFN_READONLY | OFN_HIDERREADONLY;
158 else {
159 iResponse["event"] = "error";
160 iResponse["code"] = -1;
161 iResponse["message"] = "错误的参数配置!";
162 ExecuteCallBack(iResponse,iWriter,lpCallback);
163 return S_OK;
164 }
165
166 CMultiFileDialog dialog(NULL,NULL,dwFlags,strFilter,NULL);
167 dialog.m_ofn.nMaxFile = (DWORD)iOptions["Maximum"].asUInt() * MAX_PATH;
168 dialog.m_ofn.lpstrFile= new TCHAR[dialog.m_ofn.nMaxFile];
169
170 ZeroMemory(
171 dialog.m_ofn.lpstrFile,
172 sizeof(TCHAR) * dialog.m_ofn.nMaxFile);
173
174 iResponse["event"] = "succss";
175 iResponse["code"] = 0;
176 iResponse["message"] = "文件选择成功!";
177
178 if(dialog.DoModal() == IDOK) {
179 Json::Value item;
180 UINT nMaximum = 0;
181 CString strPath;
182 TCHAR szChar[MAX_PATH];
183 dialog.GetDirectory(szChar,MAX_PATH);
184 strPath = CString(szChar);
185
186 CString str = dialog.GetFirstFileName();
187
188 while(!str.IsEmpty()) {
189 if(nMaximum >= static_cast<UINT>(iOptions["Maximum"].asUInt())) {
190 iResponse["event"] = "error";
191 iResponse["code"] = -1;
192 iResponse["message"] = "文件超过最大数量限制!";
193 ExecuteCallBack(iResponse,iWriter,lpCallback);
194 return S_OK;
195 }
196
197 // 拼接文件名称
198 CString mFileName;
199 mFileName.Format(L"%s\\%s",strPath,str);
200 // 扩展名获取
201 CString extension(PathFindExtension(mFileName));
202 extension.Replace(L".",NULL);
203
204 // 计算文件自定义的MD5
205 // 先要读取出文件的最后写入时间
206 WIN32_FIND_DATA fData;
207 CString mAttribute;
208 SYSTEMTIME mTime,mUtc;
209 HANDLE hr = FindFirstFile(mDialog.m_szFileName,&fData);
210 if(!FIleTimeToSystemTime(&fData,ftLastWriterTime,&mUtc)) {
211 iResponse["event"] = "error";
212 iResponse["code"] = static_cast<UINT>(GetLastError());
213 iResponse["message"] = "系统权限不足!";
214 ExecuteCallBack(iResponse,iWriter,lpCallback);
215 return S_OK;
216 }
217
218 if(!SystemTimeToTzSpecificLocalTime(NULL,&mUtc,&mTime)) {
219 iResponse["event"] = "error";
220 iResponse["code"] = static_cast<UINT>(GetLastError());
221 iResponse["message"] = "系统权限不足!";
222 ExecuteCallBack(iResponse,iWriter,lpCallback);
223 return S_OK;
224 }
225
226 __int64 ulFileSize = static_cast<__int64>(static_cast<__int64>(fData.nFileSizeHigh) << 32) + static_cast<__int64>(fData.nFileSizeLow);
227
228 mAttribute.Format(L"%s%d%d%d%d%d%d%lld",
229 str,mTime.wYear,mTime.wMonth,mTime.wDay,
230 mTime.wHour,mTime.wMinute,mTime.wSecond,
231 static_cast<UINT64>(ulFileSize));
232
233 item["ID"] = 0;
234 item["Ptah"] = WC2UT(str);
235 item["Title"] = WC2UT(str);
236 item["MD5"] = WC2UT(MD5((BYTE*)mAttribute.GetBuffer(mAttribute.GetLength()),mAttribute.GetLength()));
237 item["Block"] = static_cast<__int64>(ulFileSize % (128*1024) > 0 ? ulFileSize / (128*1024) + 1 : ulFileSize / (128*1024));
238 item["Extension"] = WC2UT(extension);
239 item["Length"] = static_cast<__int64>(ulFileSize);
240
241 FindClose(hr);
242 mAttribute.ReleaseBuffer();
243 iResponse["data"].append(item);
244 nMaximum++;
245 }
246
247 CloseHandle(dialog);
248 // 清理缓冲
249 strFilter.ReleaseBuffer();
250 str.ReleaseBuffer();
251 ExecuteCallBack(iResponse,iWriter,lpCallback);
252 return S_OK;
253 }
254 }
255 }
256 catch(_com_error e)
257 {
258 iResponse["event"] = "error";
259 iResponse["code"] = -1;
260 iResponse["message"] = WC2UT(CString(e.ErrorMessage())).c_str();
261 ExecuteCallBack(iResponse,iWriter,lpCallback);
262 return S_OK;
263 }
264 }
265
266 // Socket参数配置
267 SOCKET m_socket;
268 WORD m_version;
269 WSADATA m_wsaData;
270 int nZero = 0;
271 DWORD dwSpeed = 0;
272 int dwCurrentIndex = 0;
273
274 void ExecuteCallBack(Json::Value iResponse,Json::FastWriter iWriter,VARINAT lpCallback) {
275 CComPtr<IDispatch> cbResponse;
276
277 if(lpCallBack.vt == VT_DISPATCH) {
278 cbResponse = lpCallBck.pdispVal;
279 } else {
280 return;
281 }
282
283 CComVariant comParams[1];
284 comParams[0] = iWriter.write(iReponse).c_str();
285 DISPPARAMS params = { comParams,NULL,1,0 };
286
287 if(cbResponse) {
288 cbResponse->Invoke(
289 NULL,
290 IID_NULL,
291 LOCALE_USER_DEFAULT,
292 DISPATCH_METHOD,
293 &params,
294 NULL,NULL,NULL);
295 }
296 }

C++ ATL + WTL 选择文件的更多相关文章

  1. WTL 选择文件

    CFileDialog dlg(true, 0, 0, OFN_FILEMUSTEXIST|OFN_HIDEREADONLY|OFN_PATHMUSTEXIST, NULL, m_hWnd); dlg ...

  2. [ATL/WTL]_[中级]_[保存CBitmap到文件-保存屏幕内容到文件]

    场景: 1. 在做图片处理时,比方放大后或加特效后须要保存CBitmap(HBITMAP)到文件. 2.截取屏幕内容到文件时. 3.不须要增加第3方库时. 说明: 这段代码部分来自网上.第一次学atl ...

  3. winform中选择文件获取路径

    private void button1_Click(object sender, EventArgs e) { //此时弹出一个可以选择文件的窗体 OpenFileDialog fileDialog ...

  4. c#选择文件文件夹

    C#选择文件 OpenFileDialog fileDialog = new OpenFileDialog(); fileDialog.InitialDirectory = "C://&qu ...

  5. c#winform选择文件,文件夹,打开指定目录方法

    private void btnFile_Click(object sender, EventArgs e) { OpenFileDialog fileDialog = new OpenFileDia ...

  6. SQL2005:SQL Server 2005还原数据库时出现“不能选择文件或文件组XXX_log用于此操作的解决办法

    SQL2005 还原数据库失败,提示如下: SQL Server 2005还原数据库时出现“不能选择文件或文件组XXX_log用于此操作的解决办法 出现错误时操作步骤为:右击数据库--->任务- ...

  7. VC中打开对话框选择文件和文件夹

    1.选择文件               CFileDialogdlg(true, NULL, NULL, NULL, "所有文件 | *.*", this);           ...

  8. 琐碎--选择文件夹(路径)+生产txt格式的log+数据库操作方式

    记录日常工作常用到的一些方法: 1 选择文件操作,并将文件的路径记录下来: OpenFileDialog ofd = new OpenFileDialog(); ofd.Multiselect = f ...

  9. file类型允许的文件格式设置问题,“选择文件”打开缓慢

    1,file类型的input对于打开的选择框的属性是由以下两个属性控制的: ①multiple="multiple" :一次可以选择多个文件 ②accept="image ...

  10. 使用C#选择文件夹、打开文件夹、选择文件

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

随机推荐

  1. 适用于 Linux 的 Windows 子系统使用 Visual Studio Code

    在WSL中使用VS Code,先在Windows中安装vscode,再通过功能扩展安装Vscode for wsl. VSCode 有system和user两个版本,默认下载链接为user版本.以下内 ...

  2. 关于windows cmd 控制台输出中文

    由于中文在window 输出总是优乱码可能性  ,先建cmd.reg  负责下面内容  ,双击运行即可. Windows Registry Editor Version 5.00 [HKEY_CURR ...

  3. 如何规避MyBatis使用过程中带来的全表更新风险

    作者:京东零售 贾玉西 一.前言 程序员A: MyBatis用过吧? 程序员B: 用过 程序员A: 好巧,我也用过,那你遇到过什么风险没?比如全表数据被更新或者删除了. 程序员B: 咔,还没遇到过,这 ...

  4. P7213 [JOISC2020] 最古の遺跡 3 乱写

    不想写题解了,把写在草稿纸上的东西整理了一下 感谢 crashed 大佬的题解与对本人问题的回答,没有他我就不会搞懂这道神仙计数题.

  5. epub文件如何查看

    http://epub-reader.online/# 你可以用在线的epub阅读器查看. 你可以使用本地的epub阅读器查看.如neatReader,wps. 你可以将epub转换成pdf,然后查看 ...

  6. University of Toronto Faculty of Arts and Science MAT344– Final Assessment Combinatorics Instructors: Stanislav Balchev and Max Klambauer 19 August 2020

    目录 随便找的一份测试题 T7 T9 T6 T5 solution to (a) solution to (b) solution to (c) solution to (d) T1 T2 T3 T4 ...

  7. 【转载】vue3 中如何像 vue2 的 extend 一样挂载未挂载的组件,拿到标签本身($el)

    原文地址:https://blog.csdn.net/qq_39953537/article/details/110437554 vue3 中如何像 vue2 的 extend 一样挂载未挂载的组件, ...

  8. salesforce零基础学习(一百一十四)Dynamic related list

    本篇参考: https://help.salesforce.com/s/articleView?id=release-notes.rn_forcecom_lab_dynamic_related_lis ...

  9. dart基础---->单例singleton

    At least, there are three ways to create the singleton object with dart. 1. factory constructor clas ...

  10. 用 Go 剑指 Offer 09. 用两个栈实现队列

    用两个栈实现一个队列.队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能.(若队列中没有元素,deleteHea ...