C++ 博尔兰C++;-使用OLE使用Word打开RTF文件

C++ 博尔兰C++;-使用OLE使用Word打开RTF文件,c++,c++builder,vcl,ole,C++,C++builder,Vcl,Ole,我是Embarcadero C++Builder、VCL和OLE的新手。我尝试使用OLE打开RTF文件,但遇到了一个异常: 错误的变量类型 执行此行时: wordDoc = wordDoc.OleFunction( "open", file ); 我不知道如何解决这个问题。这是我的密码: //--------------------------------------------------------------------------- #include <vcl.h> #p

我是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;
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
#包括
#布拉格语hdrstop
#包括
#包括
#包括
#包括
//---------------------------------------------------------------------------
int WINAPI_tWinMain(HINSTANCE,HINSTANCE,LPTSTR,int)
{
尝试
{
应用程序->初始化();
销毁文件(“C:\\TempFiles\\Test.rtf”);
Variant wordApp=Variant::CreateObject(“word.application”);
OlePropertySet(“可见”,变体(假));
变体wordDoc=wordApp.OlePropertyGet(“文件”);
wordDoc=wordDoc.OleFunction(“打开”,文件);
//Application->MainFormOnTaskBar=true;
//应用程序->运行();
}
捕获(异常和异常)
{
应用程序->显示异常(&exception);
}
捕获(…)
{
尝试
{
抛出异常(“”);
}
捕获(异常和异常)
{
应用程序->显示异常(&exception);
}
}
返回0;
}
//---------------------------------------------------------------------------

问题在于,调用Word函数时,在的第二个参数中传递了一个

在内部,
OleFunction()
将输入参数转换为值(而不是),然后按原样传递给

Variant
仅当它保存与OLE兼容的数据时才与OLE兼容
UnicodeString
特定于Delphi/C++Builder,OLE不知道,因此它与OLE不兼容

变量
分配了
UnicodeString
值时,其
VType
字段设置为
varUString
(0x0102),其有效负载是指向
UnicodeString
内部数据的指针,其
refCnt
字段递增(销毁时,
变量
将减少
refCnt

当您的
UnicodeString
-tured-
变量被传递到
IDispatch::Invoke()
时,OLE正在抱怨不支持的
VType

要修复此错误,您需要将
WideString
传递给
OleFunction()
WideString
是的包装。当
变量
分配了
WideString
值时,其
VType
字段设置为
varOleStr
(0x0008,在OLE中也称为
VT\u BSTR
),其有效负载是一个适当的
BSTR
指针,它是
WideString
数据的副本(
变量
将在销毁时释放
BSTR

因此,您需要:

  • 文件
    变量更改为
    宽字符串

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


非常感谢您的回答和详细解释。
wordDoc = wordDoc.OleFunction( L"open", WideString(file) );