我的目的:
    很简单就是清除word历史记录!
打开word,我们可以在工具->选项->常规->列出最近所用的文件 来实现我想要的功能!
1、word的_Application提供了一个方法可以设置是否显示最近使用的文件。
2、word也给我们提供RecentFiles接口,但是里面没有什么有用的。
3、word提供了Option接口,但是死活也找不到和word页面对应的方法。没辙,我还是瞄向了第1种方法,但是奇怪的问题就出来了!
下面是我的简单代码:
// OfficeClear.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"#import "C:\Program Files\\Common Files\\Microsoft Shared\\Office11\\MSO.DLL" rename_namespace("Office")
using namespace Office;#import "C:\\Program Files\\Common Files\\Microsoft Shared\\VBA\\VBA6\\VBE6EXT.olb" rename_namespace("VBE6")
using namespace VBE6;#import "C:\Program Files\Microsoft Office\Office11\MSWORD.olb" rename("ExitWindows","ExitWindowsEx"),named_guids,rename_namespace("MSWord")
using namespace MSWord;int _tmain(int argc, _TCHAR* argv[])
{
//Initialize the COM libraries
::CoInitialize(NULL); // Create an instance of the Word application and obtain the 
// pointer to the application's IDispatch interface.
CLSID clsid;
CLSIDFromProgID(L"Word.Application", &clsid);   IUnknown* pUnk;
HRESULT hr = ::CoCreateInstance( clsid, NULL, CLSCTX_SERVER,
IID_IUnknown, (void**) &pUnk);

MSWord::_ApplicationPtr pApplication = pUnk;
VARIANT_BOOL bRecentFiles = VARIANT_FALSE;
if (SUCCEEDED(pApplication->get_DisplayRecentFiles(&bRecentFiles)))
{
std::cout<<bRecentFiles<<std::endl;
}

hr = pApplication->put_DisplayRecentFiles(VARIANT_FALSE);     //设置不显示历史记录
if (SUCCEEDED(hr))
{
std::cout<<"Succeeded!"<<std::endl;
} /*MSWord::OptionsPtr pOption = NULL;
if (SUCCEEDED(pApplication->get_Options(&pOption)))     //本想的到Option看看没有办法,结果没找到有用的方没!
{
std::cout<<"Succeeded get options interface!"<<std::endl;
}*/ MSWord::RecentFilesPtr pRecnts = pApplication->GetRecentFiles();
if (pRecnts != NULL)
{
RecentFilePtr pRecntFile = NULL;
int count = pRecnts->GetCount();
for (int i =0; i<count; i++)
{
pRecntFile = pRecnts->Item(i);
if (pRecntFile != NULL)
{
std::cout<<(char*)pRecntFile->GetName()<<std::endl;
}
}
}
pRecnts = NULL;

        hr = pApplication->put_Visible(VARIANT_TRUE);  //当我在这个打开word看时确实看不到历史记录,看来我只是把该word的历史记录不显示,没有真正达到清除的目的。 if (SUCCEEDED(pApplication->get_DisplayRecentFiles(&bRecentFiles)))
{
std::cout<<bRecentFiles<<std::endl;
} ::CoUninitialize(); return 0;
}MS把它封到了那个接口了,郁闷找不到,大家一块帮忙找找!人多力量大!哈哈!
好久没给大家放分了!hoho!

解决方案 »

  1.   

    Application 有一个属性:Property RecentFiles As RecentFiles,从RecentFiles(Class RecentFiles)可以取出每一个RecentFile(Class RecentFile),RecentFile有一个方法是Delete()。你看看这样好不好用
      

  2.   

    to xiaoyuzi(小鱼子)
      谢谢这位兄弟!问题是,得到 int count = pRecnts->GetCount(); count是0,不管我把 pApplication->put_DisplayRecentFiles如何设置都是0!
    明明是有记录的!
      

  3.   

    我用的office10,能取出来count阿
      

  4.   

    王老大,我用vc6测试了,好用。注意item的index是从1开始的。
    #import "C:\Program Files\\Common Files\\Microsoft Shared\\Office10\\MSO.DLL" rename_namespace("Office")
    using namespace Office;#import "C:\\Program Files\\Common Files\\Microsoft Shared\\VBA\\VBA6\\VBE6EXT.olb" rename_namespace("VBE6")
    using namespace VBE6;#import "C:\Program Files\Microsoft Office\Office10\MSWORD.olb" rename("ExitWindows","ExitWindowsEx"),named_guids,rename_namespace("MSWord")
    using namespace MSWord;......void CMainFrame::OnViewWord() 
    {
    //Initialize the COM libraries
    ::CoInitialize(NULL);

    // Create an instance of the Word application and obtain the
    // pointer to the application's IDispatch interface.
    CLSID clsid;
    CLSIDFromProgID(L"Word.Application", &clsid);

    IUnknown* pUnk;
    HRESULT hr = ::CoCreateInstance( clsid, NULL, CLSCTX_SERVER,
    IID_IUnknown, (void**) &pUnk);
    if( FAILED( hr ) )
    {
    AfxMessageBox( _T("Failed to create instance") );
    return;
    } MSWord::_ApplicationPtr pApplication = pUnk;
    MSWord::RecentFilesPtr pRecnts = pApplication->GetRecentFiles();
    if( pRecnts != NULL )
    {
    RecentFilePtr pRecntFile = NULL;

    if( pRecnts != NULL )
    {
    while( pRecnts->Count > 0 )
    {
    pRecntFile = pRecnts->Item(1);
    if( pRecntFile )
    {
    hr = pRecntFile->Delete();
    pRecntFile = NULL;
    }
    }
    }
    }
    pRecnts = NULL;

    ::CoUninitialize();
    }
      

  5.   

    我再看看,我的是2003,难道和版本还有关系!
    还有兄弟记得我!哈哈!感动ing!
      

  6.   

    成功!
     hr = pApplication->put_DisplayRecentFiles(VARIANT_FALSE); //问题在这里,疏忽了!
    if (SUCCEEDED(hr))
    {
    std::cout<<"Succeeded!"<<std::endl;
    }不过这种办法还是没法清理,如果用户没有打开word我们是可以清理的,只要用户在清理的时候已经打开了word我们仅仅清理了当前程序中的记录!没有同步,和我用设置hr = pApplication->put_DisplayRecentFiles(VARIANT_FALSE);一个效果!谢谢这问兄弟!
      

  7.   

    那就判断是否有word打开,给一个对话框提示用户关闭保存当前word文档,并且给他两个选择取消或者继续执行,如果选择继续执行还没有关闭word文档,继续show这个对话框。应该是清理了所有的word程序中的recentfile记录了,只不过当前的文档保存了一份recent files的copy,也就是你的程序没有更新当前打开文档的菜单显示内容而已。而且每次打开一个新文档,他都会把当前文件当成一个recent file。
      

  8.   

    word中的 --- 打开word,我们可以在工具->选项->常规->列出最近所用的文件 来实现我想要的功能!
    就可以同步清理所有打开的word的历史记里,应该是有办法的!
    还需要继续研究!
      

  9.   

    问题解决!哈哈!
    不需要创建pApplication,通过ole的一个api直接获取当前活动的对象GetActiveObject(...)!
    还需要继续研究!如何让我的清理适合不同版本的office?
    兄弟们都不来帮忙!来up以下也行!