📄 eventhandler.cpp
字号:
#include "stdafx.h"
#include "EventHandler.h"
#include "resource.h"
#include "TestZnPDFLibrarianDLLDlg.h"
//#include "PassWordDlg.h"
#include <afxctl.h> //定义了AfxConnectionAdvise、AfxConnectionUnadvise
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
CString password;
//static CString m_IndexPath;//索引路径
/////////////////////////////////////////////////////////////////////////////
// CEventHandler
IMPLEMENT_DYNCREATE(CEventHandler, CCmdTarget)
CEventHandler::CEventHandler()
{
//Initialize COM libraries...create MTA...
CoInitialize(NULL);
//这个函数将m_xDispatch与一个COleDispatchImpl对象联系了起来,COleDispatchImpl实现了
//IDispatch接口,且数据结构与m_xDispatch相同,所以可以赋值给它。这样就等于m_xDispatch
//实现了IDispatch,把它传给COM组件后,COM组件就可以调用它的Invoke()函数(如在FireShow()中),
//COleDispatchImpl::Invoke()中用到了dispatch map,这个表由DECLARE_DISPATCHMAP声明,
//在BEGIN_DISPATCHMAP(,)、END_DISPATCHMAP()中被填充,比如Show()、Show2()。这样Invoke()
//就可以根据dispid在dispatch map中找到这两个函数,从而调用它们,从而实现了连接点。
//另一方面,也可以看到用dispinterface声明的事件接口本身并不是从哪个接口继承的,既不是IUnknown
//也不是IDispatch,只不过通过一系列手段,使Invoke()能识别其中的属性、方法而已。
//dispinterface表示这个接口是纯IDispatch接口。
EnableAutomation();
}
CEventHandler::~CEventHandler()
{
}
void CEventHandler::Initialize( LPUNKNOWN pUnk, REFIID iid )
{
//advise the server that this (mainframe) is the sink for events...
//这个函数内部将进行QueryInterface(IConnectionPointContainer,..)、FindConnectionPoint()、Advise()等一系列调用
AfxConnectionAdvise(
pUnk, //可连接对象的接口指针
iid, //连接接口ID
GetIDispatch(FALSE), //把内嵌的IDispatch实现类的一个对象实例m_xDispatch传了出去
FALSE, //donod addref
&m_dwCookie ); //cookie to break connection later...
}
void CEventHandler::Uninitialize( LPUNKNOWN pUnk, REFIID iid )
{
//break the connection...donot receive any more events...
//将调用Unadvise()
AfxConnectionUnadvise(
pUnk,
iid ,
GetIDispatch(FALSE),
FALSE,
m_dwCookie ) ;
}
/////////////////////////////////////////////////////////////////////////////
// CPDFSearchEvents
IMPLEMENT_DYNCREATE(CPDFSearchEvents, CCmdTarget)
BEGIN_MESSAGE_MAP(CPDFSearchEvents, CEventHandler)
END_MESSAGE_MAP()
// 填充dispatch map表,以供Invoke()调用
BEGIN_DISPATCH_MAP(CPDFSearchEvents, CEventHandler)
DISP_FUNCTION_ID(CPDFSearchEvents, "FindWordInDoc", 1, FindWordInDoc, VT_BOOL, VTS_BSTR VTS_I4 VTS_I4 VTS_I4 VTS_BOOL)
DISP_FUNCTION_ID(CPDFSearchEvents, "FindWordInBookmark", 2, FindWordInBookmark, VT_BOOL, VTS_BSTR VTS_VARIANT VTS_BOOL)
DISP_FUNCTION_ID(CPDFSearchEvents, "FindWordInComment", 3, FindWordInComment, VT_BOOL, VTS_BSTR VTS_I4 VTS_I4 VTS_BOOL)
END_DISPATCH_MAP( )
// 填充接口映射表,方便QueryInterface处理,因为它是根据IID来判断接口的
// 因为IDispatch已被CCmdTarget嵌套了,所以不需要在.h文件中用BEGIN_INTERFACE_PART(,)和
// END_INTERFACE_PART()来声明这个嵌套类,这里是struct XDispatch{...}m_xDispatch
BEGIN_INTERFACE_MAP(CPDFSearchEvents, CEventHandler)
INTERFACE_PART(CPDFSearchEvents, DIID__IPDFSearchEvents, Dispatch)
END_INTERFACE_MAP()
/////////////////////////////////////////////////////////////////////////////
BOOL CPDFSearchEvents::FindWordInDoc(char* file, long page_no, long word_no, long word_num, BOOL bModified)
{
char *str;
int No;
str = new char[100];
int n = m_pDlg->m_result.GetItemCount() ;
m_pDlg->m_records = n;
char *num;
num = new char[20];
itoa(n,num,10);
m_pDlg->m_cRecords.SetWindowText( num );
m_pDlg->m_result.InsertItem( n, file ) ;
No = page_no;
itoa(No,str,10);
m_pDlg->m_result.SetItemText(n,1,str ) ;
No = word_no;
itoa(No,str,10);
m_pDlg->m_result.SetItemText(n,2,str ) ;
No = word_num;
itoa(No,str,10);
m_pDlg->m_result.SetItemText(n,3,str );
delete[] str;
return TRUE;
}
BOOL CPDFSearchEvents::FindWordInBookmark(char* file, const VARIANT & arPos, BOOL bModified)
{
char *str;
int No;
str = new char[100];
int n = m_pDlg->m_result.GetItemCount() ;
m_pDlg->RecordCount(n);
m_pDlg->m_result.InsertItem( n, file ) ;
No = arPos.intVal;
itoa(No,str,10);
m_pDlg->m_result.SetItemText(n,4,str ) ;
// No = word_no;
// itoa(No,str,10);
//
// m_pDlg->m_result.SetItemText(n,2,str ) ;
//
// No = word_num;
// itoa(No,str,10);
// m_pDlg->m_result.SetItemText(n,3,str );
// //Updatedata();
delete[] str;
return TRUE;
}
BOOL CPDFSearchEvents::FindWordInComment(char* file, long page_no, long annot_no, BOOL bModified)
{
char *str;
int No;
str = new char[100];
int n = m_pDlg->m_result.GetItemCount() ;
m_pDlg->RecordCount(n);
m_pDlg->m_result.InsertItem( n, file ) ;
No = page_no;
itoa(No,str,10);
m_pDlg->m_result.SetItemText(n,1,str ) ;
No = annot_no;
itoa(No,str,10);
m_pDlg->m_result.SetItemText(n,5,str ) ;
// No = annot_no;
// itoa(No,str,10);
// m_pDlg->m_result.SetItemText(n,3,str );
//Updatedata();
delete[] str;
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -