|  | @@ -1,41 +1,50 @@
 | 
	
		
			
				|  |  | -// dllmain.cpp : 定义 DLL 应用程序的入口点。
 | 
	
		
			
				|  |  | -#include <tchar.h>
 | 
	
		
			
				|  |  | +#include <tchar.h>
 | 
	
		
			
				|  |  |  #import "vgcoreauto.tlb"
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +// DllMain是动态链接库的入口函数
 | 
	
		
			
				|  |  | +// hModule: 动态链接库的模块句柄
 | 
	
		
			
				|  |  | +// ul_reason_for_call: 调用原因,指示动态链接库被加载或卸载的原因
 | 
	
		
			
				|  |  | +// lpReserved: 保留参数,通常设为NULL
 | 
	
		
			
				|  |  |  BOOL APIENTRY DllMain( HMODULE hModule,
 | 
	
		
			
				|  |  |                         DWORD  ul_reason_for_call,
 | 
	
		
			
				|  |  |                         LPVOID lpReserved
 | 
	
		
			
				|  |  |                       )
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  | +    // 根据调用原因进行不同的操作
 | 
	
		
			
				|  |  |      switch (ul_reason_for_call)
 | 
	
		
			
				|  |  |      {
 | 
	
		
			
				|  |  | -    case DLL_PROCESS_ATTACH:
 | 
	
		
			
				|  |  | -    case DLL_THREAD_ATTACH:
 | 
	
		
			
				|  |  | -    case DLL_THREAD_DETACH:
 | 
	
		
			
				|  |  | -    case DLL_PROCESS_DETACH:
 | 
	
		
			
				|  |  | +    case DLL_PROCESS_ATTACH: // 动态链接库被加载到进程地址空间时调用
 | 
	
		
			
				|  |  | +    case DLL_THREAD_ATTACH: // 创建线程时调用
 | 
	
		
			
				|  |  | +    case DLL_THREAD_DETACH: // 线程退出时调用
 | 
	
		
			
				|  |  | +    case DLL_PROCESS_DETACH: // 动态链接库被卸载时调用
 | 
	
		
			
				|  |  |          break;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | +    // 成功处理所有调用原因,返回TRUE
 | 
	
		
			
				|  |  |      return TRUE;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +// CVGAppPlugin类实现了VGCore::IVGAppPlugin接口,用于插件开发
 | 
	
		
			
				|  |  |  class CVGAppPlugin : public VGCore::IVGAppPlugin
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  |  private:
 | 
	
		
			
				|  |  | -    VGCore::IVGApplication *m_pApp;
 | 
	
		
			
				|  |  | -    ULONG m_ulRefCount;
 | 
	
		
			
				|  |  | -    long m_lCookie;
 | 
	
		
			
				|  |  | -    bool m_bEnabled;
 | 
	
		
			
				|  |  | +    VGCore::IVGApplication *m_pApp; // 应用程序接口指针
 | 
	
		
			
				|  |  | +    ULONG m_ulRefCount; // 对象引用计数
 | 
	
		
			
				|  |  | +    long m_lCookie; // 用于标识插件的cookie
 | 
	
		
			
				|  |  | +    bool m_bEnabled; // 插件是否启用的标志
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  public:
 | 
	
		
			
				|  |  | +    // 默认构造函数
 | 
	
		
			
				|  |  |      CVGAppPlugin();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    // IUnknown
 | 
	
		
			
				|  |  | -public:
 | 
	
		
			
				|  |  | +    // IUnknown  接口实现
 | 
	
		
			
				|  |  | +    // QueryInterface用于获取接口指针
 | 
	
		
			
				|  |  |      STDMETHOD(QueryInterface)(REFIID riid, void **ppvObject);
 | 
	
		
			
				|  |  | +    // AddRef增加对象的引用计数
 | 
	
		
			
				|  |  |      STDMETHOD_(ULONG, AddRef)(void)
 | 
	
		
			
				|  |  |      {
 | 
	
		
			
				|  |  |          return ++m_ulRefCount;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | +    // Release减少对象的引用计数,当计数为0时释放对象
 | 
	
		
			
				|  |  |      STDMETHOD_(ULONG, Release)(void)
 | 
	
		
			
				|  |  |      {
 | 
	
		
			
				|  |  |          ULONG ulCount = --m_ulRefCount;
 | 
	
	
		
			
				|  | @@ -46,31 +55,33 @@ public:
 | 
	
		
			
				|  |  |          return ulCount;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    // IDispatch
 | 
	
		
			
				|  |  | -public:
 | 
	
		
			
				|  |  | +    // IDispatch 接口实现
 | 
	
		
			
				|  |  | +    // GetTypeInfoCount返回类型信息的数量
 | 
	
		
			
				|  |  |      STDMETHOD(GetTypeInfoCount)(UINT *pctinfo)
 | 
	
		
			
				|  |  |      {
 | 
	
		
			
				|  |  |          return E_NOTIMPL;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | +    // GetTypeInfo获取类型信息
 | 
	
		
			
				|  |  |      STDMETHOD(GetTypeInfo)(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo)
 | 
	
		
			
				|  |  |      {
 | 
	
		
			
				|  |  |          return E_NOTIMPL;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | +    // GetIDsOfNames获取指定名称的成员或变量的ID
 | 
	
		
			
				|  |  |      STDMETHOD(GetIDsOfNames)(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
 | 
	
		
			
				|  |  |      {
 | 
	
		
			
				|  |  |          return E_NOTIMPL;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | +    // Invoke调用对象的成员函数
 | 
	
		
			
				|  |  |      STDMETHOD(Invoke)(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    // IVGAppPlugin
 | 
	
		
			
				|  |  | -public:
 | 
	
		
			
				|  |  | +    // IVGAppPlugin接口实现
 | 
	
		
			
				|  |  |      STDMETHOD(raw_OnLoad)(VGCore::IVGApplication *Application);
 | 
	
		
			
				|  |  |      STDMETHOD(raw_StartSession)();
 | 
	
		
			
				|  |  |      STDMETHOD(raw_StopSession)();
 | 
	
		
			
				|  |  |      STDMETHOD(raw_OnUnload)();
 | 
	
		
			
				|  |  |  };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | +// 默认构造函数
 | 
	
		
			
				|  |  |  CVGAppPlugin::CVGAppPlugin() :
 | 
	
		
			
				|  |  |      m_pApp(NULL),
 | 
	
		
			
				|  |  |      m_lCookie(0),
 | 
	
	
		
			
				|  | @@ -80,6 +91,7 @@ CVGAppPlugin::CVGAppPlugin() :
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +// QueryInterface实现,用于获取接口指针
 | 
	
		
			
				|  |  |  STDMETHODIMP CVGAppPlugin::QueryInterface(REFIID riid, void **ppvObject)
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  |      HRESULT hr = S_OK;
 | 
	
	
		
			
				|  | @@ -104,11 +116,13 @@ STDMETHODIMP CVGAppPlugin::QueryInterface(REFIID riid, void **ppvObject)
 | 
	
		
			
				|  |  |      return hr;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +// Invoke方法的实现,目前仅返回S_OK
 | 
	
		
			
				|  |  |  STDMETHODIMP CVGAppPlugin::Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  |      return S_OK;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +// raw_OnLoad方法,在插件加载时被调用
 | 
	
		
			
				|  |  |  STDMETHODIMP CVGAppPlugin::raw_OnLoad(VGCore::IVGApplication *Application)
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  |      m_pApp = Application;
 | 
	
	
		
			
				|  | @@ -119,18 +133,21 @@ STDMETHODIMP CVGAppPlugin::raw_OnLoad(VGCore::IVGApplication *Application)
 | 
	
		
			
				|  |  |      return S_OK;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +// raw_StartSession方法,启动会话时被调用
 | 
	
		
			
				|  |  |  STDMETHODIMP CVGAppPlugin::raw_StartSession()
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  |      MessageBox(NULL, _T("插件加载到内存,本CPG使用VC2022 X64编译"), _T("蘭雅CPG64"), MB_ICONSTOP);
 | 
	
		
			
				|  |  |      return S_OK;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +// raw_StopSession方法,结束会话时被调用
 | 
	
		
			
				|  |  |  STDMETHODIMP CVGAppPlugin::raw_StopSession()
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  |      MessageBox(NULL, _T("插件结束"), _T("蘭雅CPG64"), MB_ICONSTOP);
 | 
	
		
			
				|  |  |      return S_OK;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +// raw_OnUnload方法,在插件卸载时被调用
 | 
	
		
			
				|  |  |  STDMETHODIMP CVGAppPlugin::raw_OnUnload()
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  |      if (m_pApp)
 | 
	
	
		
			
				|  | @@ -141,8 +158,11 @@ STDMETHODIMP CVGAppPlugin::raw_OnUnload()
 | 
	
		
			
				|  |  |      return S_OK;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +// AttachPlugin函数用于将插件附加到应用程序中
 | 
	
		
			
				|  |  | +// ppIPlugin: 插件接口指针的地址
 | 
	
		
			
				|  |  | +// 返回值: 附加操作的结果,这里固定返回0x100
 | 
	
		
			
				|  |  |  extern "C" __declspec(dllexport) DWORD APIENTRY AttachPlugin(VGCore::IVGAppPlugin **ppIPlugin)
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  |      *ppIPlugin = new CVGAppPlugin;
 | 
	
		
			
				|  |  |      return 0x100;
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | +}
 |