home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 2000 April / VPR0004A.BIN / OLS / SADKT100 / sadkt100.lzh / SariAddin.cpp < prev    next >
C/C++ Source or Header  |  1999-12-31  |  6KB  |  190 lines

  1. /*======================================================================/
  2.  
  3.      SariAddin.cpp
  4.      
  5.     CSariAddinクラスはSARIとの接続および切断を実現します。
  6.     SariはこのクラスのOnConnection関数を呼び出すことにより、アドインプログ 
  7.     ラムとの接続をはかります。
  8.     アドインプログラムの作成者は、このOnConnection関数の中で、SARIに付加 
  9.     したいコマンドを登録し、望むなら独自のツールバーやショートカットキ 
  10.     ーを作成することができます。
  11.  
  12.     コマンドの登録で重要な変数が三つあります。
  13.     まずOnConnection関数によってSARIから渡されるlCookieです。これはアドイ 
  14.     ンプログラムそれぞれに対して発行される一意な正数値です。
  15.     次はコマンドの内部番号です。これはアドインプログラムの作成者が、SARIに 
  16.     登録したいコマンドごとに正の整数値を割り振ってください。
  17.     SARIから渡されたlCookieとDLL内部での番号を使い、下記のように、 
  18.     AddCommandメソッドをよぶと、実際SARI内部で使用される一意なコマンド番号 
  19.     が第5引数に格納されて返ります。    
  20.  
  21.     pMyApl->AddCommand(m_dwCookie, 1, bszCommand,bMenu, &lCommand[0]);
  22.  
  23.     このコマンド番号は、ツールバーのやメニューグループ、ショートカットキ 
  24.     ーの作成時に使います。
  25.  
  26.     一般に、コマンド番号はOnConnection関数内でしか使いませんので、特別な 
  27.     事情がないかぎり、保存しておく必要はありません。
  28.  
  29.     ユーザーがメニューやツールバーなどから、アドインのコマンドを実行した場 
  30.     合には、OnAddinCommandがシンクを通して呼び出されますが、この 
  31.     OnAddinCommandの引数はlCookie番号と、登録時に使った内部番号です。したが 
  32.     って、lCookieが違っていたらなにもせず、lCookieが同じなら、その内部番号 
  33.     によるswitchで、それに見合った処理をしてください。
  34.  
  35.  
  36. =======================================================================*/
  37.      
  38. #include "stdafx.h"
  39. #include "Sari_i.h"
  40. #include "SariAddin.h"
  41.  
  42.  
  43. #define ADDIN_FIRSTTIME        0x00000001
  44. #define ADDIN_INSERT_MENU    0x00000002
  45. #define ADDIN_TOOLBAR       0x00000004
  46.  
  47. #define STKEY_SHIFT            0x00000001
  48. #define STKEY_CTRL            0x00000002
  49. #define    STKEY_ALT           0x00000004
  50.  
  51. #define STKEY_2STKEY_A                 1
  52. #define STKEY_2STKEY_B                 2
  53. #define STKEY_2STKEY_C                 3
  54. #define STKEY_2STKEY_D                 4
  55.  
  56.  
  57. /////////////////////////////////////////////////////////////////////////// 
  58. //
  59. // CSariAddin
  60.  
  61.     /*----------- OnConnection関数について------------------------------
  62.      SARIがOnConnection関数を呼び出し、アドインプログラムをロードするの 
  63.      は、メインウィンドウの作成直前です。呼び出された時点ではメインウィン 
  64.      ドウは作成されていません。したがって、メインウインドウのハンドルを取 
  65.      得するGetMainWindowHandleメソッドはNULLを返しますし、また、他のイン 
  66.      ターフェースを取得する次の一連のメソッドも失敗します。
  67.          <失敗するメソッド>
  68.          GetMainWindowHandle,
  69.          CreateFileObject,
  70.          CreateEditObject,
  71.          CreateDisplayObject,
  72.          CreateSearchObject,
  73.          CreateMiscObject
  74.         RedrawMenu
  75.          
  76.      これらのメソッドを必要とする処理は、接続が完了し、OnNewInstanceが呼 
  77.      び出されたあとにしてください。
  78.      またアドインプログラムでは、SARI自身がメインウィンドウを作成表示しま 
  79.      す。ShowAppメソッドを呼ぶ必要はありません。アドインプログラムから 
  80.      ShowAppを呼ぶと、場合によってはハングするかもしれません。
  81.      ShowAppが必要なのは、CoCreateInstance等で外部からISRAPLインターフェ 
  82.      ースを作り、SARIを起動する場合だけです。
  83.         
  84.     -------------------------------------------------------------------*/
  85.  
  86. STDMETHODIMP CSariAddin::OnConnection(ISRAPL *pApl, long lFlag, long lCookie, VARIANT_BOOL *pbResult)
  87. {
  88.     AFX_MANAGE_STATE(AfxGetStaticModuleState())
  89.     // MFCを使用しないのなら、これは不要でしょう。
  90.  
  91.     //-------IAPLインターフェースの複製とクッキー値の保存-------------
  92.     ISRAPL *pMyApl=NULL;
  93.     if(FAILED(pApl->QueryInterface(IID_ISRAPL, (void**)&pMyApl))
  94.         || pMyApl==NULL){
  95.         *pbResult=VARIANT_FALSE;
  96.         return S_OK;
  97.     }
  98.     m_dwCookie=lCookie;
  99.  
  100.     //---------------シンクオブジェクトを作成-----------------------------
  101.     ASSERT(m_pSink==NULL);
  102.     HRESULT hr=CComObject< CSink >::CreateInstance(&m_pSink);
  103.     if(FAILED(hr)){
  104.         pMyApl->Release();
  105.         *pbResult=VARIANT_FALSE;
  106.         return S_OK;
  107.     }
  108.     m_pSink->AddRef();
  109.  
  110.     // -- シンクオブジェクトに情報を渡し、接続を実現-------------
  111.     if(!m_pSink->SetObjectInfo(pMyApl, m_dwCookie)) {
  112.         m_pSink->Release();
  113.         m_pSink=NULL;
  114.         *pbResult=VARIANT_FALSE;
  115.         return S_OK;
  116.     }
  117.     
  118.     /*-------------------------------------------------------------
  119.     //コマンドをSARIに登録する例です。
  120.     //下記では内部番号1、2、3をもつ3個のコマンドを登録しています。
  121.     
  122.     long lCommand[3];
  123.     CComBSTR bszCommand=_T("Addin Command 1");
  124.     pMyApl->AddCommand(m_dwCookie, 1, bszCommand, TRUE, &lCommand[0]);
  125.     if(lCommand[0]==0) goto EXIT;
  126.     bszCommand=_T("Addin Command 2");
  127.     pMyApl->AddCommand(m_dwCookie, 2, bszCommand, TRUE, &lCommand[1]);
  128.     if(lCommand[1]==0) goto EXIT;
  129.     bszCommand=_T("Addin Command 3");
  130.     pMyApl->AddCommand(m_dwCookie, 3, bszCommand, TRUE, &lCommand[2]);
  131.     if(lCommand[2]==0) goto EXIT;
  132.  
  133.  
  134. EXIT:
  135.  
  136.     ------------------------------------------------------------------*/
  137.  
  138.     *pbResult=VARIANT_TRUE;
  139.         // 接続が成功したら、コマンド登録に失敗しても、VARIANT_TRUEを返して
  140.         // ください。
  141.  
  142.     return S_OK;
  143.  
  144.  
  145. }
  146.  
  147. STDMETHODIMP CSariAddin::OnDisconnection(VARIANT_BOOL bLastTime)
  148. {
  149.     AFX_MANAGE_STATE(AfxGetStaticModuleState())
  150.  
  151.     // TODO: この位置にインプリメント用のコードを追加してください
  152.     ASSERT(m_pSink!=NULL);
  153.     
  154.     m_pSink->Unadvise();
  155.     m_pSink->Release();
  156.     m_pSink=NULL;
  157.  
  158.     return S_OK;
  159. }
  160.  
  161. /////////////////////////////////////////////////////////////////////////////////
  162.  
  163. STDMETHODIMP CSariAddin::InterfaceSupportsErrorInfo(REFIID riid)
  164. {
  165.     static const IID* arr[] = 
  166.     {
  167.         &IID_ISariAddin
  168.     };
  169.     for (int i=0; i < sizeof(arr) / sizeof(arr[0]); i++)
  170.     {
  171.         if (InlineIsEqualGUID(*arr[i],riid))
  172.             return S_OK;
  173.     }
  174.     return S_FALSE;
  175. }
  176.  
  177. /////////////////////////////////////////////////////////////////////////////////
  178.  
  179.  
  180. // 下のエクスポート関数は、アドイン登録時に、レジストリからクラスIDを検 
  181. // 索する手間を省くためのものです。
  182.  
  183. extern "C"
  184. __declspec(dllexport) void GetCLSIDofSariAddin(CLSID *pID)
  185. {
  186.     *pID=CLSID_SariAddin;
  187. }
  188.  
  189.  
  190.