please help me. I'm stuck.
golnar wrote:
Hi everybody,
I have a source code that stuart sent me and I will include it
afterwards. But the problem is I need to save the word document in my
own favorable path not in the path which my user chooses. Is there
anybody who can help me?
// The code is being run in visual studio 6 vc++
source code:
//#include "stdafx.h"
#include <afx.h>
#include "atlbase.h"
CComModule _Module;
#include "atlcom.h"
#include "atlimpl.cpp"
#include "atlctl.h"
#include "atlctl.cpp"
#include "comdef.h"
#include <fstream.h>
// In order to be able to include the type libraries from MS Word we
have
// to undefine the ExitWindows macro from winuser.h since this macro
will
// clash with the ExitWindows method of the Tasks interface.
// See Q148223 at MSDN.
#undef ExitWindows
#import "C:\Program Files\Common Files\Microsoft
Shared\OFFICE10\MSO.DLL"
#import "C:\Program Files\Common Files\Microsoft
Shared\VBA\VBA6\VBE6EXT.OLB"
#import "C:\Program Files\Microsoft Office\Office\msword9.olb"
#import "C:\Program Files\Microsoft Office\Office\graph9.olb"
int main(int argc, char* argv[])
{
// Since we want to use COM objects, we must initialize the COM
//sub-system.
VERIFY (SUCCEEDED (CoInitialize (NULL)));
// Retrieve the CLSID of the MS Word application.
CLSID clsidWordApplication;
HRESULT hr = CLSIDFromProgID (L"Word.Application",
&clsidWordApplication);
_ASSERT(SUCCEEDED(hr));
if (!SUCCEEDED(hr))
return 0;
// We introduce this code block, so that all smart pointers get
//destroyed before
// this block is left. If we didn't do this, some of our smart
//pointers would still
// be alive when we call CoUnitialize at the end of main, which would
//cause memory
// access violations.
{
Word::_ApplicationPtr spWordApplication;
try
{
// Create the Word application object. If Word isn't running
//already, this
// will launch Word as background process.
VERIFY (SUCCEEDED (spWordApplication.CreateInstance
(clsidWordApplication, NULL, CLSCTX_SERVER)));
if (!(bool) spWordApplication)
throw _com_error (E_FAIL);
// Retrieve the documents collection from the Word application.
//This collection contains
// all documents that are open at the moment. We need this
//collection in order to
// add a new document to it (this means we create a new
//document).
Word::DocumentsPtr spDocuments =
spWordApplication->GetDocuments();
if (!(bool) spDocuments)
throw _com_error (E_FAIL);
Word::_DocumentPtr spNewDocument = spDocuments->Add ();
if (!(bool) spNewDocument)
throw _com_error (E_FAIL);
// We add a new chart to the document. To be able to do this we
//must retrieve the
// collection of so called 'inline shapes'. Inline shapes are
//basically such things
// like pictures, charts, or any other linked objects.
Word::InlineShapesPtr spInlineShapes =
spNewDocument->GetInlineShapes ();
if (!(bool) spInlineShapes)
throw _com_error (E_FAIL);
// Retrieve the CLSID of the MS Chart object.
CComBSTR strClassNameChart (L"MSGraph.Chart");
VARIANT Temp;
Temp.vt = VT_BSTR;
Temp.bstrVal = strClassNameChart.Detach ();
VARIANT ChartObjectShouldBeLinkedToAnExternalFileVARIANT;
ChartObjectShouldBeLinkedToAnExternalFileVARIANT.vt = VT_BOOL;
ChartObjectShouldBeLinkedToAnExternalFileVARIANT.boolVal =
VARIANT_FALSE;
Word::InlineShapePtr spNewInlineShape =
spInlineShapes->AddOLEObject (&Temp, &vtMissing,
&ChartObjectShouldBeLinkedToAnExternalFileVARIANT);
// We want to access the new inline shape via the correct
//interface.
Graph::ChartPtr spChart = spNewInlineShape->OLEFormat->Object;
if (!(bool) spChart)
throw _com_error (E_FAIL);
// Configure the chart.
spChart->ChartType = Graph::xl3DColumnClustered;
spChart->HasLegend = VARIANT_TRUE;
spChart->HasTitle = VARIANT_TRUE;
spChart->ChartTitle->Text = _bstr_t (L"translator's sensitivity
to sentence lengthes");
spChart->Width = 600.00;
// spChart->AutoScaling= VARIANT_TRUE;
// Create a data sheet that contains the data that will be shown
//in the chart.
// This is the place where you have to provide your own data. For
//this example I
// will use random generated data to fill the data sheet.
Graph::DataSheetPtr spDataSheet =
spChart->Application->DataSheet;
if (!(bool) spDataSheet)
throw _com_error (E_FAIL);
spDataSheet->Cells->Clear ();
// Set the column and row names.
spDataSheet->Cells->PutItem (_variant_t ((BYTE)2), _variant_t
((BYTE)1), _variant_t ("translation NIST score"));
spDataSheet->Cells->PutItem (_variant_t ((BYTE)1), _variant_t
((BYTE)2), _variant_t ("0-20"));
spDataSheet->Cells->PutItem (_variant_t ((BYTE)1), _variant_t
((BYTE)3), _variant_t ("20-25"));
spDataSheet->Cells->PutItem (_variant_t ((BYTE)1), _variant_t
((BYTE)4), _variant_t ("25-30"));
spDataSheet->Cells->PutItem (_variant_t ((BYTE)1), _variant_t
((BYTE)5), _variant_t ("30-35"));
spDataSheet->Cells->PutItem (_variant_t ((BYTE)1), _variant_t
((BYTE)6), _variant_t ("35+"));
// Fill the cells with some data from file.
int x[100];
ifstream inf("c:\\my.txt");
for (int i=0; i<5; i++ )
inf>>x[i];
spDataSheet->Cells->PutItem (_variant_t ((BYTE)2), _variant_t
((BYTE)2), _variant_t ((long)x[0]));
spDataSheet->Cells->PutItem (_variant_t ((BYTE)2), _variant_t
((BYTE)3), _variant_t ((long)x[1]));
spDataSheet->Cells->PutItem (_variant_t ((BYTE)2), _variant_t
((BYTE)4), _variant_t ((long)x[2]));
spDataSheet->Cells->PutItem (_variant_t ((BYTE)2), _variant_t
((BYTE)5), _variant_t ((long)x[3]));
spDataSheet->Cells->PutItem (_variant_t ((BYTE)2), _variant_t
((BYTE)6), _variant_t ((long)x[4]));
spChart->Application->Update ();
spChart->Application->Quit ();
spNewDocument->Save ();
---------------------------------------------------
spWordApplication->Quit ();
}
catch (...)
{
// Close the applications, if they are running.
if ((bool) spWordApplication)
spWordApplication->Quit ();
}
}
CoUninitialize();
printf ("Finished!\n");
return 0;
}
my problem is in "spNewDocument->Save()" which opens a savefile dialog
and save the spNewDocument in user-chosen path and with a name which
user gives it.
call SaveAs instead of Save.