helloworldexport.cpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. #include <qobject.h>
  2. #include <qstring.h>
  3. #include <pluginGl.h>
  4. #include <functional>
  5. #include <qsciscintilla.h>
  6. #include "qttestclass.h"
  7. #include "instanceobj.h"
  8. #ifdef WIN32
  9. #include <Windows.h>
  10. #endif
  11. #define NDD_EXPORTDLL
  12. #if defined(Q_OS_WIN)
  13. #if defined(NDD_EXPORTDLL)
  14. #define NDD_EXPORT __declspec(dllexport)
  15. #else
  16. #define NDD_EXPORT __declspec(dllimport)
  17. #endif
  18. #else
  19. #define NDD_EXPORT __attribute__((visibility("default")))
  20. #endif
  21. #ifdef __cplusplus
  22. extern "C" {
  23. #endif
  24. NDD_EXPORT bool NDD_PROC_IDENTIFY(NDD_PROC_DATA* pProcData);
  25. NDD_EXPORT int NDD_PROC_MAIN(QWidget* pNotepad, const QString& strFileName, std::function<QsciScintilla* (QWidget*)>getCurEdit, std::function<bool(QWidget*, int, void*)> pluginCallBack, NDD_PROC_DATA* procData);
  26. #ifdef __cplusplus
  27. }
  28. #endif
  29. static NDD_PROC_DATA s_procData;
  30. static QWidget* s_pMainNotepad = nullptr;
  31. std::function<QsciScintilla* (QWidget*)> s_getCurEdit;
  32. std::function<bool(QWidget*, int, void*)> s_invokeMainFun;
  33. bool NDD_PROC_IDENTIFY(NDD_PROC_DATA* pProcData)
  34. {
  35. if(pProcData == NULL)
  36. {
  37. return false;
  38. }
  39. pProcData->m_strPlugName = QObject::tr("Hello World Plug");
  40. pProcData->m_strComment = QObject::tr(u8"不需要创建二级菜单的插件例子");
  41. pProcData->m_version = QString("v1.0");
  42. pProcData->m_auther = QString("zuowei.yin");
  43. pProcData->m_menuType = 0;
  44. return true;
  45. }
  46. //则点击菜单栏按钮时,会自动调用到该插件的入口点函数。
  47. //pNotepad:就是CCNotepad的主界面指针
  48. //strFileName:当前插件DLL的全路径,如果不关心,则可以不使用
  49. //getCurEdit:从NDD主程序传递过来的仿函数,通过该函数获取当前编辑框操作对象QsciScintilla
  50. //s_invokeMainFun: 可以回调NDD主程序中的功能函数,比如创建新文件功能等,根据需要可实时扩展。
  51. //pProcData:如果pProcData->m_menuType = 0 ,则该指针为空;如果pProcData->m_menuType = 1,则该指针有值。目前需要关心s_procData.m_rootMenu
  52. //开发者可以在该菜单下面,自行创建二级菜单
  53. int NDD_PROC_MAIN(QWidget* pNotepad, const QString &strFileName, std::function<QsciScintilla*(QWidget*)>getCurEdit, std::function<bool(QWidget*, int, void*)> pluginCallBack, NDD_PROC_DATA* pProcData)
  54. {
  55. InstanceObj* pInstanse = nullptr;
  56. if (pProcData != nullptr)
  57. {
  58. pInstanse = new InstanceObj(pNotepad);
  59. pInstanse->setObjectName("nddplg");
  60. }
  61. else
  62. {
  63. return -1;
  64. }
  65. s_getCurEdit = getCurEdit;
  66. s_invokeMainFun = pluginCallBack;
  67. //务必拷贝一份pProcData,在外面会释放。
  68. if (pProcData != nullptr)
  69. {
  70. s_procData = *pProcData;
  71. }
  72. s_pMainNotepad = pNotepad;
  73. QObject::connect(pProcData->m_pAction, &QAction::triggered, pInstanse, &InstanceObj::doMainWork, Qt::UniqueConnection);
  74. return 0;
  75. }
  76. #ifdef WIN32
  77. BOOL WINAPI DllMain(HINSTANCE hInst, DWORD fdwReason, LPVOID lpvReserved) {
  78. switch (fdwReason) {
  79. case DLL_PROCESS_ATTACH:
  80. case DLL_THREAD_ATTACH:
  81. break;
  82. case DLL_THREAD_DETACH:
  83. break;
  84. case DLL_PROCESS_DETACH:
  85. if (NULL == lpvReserved) {
  86. //做全局回收工作
  87. }
  88. break;
  89. }
  90. return TRUE;
  91. }
  92. #else
  93. void onDllUnload(void)
  94. {
  95. //做全局回收工作
  96. }
  97. #endif