C++ 自定义客户端应用程序-需要能够控制文档的保存位置

C++ 自定义客户端应用程序-需要能够控制文档的保存位置,c++,visual-c++,ms-word,lotus,C++,Visual C++,Ms Word,Lotus,好吧。我需要一些指导。我为这篇文章的篇幅感到抱歉,但我需要提供一些细节: 我有人对我感兴趣,可以为他们做一个小项目。该应用程序通常是一个相当简单的员工记录保存/文档应用程序,但它大量使用模板化Word和Lotus文档。其思想是您选择员工“事件”,如表扬、晋升、纪律等,然后加载相应的模板文档,然后您从中填写,然后您可以选择一名员工,查看所有“事件”,并查看与每个事件关联的单个文档 因此,应用程序必须知道用户完成后.docs保存在何处 客户机实际上有这个应用程序的v1(它不做任何文件管理或任何事情,

好吧。我需要一些指导。我为这篇文章的篇幅感到抱歉,但我需要提供一些细节:

我有人对我感兴趣,可以为他们做一个小项目。该应用程序通常是一个相当简单的员工记录保存/文档应用程序,但它大量使用模板化Word和Lotus文档。其思想是您选择员工“事件”,如表扬、晋升、纪律等,然后加载相应的模板文档,然后您从中填写,然后您可以选择一名员工,查看所有“事件”,并查看与每个事件关联的单个文档

因此,应用程序必须知道用户完成后.docs保存在何处

客户机实际上有这个应用程序的v1(它不做任何文件管理或任何事情,只是在一个新实例中启动Word/Lotus,其中包含您想要查看的文档,可能是通过system()调用)。我们还没有进入详细的需求阶段,但客户机和我都同意这一点,对用户保存doc的位置的某种控制将是至关重要的,因为否则应用程序为他们提供模板DOC的新副本,它们“保存”在其他地方,并且应用程序指向它提供的空白副本。 很明显,我想不出一种方法来通过仅仅启动一个新的Word实例来实现“另存为”限制/控制。当您选择一个模板文档时,客户端的想法是在应用程序中嵌入Word/Lotus实例,但我对此没有什么保留意见:

  • 我在网上翻了翻,我读到无论从哪个版本的Word借用MSWORD.OLB,最终用户都会需要它
  • 我曾经尝试过嵌入Word文档的MSDN示例,但随着我逐渐习惯,MSDN示例甚至无法编译
  • 即使我知道如何将.doc文件嵌入到他们的应用程序中,我也不知道是否可以控制“另存为…”的使用
  • 这一切还没有触及莲花(!)
所以…本能地,我觉得嵌入的Word/Lotus东西最终需要做的工作比它的价值还要多

所以我有了一些其他的想法

  • 一个是考虑使用officexml(如果有类似于lotus的东西),分别获取用户的“输入”,每次动态生成文档。我对这个想法不是特别兴奋,但我认为它可以工作,只要我使用旧的功能来尝试并保持向后兼容
  • 分别获取用户的“输入”,并生成HTML格式的文档。无聊的。工作,非常跨平台,易于解析和理解,但如果你想通过电子邮件将其发送给某人(谁发送了.html?工作,是的,非常非常规,对普通用户来说,这会让他们放弃),则不太好,如果你需要通过电子邮件将其发送给某人进行修改,则更糟
  • 也许是某种可编辑的PDF?我知道那里有PDF库,我越是沉迷于它,这听起来就越像是最好的选择,尽管我对PDF没有做太多的工作,我不知道它们有多容易嵌入/创建它们时有什么选择。我知道他们可以拯救残疾人,我以前在州税上也有过这样的经历
  • 我需要一些意见。以下是TLDR的问题:

  • 为每个.doc启动一个新的Word实例是否和我感觉的一样糟糕,因为用户可以在任何地方“另存为”文档,然后应用程序指向一个空白文档
  • 在支持多个版本的Word时,尝试支持嵌入式Word是否像我感觉的那样是个大麻烦/工作量太大/可能会导致问题?(转发兼容性以及当前发布的版本?)
  • 对PDF计划有什么想法
  • 还有什么好主意吗

  • Word允许通过其对象模型编程一些“保存”和“另存为”控件。任何用VBA编码并放入Word模板中的子程序都将复制到该模板生成的所有文档中。此外,大多数菜单和功能区命令都可以通过创建一个模块来拦截,该模块包含为拦截的命令命名的子例程。因此,例如,如果模块包含名为FileSaveAs()的子模块,则将执行该子模块中的所有代码,而不是执行标准的File | Save As命令。最后,此代码将替换通过按键、工具栏、菜单或功能区执行的另存为命令

    每当执行“保存”或“另存为”命令时,下面的代码将启动一个对话框到预定路径:

    Sub FileSave()
    ControlSaveLocation
    End Sub
    
    Sub FileSaveAs()
    ControlSaveLocation
    End Sub
    
    Sub ControlSaveLocation()
    Dim Directory As String
    Directory = "C:\Documents\"
    With Application.Dialogs(wdDialogFileSaveAs)
        .Name = Directory
        .Show
    End With
    End Sub
    

    希望这有帮助。

    +1好问题,有很多细节,谢谢!我的直觉反应是,我同意植入是个坏主意。正如您直觉所示,嵌入它不会让您控制它的实现。类似地,您可能会遇到一个问题,您可能会找到一个注册表路径,该路径显示word默认保存到的位置,但我敢打赌Lotus不会使用该路径。即使我可以找到默认保存到的位置,我也无法阻止用户保存到其他位置。如果我不能做到这一点,那么我的应用程序就不知道用户可能在哪里实际保存了文件。我所能做的就是将模板复制到像/doc/lastnamfirstnametemplatename.doc这样的文件中,希望他们只使用Save而不是Save As。。。也许如果我可以直接将文档嵌入GUI并删除菜单栏(ribbon?嵌入的另一个原因让我感到紧张,主要的版本差异…),那么我也许可以让它工作。。但是那可能是很多……的确。一件事;有多少人会使用这个应用程序,你会在用户教育足够的地方进行大量编码吗?这听起来像是一个Microsoft Sharepoint可能成为解决方案的项目。您最好的选择可能是findin