C++ ATL + WTL 选择文件
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 ¶ms,
294 NULL,NULL,NULL);
295 }
296 }
C++ ATL + WTL 选择文件的更多相关文章
- WTL 选择文件
CFileDialog dlg(true, 0, 0, OFN_FILEMUSTEXIST|OFN_HIDEREADONLY|OFN_PATHMUSTEXIST, NULL, m_hWnd); dlg ...
- [ATL/WTL]_[中级]_[保存CBitmap到文件-保存屏幕内容到文件]
场景: 1. 在做图片处理时,比方放大后或加特效后须要保存CBitmap(HBITMAP)到文件. 2.截取屏幕内容到文件时. 3.不须要增加第3方库时. 说明: 这段代码部分来自网上.第一次学atl ...
- winform中选择文件获取路径
private void button1_Click(object sender, EventArgs e) { //此时弹出一个可以选择文件的窗体 OpenFileDialog fileDialog ...
- c#选择文件文件夹
C#选择文件 OpenFileDialog fileDialog = new OpenFileDialog(); fileDialog.InitialDirectory = "C://&qu ...
- c#winform选择文件,文件夹,打开指定目录方法
private void btnFile_Click(object sender, EventArgs e) { OpenFileDialog fileDialog = new OpenFileDia ...
- SQL2005:SQL Server 2005还原数据库时出现“不能选择文件或文件组XXX_log用于此操作的解决办法
SQL2005 还原数据库失败,提示如下: SQL Server 2005还原数据库时出现“不能选择文件或文件组XXX_log用于此操作的解决办法 出现错误时操作步骤为:右击数据库--->任务- ...
- VC中打开对话框选择文件和文件夹
1.选择文件 CFileDialogdlg(true, NULL, NULL, NULL, "所有文件 | *.*", this); ...
- 琐碎--选择文件夹(路径)+生产txt格式的log+数据库操作方式
记录日常工作常用到的一些方法: 1 选择文件操作,并将文件的路径记录下来: OpenFileDialog ofd = new OpenFileDialog(); ofd.Multiselect = f ...
- file类型允许的文件格式设置问题,“选择文件”打开缓慢
1,file类型的input对于打开的选择框的属性是由以下两个属性控制的: ①multiple="multiple" :一次可以选择多个文件 ②accept="image ...
- 使用C#选择文件夹、打开文件夹、选择文件
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
随机推荐
- Google Play新功能 让您的应用在Play商店中闪耀
Google Play 商店的商品详情内容是帮助潜在用户了解您应用的功能和价值的最佳方式.您提供的资源和信息 (应用说明.图像和视频) 对用户决定下载应用而言至关重要. 随着越来越多的用户购买移动设备 ...
- 如何让Macbook Touch Bar 一直显示F1~F12
原始状态 修改过程 系统偏好设置 > 键盘 将Touch Bar Shous 修改为F1, F2 ,etc. 结果
- vue横向滑动
代码 <template> <div> <!-- 左侧的滑动模块 --> <div class="scroll-box" :style=& ...
- springboot-项目获取resources下文件
背景: 项目的resources 目录下放置了一份txt文件,需求是想获取到这份文件转成File对象,调用文件上传的接口进行文件上传操作. 实现: 1.使用 ResourceUtils:本地ok,测试 ...
- 如何使用webgl(three.js)实现3D消防、3D建筑消防大楼、消防数字孪生、消防可视化解决方案——第十八课(一)
序: 又是很久没出随笔文章了,一篇文章有时候整理一天,实在是抽不出来时间. 最近在回顾几年前的项目时,发现这个智慧三维消防可视化项目很有回顾价值,索性就拿出来讲讲. 首先,我们要知道消防里的知识,不是 ...
- 【ASP.NET Core】修改Blazor.Server的Hub地址后引发的问题
Blazor Server,即运行在服务器上的 Blazor 应用程序,它的优点是应用程序在首次运行时,客户端不需要下载运行时.但它的代码是在服务器上执行的,然后通过 SignalR 通信来更新客户端 ...
- Javaweb项目和Maven项目的相关导包
Javaweb项目的学习大致需要一下几个导包: 以上几个包需要导入到WEB-INF目录下的lib文件夹里面,主要操作如下: 1.新建一个lib文件夹(在WEB-INF目录下) 2.右键lib文件夹,选 ...
- Goravel ORM 新增模型关联,用 Golang 写关联也可以跟 Laravel 一样简单
关于 Goravel Goravel 是一个功能完备.具有良好扩展能力的 Web 应用程序框架.作为一个起始脚手架帮助 Golang 开发者快速构建自己的应用.框架风格与 Laravel 保持一致,让 ...
- ArcGIS模型构建器ModelBuilder的使用方法
本文介绍在ArcMap软件中,基于模型构建器(ModelBuilder)完成模型建立与使用的具体方法. 首先,在ArcMap软件中打开"ModelBuilder". 建 ...
- 基于Admin.NET框架的前端的一些改进和代码生成处理(1)
Admin.NET 是一套基于Furion/.NET 6实现的通用管理平台,模块插件式开发,框架包含了常规的权限管理.字典等管理模块,以及一些Vue3的Demo案例,框架前后端分离.后端基于基于Fur ...