问题:怎样判断word是否被加密?是WORD软件中设置的加密 。
这个问题涉及到如何通过VC调用office的组件库,进而实现操作Word的问题。其实如果是在VB或者VBA里面进行调用,会比较的容易,使用VC相对的麻烦些。这和ADO是一样的,在VB里面调用很容易,结构清晰,在VC里面调用就复杂好多。
具体的解决分下面几步:
1、在VC中引入office组件库,把下面的代码放入到stdafx.h中:
#import
"
C:Program Filescommon filesmicrosoft sharedoffice11MSO.dll
"
rename(
"
RGB
"
,
"
RGBEx
"
)
rename(
"
EOF
"
,
"
msoEOF
"
)

using
namespace
Office;

#import
"
C:Program FilesCommon FilesMicrosoft SharedVBAVBA6VBE6EXT.OLB
"

#import
"
C:Program FilesMicrosoft OfficeOFFICE11MSWORD.OLB
"
rename(
"
ExitWindows
"
,
"
ExitWindowsEx
"
)
rename(
"
FindText
"
,
"
FindTextEx
"
)

using
namespace
Word;
2、初始化COM库:
CoInitialize(NULL);
.... ....


CoUninitialize();
3、利用office组件库中提供的对象,打开一个word文档,并判断是否加密(即是否设置了密码):
_ApplicationPtr app;
_DocumentPtr doc;

app.CreateInstance(__uuidof(Application));
doc.CreateInstance(__uuidof(Document));

app
->
Visible
=
VARIANT_TRUE;

COleVariant v1(
"
c:/1.doc
"
); //此处为要打开的文档名字
COleVariant password(
"
"
);


try
...
{
doc = app->Documents->Open(v1, &vtMissing, &vtMissing, &vtMissing,
password,
&vtMissing,
&vtMissing,
password,
&vtMissing);

if (app-> ActiveDocument-> HasPassword == VARIANT_FALSE)

...{
AfxMessageBox("该文件未加密。");
}
}
catch
(_com_error
&
e)

...
{
AfxMessageBox("该文件已经加密,无法打开。");
}

VARIANT SaveChanges,OriginalFormat,RouteDocument;
SaveChanges.vt
=
VT_BOOL;
SaveChanges.boolVal
=
VARIANT_FALSE;

::VariantInit(
&
OriginalFormat);
RouteDocument.vt
=
VT_EMPTY;
doc.Release();

app
->
Quit(
&
SaveChanges,
&
OriginalFormat,
&
RouteDocument);
app.Release();
这里只有一个要点:默认的密码设置为一个空格,如果能正常打开文档,则该文档没有设置密码。否则,在打开的过程中会出错,则在错误处理中,判断出该文档设置了密码。