Pārlūkot izejas kodu

构建 lycpg64.dll CPG插件 编译示例图

蘭雅sRGB 9 mēneši atpakaļ
vecāks
revīzija
dfaa72e0f6
4 mainītis faili ar 49 papildinājumiem un 38 dzēšanām
  1. 3 17
      01_lycpg64/lycpg64.cbp
  2. 38 18
      01_lycpg64/main.cpp
  3. 8 3
      README.md
  4. BIN
      img/CPG_Build.png

+ 3 - 17
01_lycpg64/lycpg64.cbp

@@ -6,24 +6,9 @@
 		<Option pch_mode="2" />
 		<Option compiler="microsoft_visual_c_2022" />
 		<Build>
-			<Target title="Debug">
-				<Option output="bin/Debug/lycpg64" prefix_auto="1" extension_auto="1" />
-				<Option object_output="obj/Debug/" />
-				<Option type="3" />
-				<Option compiler="microsoft_visual_c_2022" />
-				<Option createDefFile="1" />
-				<Option createStaticLib="1" />
-				<Compiler>
-					<Add option="/Zi" />
-					<Add option="/D_DEBUG" />
-				</Compiler>
-				<Linker>
-					<Add option="/DEBUG" />
-				</Linker>
-			</Target>
 			<Target title="Release">
-				<Option output="bin/Release/lycpg64" prefix_auto="1" extension_auto="1" />
-				<Option object_output="obj/Release/" />
+				<Option output="lycpg64" prefix_auto="1" extension_auto="1" />
+				<Option object_output="." />
 				<Option type="3" />
 				<Option compiler="microsoft_visual_c_2022" />
 				<Option createDefFile="1" />
@@ -31,6 +16,7 @@
 				<Compiler>
 					<Add option="/Ox" />
 					<Add option="/DNDEBUG" />
+					<Add directory="../TypeLibs" />
 				</Compiler>
 			</Target>
 		</Build>

+ 38 - 18
01_lycpg64/main.cpp

@@ -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;
-}
+}

+ 8 - 3
README.md

@@ -6,7 +6,7 @@ CorelDRAW CPG 扩展开发: CPG(Corel Plug-in Gallery)是 CorelDRAW 的一个扩
 
 
 
-## CorelDRAW Graphics Suite 2020  Programs64\TypeLibs
+## CorelDRAW Graphics Suite 2020  Programs64 TypeLibs
 
 - 学习编写CPG插件,一般只用到  [`VGCoreAuto.tlb`](./TypeLibs/VGCoreAuto.tlb) 这个文件就够
 - 类型库 `vgcoreauto.tlb` 的包装器实现: [`vgcoreauto.tlh`  `vgcoreauto.tli`](./VGCoreAuto/) 这两个文件可以查看类型库的接口定义
@@ -26,8 +26,13 @@ Path=C:\MSVC2022\bin;%PATH%
 ```
 
 ## 构建: `Release` 在 `lycpg64` 中 (编译器: Microsoft Visual C++ 2022)
+
 ```
-cl.exe /utf-8 /nologo /W3 /EHsc /Ox /DNDEBUG /IC:\MSVC2022\include /ID:\lycpg64 /c main.cpp /Foobj\Release\main.obj
+cl.exe /nologo /W3 /EHsc /Ox /DNDEBUG /IC:\MSVC2022\include /ITypeLibs  /c 01_lycpg64\main.cpp /Fo.\main.obj
 
-link.exe /dll /nologo /LIBPATH:C:\MSVC2022\lib /out:bin\Release\lycpg64.dll Gdi32.lib user32.lib Kernel32.lib obj\Release\main.obj
+link.exe /dll /nologo /LIBPATH:C:\MSVC2022\lib /out:lycpg64.dll Gdi32.lib user32.lib Kernel32.lib .\main.obj
 ```
+
+### 构建 `lycpg64.dll` CPG插件, 编译示例图,改名成 `lycpg64.cpg` ,然后复制到 `CorelDRAW\Draw\Plugins64` 目录
+
+![](./img/CPG_Build.png) 

BIN
img/CPG_Build.png