C++ 博尔兰C++;-使用OLE使用Word打开RTF文件
我是Embarcadero C++Builder、VCL和OLE的新手。我尝试使用OLE打开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
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) );