问题:怎样判断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;
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();
.... ....
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();
_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();
这里只有一个要点:默认的密码设置为一个空格,如果能正常打开文档,则该文档没有设置密码。否则,在打开的过程中会出错,则在错误处理中,判断出该文档设置了密码。