我是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;
}
//---------------------------------------------------------------------------
答案 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()
传递给WideString
。 OleFunction()
是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()