我是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;
}
//---------------------------------------------------------------------------

最佳答案

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

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

Variant仅在包含OLE兼容数据时才与OLE兼容。 UnicodeString是Delphi / C ++ Builder特有的,而OLE是未知的,因此它与OLE不兼容。

Variant分配UnicodeString值时,其VType字段设置为varUString(0x0102),并且其有效负载是指向UnicodeString内部数据的指针,并且其refCnt字段递增(Variant在销毁时将减小refCnt)。

当您将VType -turned- UnicodeString传递给Variant时,OLE抱怨该不受支持的IDispatch::Invoke()值。

要解决此错误,您需要改为将WideString传递给OleFunction()WideStringOLE BSTR string的包装。当为Variant分配一个WideString值时,其VType字段将设置为varOleStr(0x0008,又名OLE中的VT_BSTR),并且其有效载荷是一个适当的BSTR指针,该指针是WideString数据(Variant在销毁时将释放BSTR)。

因此,您需要:


将您的file变量更改为WideString

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

file变量保留为UnicodeString,但是在将其传递给WideString时将其转换为OleFunction()

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

关于c++ - Borland C++-使用OLE通过Word打开RTF文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48936211/

10-15 03:11