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. pymysql安装后使用报错处理

    1.django启动报错: Error loading MySQLdb module. Did you install mysqlclient? 原因:初次安装配置pymysql时需要在__init_ ...

  2. 关于UPD章节学习的一些感想

    课程看到了UDP, 首先了解UDP的原理模型. 服务端,首先是实例QUdpSocket,也就是UDP套接字,然后,需要绑定.绑定一个任意IP地址,分为IPV4和IPV6.自行选择课程中讲解时绑定的是I ...

  3. Springboot jar 打包脚本和启动脚本

    说明: SpringBoot极大的提高了工作效率,集成了各大厂优秀的组件,好处就不多说了,使用配置也非常方便,本文主要讲解如何使用更方便的方式打包发布,利用SpringBoot的新特性内置tomcat ...

  4. PicList 现已上架Mac App Store 分享下整个上架过程和遇到的问题

    PicList 是一款云存储/图床平台管理和文件上传工具,基于 PicGo 进行了深度二次开发,保留了 PicGo 的所有功能的同时,为相册添加了同步云端删除功能,同时增加了完整的云存储管理功能,包括 ...

  5. CF1037H Security题解

    根据字典序的定义,位置大的大于长度长的,长度长的大于长度短的. 所以我们贪心,先追求长度长的,再追求后面的位置大的,再追求前面的位置大的. 我们要一个能遍历子串的结构,就选 SAM 得了. 还有个限制 ...

  6. Learning with Mini-Batch

    在机器学习中,学习的目标是选择期望风险\(R_{exp}\)(expected loss)最小的模型,但在实际情况下,我们不知道数据的真实分布(包含已知样本和训练样本),仅知道训练集上的数据分布.因此 ...

  7. 改善与提高linux系统的音质

    当初装Linux系统的时候,我就发现了,deepin和ubuntu的linux平台音质和Windows平台下的音质不一样.硬件参数没变,歌曲音频文件相同的情况下,linux播放歌曲的时候动态和音乐细节 ...

  8. NodeJS V8引擎的内存和垃圾回收器(GC)

    一.为什么需要GC 程序应用运行需要使用内存,其中内存的两个分区是我们常常会讨论的概念:栈区和堆区. 栈区是线性的队列,随着函数运行结束自动释放的,而堆区是自由的动态内存空间.堆内存是手动分配释放或者 ...

  9. 一些随笔 No.1

    耦合 耦合是一个设计与逻辑上的问题 例如一个软件有20个功能,删除任意一个功能对别的19个功能不造成影响,就是低耦合 如果删除一个功能后其他功能会失去完整性,那么就是高耦合 Difference be ...

  10. 经GitHub将kubernetes镜像推送到阿里云

    背景 在安装kubernetes时会出现无法访问镜像站的情况,通过GitHub将kubernetes镜像推送到阿里云之后,即可使用阿里云地址引用所需镜像,现已同步镜像5000+,当前还在陆续同步.仓库 ...