We help IT Professionals succeed at work.

Adding Bookmark in MS Word OLE

DPINCGK
DPINCGK asked
on
2,430 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);

// ======================================================================
Comment
Watch Question

Author

Commented:
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 :).
GrahamSkanRetired
CERTIFIED EXPERT
Top Expert 2012

Commented:
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);

Author

Commented:
Thank you for the suggestion Graham, I tried OleProcedure but it creates the same result - throws an exception.
Commented:
This one is on us!
(Get your first solution completely free - no credit card required)
UNLOCK SOLUTION

Author

Commented:
I found the solution myself - hope this helps other people if they have the same issue with Borland C++ Builder.
Unlock the solution to this question.
Join our community and discover your potential

Experts Exchange is the only place where you can interact directly with leading experts in the technology field. Become a member today and access the collective knowledge of thousands of technology experts.

*This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

OR

Please enter a first name

Please enter a last name

8+ characters (letters, numbers, and a symbol)

By clicking, you agree to the Terms of Use and Privacy Policy.