home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DOS/V Power Report 2000 April
/
VPR0004A.BIN
/
OLS
/
SADKT100
/
sadkt100.lzh
/
SariAddin.cpp
< prev
next >
Wrap
C/C++ Source or Header
|
1999-12-31
|
6KB
|
190 lines
/*======================================================================/
SariAddin.cpp
CSariAddinクラスはSARIとの接続および切断を実現します。
SariはこのクラスのOnConnection関数を呼び出すことにより、アドインプログ
ラムとの接続をはかります。
アドインプログラムの作成者は、このOnConnection関数の中で、SARIに付加
したいコマンドを登録し、望むなら独自のツールバーやショートカットキ
ーを作成することができます。
コマンドの登録で重要な変数が三つあります。
まずOnConnection関数によってSARIから渡されるlCookieです。これはアドイ
ンプログラムそれぞれに対して発行される一意な正数値です。
次はコマンドの内部番号です。これはアドインプログラムの作成者が、SARIに
登録したいコマンドごとに正の整数値を割り振ってください。
SARIから渡されたlCookieとDLL内部での番号を使い、下記のように、
AddCommandメソッドをよぶと、実際SARI内部で使用される一意なコマンド番号
が第5引数に格納されて返ります。
pMyApl->AddCommand(m_dwCookie, 1, bszCommand,bMenu, &lCommand[0]);
このコマンド番号は、ツールバーのやメニューグループ、ショートカットキ
ーの作成時に使います。
一般に、コマンド番号はOnConnection関数内でしか使いませんので、特別な
事情がないかぎり、保存しておく必要はありません。
ユーザーがメニューやツールバーなどから、アドインのコマンドを実行した場
合には、OnAddinCommandがシンクを通して呼び出されますが、この
OnAddinCommandの引数はlCookie番号と、登録時に使った内部番号です。したが
って、lCookieが違っていたらなにもせず、lCookieが同じなら、その内部番号
によるswitchで、それに見合った処理をしてください。
=======================================================================*/
#include "stdafx.h"
#include "Sari_i.h"
#include "SariAddin.h"
#define ADDIN_FIRSTTIME 0x00000001
#define ADDIN_INSERT_MENU 0x00000002
#define ADDIN_TOOLBAR 0x00000004
#define STKEY_SHIFT 0x00000001
#define STKEY_CTRL 0x00000002
#define STKEY_ALT 0x00000004
#define STKEY_2STKEY_A 1
#define STKEY_2STKEY_B 2
#define STKEY_2STKEY_C 3
#define STKEY_2STKEY_D 4
///////////////////////////////////////////////////////////////////////////
//
// CSariAddin
/*----------- OnConnection関数について------------------------------
SARIがOnConnection関数を呼び出し、アドインプログラムをロードするの
は、メインウィンドウの作成直前です。呼び出された時点ではメインウィン
ドウは作成されていません。したがって、メインウインドウのハンドルを取
得するGetMainWindowHandleメソッドはNULLを返しますし、また、他のイン
ターフェースを取得する次の一連のメソッドも失敗します。
<失敗するメソッド>
GetMainWindowHandle,
CreateFileObject,
CreateEditObject,
CreateDisplayObject,
CreateSearchObject,
CreateMiscObject
RedrawMenu
これらのメソッドを必要とする処理は、接続が完了し、OnNewInstanceが呼
び出されたあとにしてください。
またアドインプログラムでは、SARI自身がメインウィンドウを作成表示しま
す。ShowAppメソッドを呼ぶ必要はありません。アドインプログラムから
ShowAppを呼ぶと、場合によってはハングするかもしれません。
ShowAppが必要なのは、CoCreateInstance等で外部からISRAPLインターフェ
ースを作り、SARIを起動する場合だけです。
-------------------------------------------------------------------*/
STDMETHODIMP CSariAddin::OnConnection(ISRAPL *pApl, long lFlag, long lCookie, VARIANT_BOOL *pbResult)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
// MFCを使用しないのなら、これは不要でしょう。
//-------IAPLインターフェースの複製とクッキー値の保存-------------
ISRAPL *pMyApl=NULL;
if(FAILED(pApl->QueryInterface(IID_ISRAPL, (void**)&pMyApl))
|| pMyApl==NULL){
*pbResult=VARIANT_FALSE;
return S_OK;
}
m_dwCookie=lCookie;
//---------------シンクオブジェクトを作成-----------------------------
ASSERT(m_pSink==NULL);
HRESULT hr=CComObject< CSink >::CreateInstance(&m_pSink);
if(FAILED(hr)){
pMyApl->Release();
*pbResult=VARIANT_FALSE;
return S_OK;
}
m_pSink->AddRef();
// -- シンクオブジェクトに情報を渡し、接続を実現-------------
if(!m_pSink->SetObjectInfo(pMyApl, m_dwCookie)) {
m_pSink->Release();
m_pSink=NULL;
*pbResult=VARIANT_FALSE;
return S_OK;
}
/*-------------------------------------------------------------
//コマンドをSARIに登録する例です。
//下記では内部番号1、2、3をもつ3個のコマンドを登録しています。
long lCommand[3];
CComBSTR bszCommand=_T("Addin Command 1");
pMyApl->AddCommand(m_dwCookie, 1, bszCommand, TRUE, &lCommand[0]);
if(lCommand[0]==0) goto EXIT;
bszCommand=_T("Addin Command 2");
pMyApl->AddCommand(m_dwCookie, 2, bszCommand, TRUE, &lCommand[1]);
if(lCommand[1]==0) goto EXIT;
bszCommand=_T("Addin Command 3");
pMyApl->AddCommand(m_dwCookie, 3, bszCommand, TRUE, &lCommand[2]);
if(lCommand[2]==0) goto EXIT;
EXIT:
------------------------------------------------------------------*/
*pbResult=VARIANT_TRUE;
// 接続が成功したら、コマンド登録に失敗しても、VARIANT_TRUEを返して
// ください。
return S_OK;
}
STDMETHODIMP CSariAddin::OnDisconnection(VARIANT_BOOL bLastTime)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
// TODO: この位置にインプリメント用のコードを追加してください
ASSERT(m_pSink!=NULL);
m_pSink->Unadvise();
m_pSink->Release();
m_pSink=NULL;
return S_OK;
}
/////////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CSariAddin::InterfaceSupportsErrorInfo(REFIID riid)
{
static const IID* arr[] =
{
&IID_ISariAddin
};
for (int i=0; i < sizeof(arr) / sizeof(arr[0]); i++)
{
if (InlineIsEqualGUID(*arr[i],riid))
return S_OK;
}
return S_FALSE;
}
/////////////////////////////////////////////////////////////////////////////////
// 下のエクスポート関数は、アドイン登録時に、レジストリからクラスIDを検
// 索する手間を省くためのものです。
extern "C"
__declspec(dllexport) void GetCLSIDofSariAddin(CLSID *pID)
{
*pID=CLSID_SariAddin;
}