Borland C++ - 使用OLE使用Word打开RTF文件
Borland C++ - using OLE to open RTF file using Word
我是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 的Open()
函数时在Variant::OleFunction()
的第二个参数中传递UnicodeString
。
在内部,OleFunction()
将输入参数转换为Variant
值(而不是OleVariant
),然后按原样将它们传递给IDispatch::Invoke()
。
仅当 OLE 保存与 OLE 兼容的数据时,Variant
才与 OLE 兼容。UnicodeString
特定于 Delphi/C++Builder,并且对 OLE 未知,因此它与 OLE 不兼容。
当一个Variant
被分配一个UnicodeString
值时,它的VType
字段被设置为varUString
(0x0102),它的有效载荷是指向UnicodeString
内部数据的指针,其refCnt
字段递增(Variant
在销毁时会递减refCnt
)。
OLE 抱怨当您的UnicodeString
- 转Variant
传递给IDispatch::Invoke()
时,该值不受支持的VType
值。
要修复此错误,您需要改为将WideString
传递给OleFunction()
。WideString
是 OLEBSTR
字符串的包装器。 为Variant
分配WideString
值时,其VType
字段设置为varOleStr
(0x0008,在 OLE 中也称为VT_BSTR
),并且其有效负载是一个正确的BSTR
指针,它是WideString
数据的副本(Variant
将在销毁时释放BSTR
)。
因此,您需要:
-
将
file
变量更改为WideString
:WideString file( L"C:\TempFiles\Test.rtf" );
-
将
file
变量保留为UnicodeString
,但在将其传递给OleFunction()
时将其转换为WideString
:wordDoc = wordDoc.OleFunction( L"open", WideString(file) );
- 我需要如何更改我的程序以使用打开/关闭原则?
- 如果在VC6中使用打开功能,如何选择文件夹?
- 使用打开级联读取步骤文件
- 使用C 打开PHP页面(执行查询)
- 如何使用C 打开目录
- 如何在使用C++打开隐藏的 COM 对象时隐藏控制台窗口
- 如何调用 ShellExecute 以使用 C++ 打开具有特定程序的文件,而无需关联相同的文件扩展名
- 图像打开时出错(使用打开的 CV C++代码)
- 使用 C++ 打开 SQLite 数据库时出错
- 如何使用 C/C++ 打开和加载 oracle fmb 文件
- 在windows上使用c++打开和关闭应用程序
- 将我的阵列移动到 Mat 并使用打开的 CV 显示图像
- 如何使用 c++ 打开用户在输出屏幕中提供的文件
- 如何在 ubuntu 中使用 C++ 打开 "Open directory" GUI?
- 如何使用 c++ 打开同一目录中的文件
- 无法使用C++打开文件
- 使用直接显示控制相机,并使用打开的CV捕获图像
- 使用 C/C++ 打开实时媒体流
- 如何识别分隔符以及如何将其与路径一起使用 打开 Inventor
- 使用打开的CV禁用相机自动设置