setauthor.cpp
/*****************************************************************************
*
* File: setauthor.cpp
*
* Description:
* This sample is a simple console application that might be used
* as a starting-point for an application that uses the Packaging API. This
* sample demonstrates the modification of an existing package, a word
* document.
*
* For the sake of simplicity, the sample does not update the last
* modified date, though this would be appropriate, nor does it modify history
* or other document parts and properties that may contain personally
* identifiable information. This sample is not sufficient to remove all
* authorship information from a document.
*
* ------------------------------------
*
* This file is part of the Microsoft Windows SDK Code Samples.
*
* Copyright (C) Microsoft Corporation. All rights reserved.
*
* This source code is intended only as a supplement to Microsoft
* Development Tools and/or on-line documentation. See these other
* materials for detailed information regarding Microsoft code samples.
*
* THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
* KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
* PARTICULAR PURPOSE.
****************************************************************************/
#include "stdio.h"
#include "windows.h"
#include "shlobj.h"
#include "msopc.h"
#include "msxml6.h"
#include "opclib.h"
#include "wordlib.h"
//////////////////////////////////////////////////////////////////////////////
// Description:
// Show the first few paragraphs & author information from the specified
// Office Open XML word processing document and, if requested, update the
// author information & save to the specified output file.
//////////////////////////////////////////////////////////////////////////////
HRESULT
SetAuthorMain(
LPCWSTR filename, // Name of file to read.
LPCWSTR newAuthor, // Optional. New author name. If specified, targetFile must also be specified.
LPCWSTR targetFile // Optional. Name of output file. If specified, newAuthor must also be
// specified.
)
{
IOpcPackage * package = NULL;
// A representation of the part containing word processing document markup.
IOpcPart * documentPart = NULL;
IOpcFactory * factory = NULL;
// Create a new factory.
HRESULT hr = CoCreateInstance(
__uuidof(OpcFactory),
NULL,
CLSCTX_INPROC_SERVER,
__uuidof(IOpcFactory),
(LPVOID*)&factory
);
if (SUCCEEDED(hr))
{
// Load the package file.
hr = opclib::LoadPackage(factory, filename, &package);
}
if (SUCCEEDED(hr))
{
// Locate the Main Document part that contains word processing markup.
hr = wordlib::FindDocumentInPackage(package, &documentPart);
}
// Print a preview of document contents and properties.
if (SUCCEEDED(hr))
{
DWORD maxParagraphCount = 3;
wprintf(L"\n----------------- preview of contents ----------------\n");
hr = wordlib::PrintBeginningParagraphs(documentPart, maxParagraphCount);
}
if (SUCCEEDED(hr))
{
wprintf(L"------------------- core properties ------------------\n");
hr = opclib::PrintCoreProperties(package);
wprintf(L"------------------------------------------------------\n\n");
}
// If newAuthor and targetFile are specified, modify the "author" &
// "last modified by" properties to the new author and save the altered
// package by writing the package to disk.
if (SUCCEEDED(hr) && newAuthor && targetFile)
{
// New IOpcPackage interface pointer, for the package to create.
IOpcPackage * newPackage = NULL;
// Populate new package with original package data except "author" and
// "last modified by" properties will reflect the new author.
hr = opclib::SetAuthorAndModifiedBy(package, newAuthor);
if (SUCCEEDED(hr))
{
// Save the package as a new file. This is done because data from the
// original package may need to be read while the changes are saved.
hr = opclib::SavePackage(factory, package, targetFile);
}
// The following code loads and displays the new package file to demonstrate
// that the property changes have been applied.
if (SUCCEEDED(hr))
{
wprintf(L"\n--- New author information saved to '%s' ---\n\n", targetFile);
hr = opclib::LoadPackage(factory, targetFile, &newPackage);
}
if (SUCCEEDED(hr))
{
hr = opclib::PrintCoreProperties(newPackage);
}
// Release resources
if (newPackage)
{
newPackage->Release();
newPackage = NULL;
}
}
// Release resources
if (package)
{
package->Release();
package = NULL;
}
if (documentPart)
{
documentPart->Release();
documentPart = NULL;
}
if (factory)
{
factory->Release();
factory = NULL;
}
return hr;
}
// Entry point for the sample
int
wmain(
int argc,
wchar_t* argv[]
)
{
if (argc != 2 && argc != 4)
{
wprintf(L"Usage: Setauthor <filename> [<new author> <targetfile>]\n");
exit(0);
}
// Original file name.
LPWSTR pFileName = argv[1];
// New author name.
LPWSTR pNewAuthor = NULL;
// New author and other, original file data saved to new package file.
LPWSTR pTargetFile = NULL;
HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);
if (SUCCEEDED(hr))
{
if (argc == 4)
{
pNewAuthor = argv[2];
pTargetFile = argv[3];
}
// Display document content and properties. If requested, change
// properties and save changes to document as a new file.
hr = SetAuthorMain(
pFileName,
pNewAuthor,
pTargetFile
);
CoUninitialize();
}
if (FAILED(hr))
{
wprintf(L"Error: 0x%.8X\n", hr);
}
return SUCCEEDED(hr) ? 0 : 1;
}
Related topics