Borland C ++ - 使用OLE使用Word打开RTF文件

时间:2018-02-22 20:00:35

标签: c++ c++builder vcl ole

我是Embarcadero C ++ Builder,VCL和OLE的新成员。我尝试做的是使用OLE打开RTF文件,但我得到了一个例外:

  

错误的变量类型

执行此行时:

wordDoc = wordDoc.OleFunction( "open", file );

我不确定如何解决这个问题。这是我的代码:

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include <tchar.h>

#include <System.hpp>
#include <oleauto.h>
#include <sysvari.h>
//---------------------------------------------------------------------------
int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
{
    try
    {
        Application->Initialize();

        UnicodeString file( "C:\\TempFiles\\Test.rtf" );

        Variant wordApp = Variant::CreateObject( "word.application" );
        wordApp.OlePropertySet( "Visible", Variant( false ) );

        Variant wordDoc = wordApp.OlePropertyGet( "documents" );
        wordDoc = wordDoc.OleFunction( "open", file );

        //Application->MainFormOnTaskBar = true;
        //Application->Run();
    }
    catch (Exception &exception)
    {
        Application->ShowException(&exception);
    }
    catch (...)
    {
        try
        {
            throw Exception("");
        }
        catch (Exception &exception)
        {
            Application->ShowException(&exception);
        }
    }
    return 0;
}
//---------------------------------------------------------------------------

1 个答案:

答案 0 :(得分:1)

问题是,在调用Word UnicodeString函数时,您在Variant::OleFunction()的第二个参数中传递了Open()

在内部,OleFunction()将输入参数转换为Variant值(而不是OleVariant),然后将它们按原样传递给IDispatch::Invoke()

Variant仅在与OLE兼容的数据时才与OLE兼容。 UnicodeString特定于Delphi / C ++ Builder并且对OLE不了解,因此它不兼容OLE。

当为Variant分配UnicodeString值时,其VType字段设置为varUString(0x0102),其有效负载是指向{{1}的指针} UnicodeString字段的内部数据递增(refCnt会在销毁时减少Variant

当您将refCnt - 已转为 - VType传递给UnicodeString时,OLE会抱怨该值不受支持Variant

要修正错误,您需要将IDispatch::Invoke()传递给WideStringOleFunction()OLE BSTR string的包装器。如果为WideString分配了Variant值,则其WideString字段设置为VType(在OLE中为0x0008,又称varOleStr),其有效负载为正确的VT_BSTR指针,它是BSTR数据的副本(WideString会在销毁时释放Variant。)

所以,你需要:

  • 将您的BSTR变量更改为file

    WideString
  • WideString file( L"C:\\TempFiles\\Test.rtf" ); 变量保留为file,但在将其传递给UnicodeString时将其转换为WideString

    OleFunction()