GetSaveFileName 操作函数笔记
来源:互联网 发布:云计算上市公司龙头 编辑:程序博客网 时间:2024/06/08 16:26
GetSaveFileName 操作函数笔记
【作者】:Ackarlix
在工作中,实现控件对IE端打开的Word文档另存为的时候,我陷入了困惑。如何获取到当前的文档,假如打开多个文档如何判断要保存的是哪一篇文档,文档保存后的格式是怎样的,是一个新的普通文档还是一个与IE端打开的文档一样格式的文档?这些都是我需要好好考虑的问题!
首先便是怎样将文档保存到本地!我查找了网上许多论坛社区,都没有找到有价值的内容。所以干脆自己动手,编写一个直接调用Word文档另存为按钮的代码,来实现以上的功能。
要实现另存为功能,那肯定是离不开另存为对话框。通过这个对话框可以将要保存文档的路径获取出来,提供给SaveAs函数,从而实现将目标保存在选定的路径下。所以我这里采用GetSaveFileName函数来实现!
调用GetSaveFileName函数显示 另存为 对话框时,对话框本身可以返回有效或者无效的文件夹,也就是当你不选择任何文件夹时,默认是当前打开的路径,当您单击 保存 。 选中了无效的文件夹时, GetSaveFileName 将使用当前工作目录,当返回完整路径和文件名。 无效的文件夹示例包括网上邻居和网络服务器名。
以下是一个调用例子:(来源微软的MSDN)
- /*使用 GetSaveFileName 的应用程序可以验证是否目标文件夹是使用处理 CDN_FILEOK 通知的挂钩过程的文件系统的一部分。
- 在处理 CDN_FILEOK 通知,挂钩过程获得的指针在选定文件夹的 ITEMIDLIST (PIDL) 发送 CDM_GETFOLDERIDLIST 消息对话框。 返回的 PIDL 然后传递给 SHGetFileInfo 请求文件夹的属性。 如果该文件夹具有 SFGAO_FILESYSTEM 属性它将是文件系统的一部分,可以作为目标文件夹。 */
- //
- // SaveDialog.cpp
- //
- #include <windows.h>
- #include <commdlg.h>
- #include <shellapi.h>
- #include <shlobj.h>
- UINT_PTR WINAPI SaveAs_OnFileOK (HWND hWnd, OFNOTIFY *pofn)
- {
- LPMALLOC pMalloc = NULL;
- LPITEMIDLIST pidlFolder = NULL;
- SHFILEINFO shfi = {0};
- INT cbPidl = 0;
- UINT_PTR nReturn = 0;
- UINT_PTR nResult = 0;
- //
- // Get a pointer to the shell's IMalloc interface
- //
- if (FAILED(SHGetMalloc(&pMalloc)))
- goto Cleanup;
- //
- // Get the size of the pidl
- //
- cbPidl = SendMessage (pofn->hdr.hwndFrom, CDM_GETFOLDERIDLIST, 0, 0);
- if (cbPidl == -1)
- goto Cleanup;
- //
- // Allocate memory for the pidl
- //
- pidlFolder = (LPITEMIDLIST) pMalloc->Alloc (cbPidl);
- if (pidlFolder == NULL)
- goto Cleanup;
- //
- // Get the pidl
- //
- cbPidl = SendMessage (pofn->hdr.hwndFrom, CDM_GETFOLDERIDLIST,
- (WPARAM) cbPidl, (LPARAM) pidlFolder);
- if (cbPidl == -1)
- goto Cleanup;
- //
- // Determine if the folder has the SFGAO_FILESYSTEM attribute
- //
- if (!SHGetFileInfo ((LPCTSTR) pidlFolder, 0, &shfi,
- sizeof(SHFILEINFO),
- SHGFI_PIDL | SHGFI_ATTRIBUTES))
- goto Cleanup;
- if (!(shfi.dwAttributes & SFGAO_FILESYSTEM))
- {
- //
- // Display an error and prevent the dialog from closing by
- // returning 1 from the hook proc and by setting
- // DWL_MSGRESULT to 1.
- //
- MessageBox (hWnd,
- TEXT("You cannot save in the folder you specified. Please choose another location."),
- TEXT("Save As"), MB_OK | MB_ICONINFORMATION);
- nResult = nReturn = 1;
- }
- Cleanup:
- if (pMalloc)
- {
- if (pidlFolder)
- pMalloc->Free ((LPVOID)pidlFolder);
- pMalloc->Release();
- }
- SetWindowLong (hWnd, DWL_MSGRESULT, nResult);
- return nReturn;
- }
- UINT_PTR WINAPI SaveAs_OnNotify (HWND hWnd, NMHDR *phdr)
- {
- switch (phdr->code)
- {
- case CDN_FILEOK:
- return SaveAs_OnFileOK (hWnd, (OFNOTIFY *) phdr);
- }
- return 0;
- }
- UINT_PTR CALLBACK SaveAsHookProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
- {
- switch (uMsg)
- {
- case WM_NOTIFY:
- return SaveAs_OnNotify (hWnd, (NMHDR *)lParam);
- }
- return 0;
- }
- INT WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
- LPSTR lpCmdLine, INT nShowCmd)
- {
- TCHAR szFilename[MAX_PATH] = TEXT("");
- BOOL bResult = FALSE;
- DWORD dwError = NOERROR;
- OPENFILENAME ofn = {0};
- ofn.lStructSize = sizeof (OPENFILENAME);
- ofn.lpstrFilter = TEXT("All Files/0*.*/0/0");
- ofn.lpstrFile = szFilename;
- ofn.nMaxFile = MAX_PATH;
- ofn.Flags = OFN_EXPLORER |
- OFN_ENABLEHOOK |
- OFN_HIDEREADONLY |
- OFN_NOCHANGEDIR |
- OFN_PATHMUSTEXIST;
- ofn.lpfnHook = (LPOFNHOOKPROC) SaveAsHookProc;
- bResult = GetSaveFileName (&ofn);
- if (bResult == FALSE)
- {
- dwError = CommDlgExtendedError ();
- return dwError;
- }
- MessageBox (NULL, szFilename, TEXT("SaveAs returned..."), MB_OK);
- return 0;
- }
- GetSaveFileName 操作函数笔记
- GetSaveFileName函数
- GetSaveFileName函数
- getSaveFileName
- Windows API一日一练(93)GetSaveFileName函数
- 环境变量操作函数笔记
- 使用GetOpenFileName和GetSaveFileName函数会改变当前目录的问题
- 子类化GetOpenFileName/GetSaveFileName, 以及钩子函数OFNHookProc的使用的简要说明
- QFileDialog::getSaveFileName 的使用
- 通用对话框GetOpenFileName&&GetSaveFileName
- WinAPI:GetOpenFileName、GetSaveFileName、OFNHookProc
- 资源地址;浏览和打开文件;GetOpenFileName;GetSaveFileName;OPENFILENAME;PtrToStringChars;.NET类库的打开文件夹操作
- 数据操作相关函数笔记
- MFC通用对话框之GetSaveFileName
- Getsavefilename()样例代码片段
- 学习笔记之资源操作相关函数
- 文件操作函数fopen()使用笔记
- C文件IO操作函数笔记。
- 虚拟键码对照表
- 通过web service的方式上传附件和下载附件,以及内存溢出问题
- 嵌入式开发基础(3)
- SCEA_Messaging
- Axure RP Pro - 相关问题 - 自定义样式不能应用于翻转样式
- GetSaveFileName 操作函数笔记
- 如何使Layouts里的页面应用站点母板页
- Struts2的零配置
- 两种统计当前在线人数的方法
- encodeURI与encodeURIComponent方法的区别
- 使用管道数据流传送数据
- CEdit改变字体大小的方法
- java软件开发工程师
- vc 知识