Solved

Adding Bookmark in MS Word OLE

Posted on 2010-11-16
5
1,872 Views
Last Modified: 2012-05-10
I'm trying to add a bookmark into an open MS Word file in code. I'm using C++ Builder 5 (I also have C++ Builder 2009). This should work via the Word.Documents.Document.BookMarks.Add( Name , Range) function but I'm having problems. Wondering if anyone can point me in the direction where I'm going wrong. Here's my code:

// ========================================================================
Variant vWordApplication;

  try
  {
    vWordApplication = Variant::GetActiveObject("word.application");
  }
  catch(...)
  {
    try
    {
      vWordApplication = Variant::CreateObject("word.application");
    }
    catch(...)
    {
      // if we got here, we were unable to create new Word object
      return;
    }
  }

 // get the documents collection
Variant vDocuments = vWordApplication.OlePropertyGet("Documents");

 // open the document in question
 Variant vDocument = vDocuments.OleFunction("Open", FileNameString);

 // make Word visible to the user
 vWordApplication.OlePropertySet("Visible", (Variant)True);

 // get a Range object of characters 1 through 10
 Variant vTenCharRange = vDocument.OleFunction("Range", (Variant)1, (Variant)10);

 // get the Document.BookMarks property collection
 Variant vBookMarks = vDocument.OlePropertyGet("BookMarks");

 // now - add a new bookmark in! Nothing seems to work.

 // NOT WORKING
vBookMarks.OleFunction("Add", (Variant)"TestName");

// ALSO NOT WORKING
vBookMarks.OleFunction("Add", (Variant)"TestName", vTenCharRange);

// ======================================================================
0
Comment
Question by:DPINCGK
  • 4
5 Comments
 

Author Comment

by:DPINCGK
ID: 34152604
By the way, one additional comment, the program throws an EOleSysError exception. Value  0x80020009,

which takes me to line 1852 of sysvari.h

  template <class P1, class P2>
  Variant Variant::OleFunction(const String& name, P1 p1, P2 p2)
  {
    TAutoArgs<2> args;
    args[1] = p1;  args[2] = p2;
    return OleFunction(name, static_cast<TAutoArgsBase*>(&args));     // this line!!
  }

I'm sorry to admit but I'm not entirely certain how to solve this one. Any help would be greatly appreciated :).
0
 
LVL 76

Expert Comment

by:GrahamSkan
ID: 34153741
Not used C++ or seen Builder, but looking at the sample here that adds a table:

http://bcbjournal.org/articles/vol3/9902/Word_97_OLE_Automation.htm?PHPSESSID=ac4e5a061dd38996dceb88c55b308f21 ,

I would suggest:

vBookMarks.OleProcedure("Add", (Variant)"TestName", vTenCharRange);
0
 

Author Comment

by:DPINCGK
ID: 34156686
Thank you for the suggestion Graham, I tried OleProcedure but it creates the same result - throws an exception.
0
 

Accepted Solution

by:
DPINCGK earned 0 total points
ID: 34158552
I found the answer.

// OLD way - DOES NOT WORK
vBookmarks.OleProcedure("Add", (Variant)asBookMk, vRangeTest);

// NEW way - WORKS (must be done using automation interface classes from SysVari.h, which
// include class Procedure, Function, PropertyGet, PropertySet, and the function ::Exec()

Variant vRangeTest  = (get or define a range here)

Procedure BookMarkAddProc("Add");
BookMarkAddProc << asBookMk;
BookMarkAddProc << vRangeTest;
vBookmarks.Exec(BookMarkAddProc);
0
 

Author Closing Comment

by:DPINCGK
ID: 34186427
I found the solution myself - hope this helps other people if they have the same issue with Borland C++ Builder.
0

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Entity Framework is a powerful tool to help you interact with the DataBase but still doesn't help much when we have a Stored Procedure that returns more than one resultset. The solution takes some of out-of-the-box thinking; read on!
Calculating holidays and working days is a function that is often needed yet it is not one found within the Framework. This article presents one approach to building a working-day calculator for use in .NET.
The goal of this video is to provide viewers with basic examples to understand and use switch statements in the C programming language.
This video shows where to find templates, what they are used for, and how to create and save a custom template using Microsoft Word.

930 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

11 Experts available now in Live!

Get 1:1 Help Now