Community
    • 登入

    New built-in Plugin Admin (Plugin Manager) is ready

    已排程 已置頂 已鎖定 已移動 Notepad++ & Plugin Development
    117 貼文 22 Posters 133.8k 瀏覽
    正在載入更多貼文
    • 從舊到新
    • 從新到舊
    • 最多點贊
    回覆
    • 在新貼文中回覆
    登入後回覆
    此主題已被刪除。只有擁有主題管理權限的使用者可以查看。
    • dinkumoilD
      dinkumoil
      最後由 編輯

      @donho said:

      The reason of installation to <Userprofile>\AppData\Local\Notepad++\plugins\<plugin-name> is Microsoft’s Universal Windows Platform.

      Ahh, got it. Another suggestion: My current implementation to retrieve the path of the plugin DLL and its companion files is as follows (I ported it from Delphi to C because I’m not a C++ dev):

      LPTSTR GetPluginsDir(HMODULE hModule)
      {
        LPTSTR szBuf;
        DWORD  dwBufLen;
        DWORD  nCCh;
      
        dwBufLen = MAX_PATH;  // Initial buffer size, has to be greater than 0
        szBuf    = NULL;      // Buffer memory is allocated in loop
      
        do
        {
          // Resize buffer and try to get module path
          szBuf = (LPTSTR) realloc(szBuf, dwBufLen * sizeof(*szBuf));
          nCCh  = GetModuleFileName(hModule, szBuf, dwBufLen);
      
          // If nCCh is 0 there was an error
          //   => leave loop
          // if nCCh is less than dwBufLen the buffer size was sufficient
          //   => leave loop
          // If nCCh is equal to dwBufLen the buffer size was too small
          //   => loop and retry with double sized buffer
          // nCCh greater than dwBufLen is a non-existing case
          if (nCCh < dwBufLen) break;
          dwBufLen *= 2;
        } while (TRUE);
      
        if (nCCh != 0) // Retrieving path succeeded
        {
          // Resize buffer to desired size
          szBuf = (LPTSTR) realloc(szBuf, (nCCh + 1) * sizeof(*szBuf));
        }
        else // Retrieving path failed
        {
          // Free buffer and return NULL
          free(szBuf);
          szBuf = NULL;
        }
      
        return szBuf;
      }
      

      Seems complicated but starting with Windows 10 it is no longer sufficient to deal with MAX_PATH to allocate buffers for file paths since they can be longer now. When writing the code I had in mind to cover all possible installation scenarios for Npp. A portable installation can be located in a deeply nested path, thus the loop for buffer allocation.

      But for the most part, the bad design of the GetModuleFileName API is to blame for the complicated code. Would you please provide a Npp message which can be used to query the folder of a plugin DLL file? This would make plugin devs life more easy. Ideally it schould be designed like the NPPM_GETFULLPATHFROMBUFFERID call.

      1 條回覆 最後回覆 回覆 引用 2
      • donhoD
        donho
        最後由 編輯

        @dinkumoil

        Ideally it schould be designed like the NPPM_GETFULLPATHFROMBUFFERID call

        It’s not clear to me at all. Could you define the API you need by using this form:

        	#define NPPM_GETFULLPATHFROMBUFFERID (NPPMSG + 58)
        	// INT NPPM_GETFULLPATHFROMBUFFERID(UINT_PTR bufferID, TCHAR *fullFilePath)
        	// Get full path file name from a bufferID.
        	// Return -1 if the bufferID non existing, otherwise the number of TCHAR copied/to copy
        	// User should call it with fullFilePath be NULL to get the number of TCHAR (not including the nul character),
        	// allocate fullFilePath with the return values + 1, then call it again to get full path file name
        
        1 條回覆 最後回覆 回覆 引用 2
        • Scott SumnerS
          Scott Sumner
          最後由 編輯

          It’s not clear to me at all

          ??

          And to think, all this pain was wrought by one little ad in the corner of a window…

          donhoD 1 條回覆 最後回覆 回覆 引用 1
          • dailD
            dail
            最後由 編輯

            Was getting ready to add some of my plugins to the list, however I’m not able to get any installation to work. A few minutes ago I grabbed the notepad++ and gup exes, and the new plugin list json file.

            1. Don’t have any plugins installed
            2. Start notepad++ as administrator
            3. Go to plugin admin, no plugins are listed under “Updates” Or “Installed”
            4. Select DSpellCheck
            5. Click install
            6. Notepad++ says it will restart
            7. Click Ok
            8. Nothing happens
            9. Wait a bit, start N++ manually, nothing is installed
            Notepad++ v7.5.9   (32-bit)
            Build time : Oct 31 2018 - 19:53:57
            Path : C:\Program Files (x86)\Notepad++\notepad++.exe
            Admin mode : ON
            Local Conf mode : OFF
            OS : Windows 7 (64-bit)
            Plugins : none
            
            1 條回覆 最後回覆 回覆 引用 0
            • donhoD
              donho
              最後由 編輯

              @dail
              Could you paste here your plugin entry (32-bits) to add in nppPluginList.cpp ?
              I will check it.

              dailD 1 條回覆 最後回覆 回覆 引用 0
              • dailD
                dail @donho
                最後由 dail 編輯

                @donho

                I’m wanting to add these entries (for 32 bit) but have no way to test it currently:

                {
                	"folder-name": "BetterMultiSelection",
                	"display-name": "BetterMultiSelection",
                	"version": "1.3",
                	"id": "ef3f4e8ffac54fd7e6c9abcd785df09482cba2d63ab68c6bc9bffa71e4053de5",
                	"repository": "https://github.com/dail8859/BetterMultiSelection/releases/download/v1.3/BetterMultiSelection_v1.3.zip",
                	"description": "Provides better cursor movements when using multiple selections.",
                	"author": "Justin Dailey",
                	"homepage": "https://github.com/dail8859/BetterMultiSelection"
                },
                {
                	"folder-name": "DoxyIt",
                	"display-name": "DoxyIt",
                	"version": "0.4.3",
                	"id": "401bc3413e90f87baf6d31ceb800e6fe7d8df54fe063fe659c713eddeec8e2f3",
                	"repository": "https://github.com/dail8859/DoxyIt/releases/download/v0.4.3/DoxyIt.zip",
                	"description": "Support for creating Doxygen comments.",
                	"author": "Justin Dailey",
                	"homepage": "https://github.com/dail8859/DoxyIt"
                },
                {
                	"folder-name": "ElasticTabstops",
                	"display-name": "ElasticTabstops",
                	"version": "1.3",
                	"id": "6d2d8ba941d060e9caca6bb84e0b3864173b93c164de97b663f66d4998749d3a",
                	"repository": "https://github.com/dail8859/ElasticTabstops/releases/download/v1.3/ElasticTabstops.zip",
                	"description": "Support for Elastic Tabstops.",
                	"author": "Justin Dailey",
                	"homepage": "https://github.com/dail8859/ElasticTabstops"
                },
                {
                	"folder-name": "LuaScript",
                	"display-name": "LuaScript",
                	"version": "0.8",
                	"id": "b10c358552ab9d12990c3005e3a45ee0c736587e4025fc1cfd054f1325c9ef46",
                	"repository": "https://github.com/dail8859/LuaScript/releases/download/v0.8/LuaScript_v0.8.zip",
                	"description": "Adds Lua scripting capabilities. This provides control over all of Scintilla's features and options with a light-weight, fully-functional programming language.",
                	"author": "Justin Dailey",
                	"homepage": "https://github.com/dail8859/LuaScript"
                },
                {
                	"folder-name": "SurroundSelection",
                	"display-name": "SurroundSelection",
                	"version": "1.1",
                	"id": "632f7411f00aef29ecf565415df79cc4edb6a6518fa620073567d379583d81b8",
                	"repository": "https://github.com/dail8859/SurroundSelection/releases/download/v1.1/SurroundSelection.zip",
                	"description": "Automatically surround the selection in quotes/brackets/parenthesis/etc.",
                	"author": "Justin Dailey",
                	"homepage": "https://github.com/dail8859/SurroundSelection"
                }
                
                1 條回覆 最後回覆 回覆 引用 0
                • donhoD
                  donho
                  最後由 donho 編輯

                  @dail
                  All passed.
                  Will you pass me the 64-bits ones so I’ll include them in the nppPluginList for the next release ?

                  dailD 1 條回覆 最後回覆 回覆 引用 0
                  • dailD
                    dail @donho
                    最後由 編輯

                    @donho

                    64 bit plugin entries:

                    {
                    	"folder-name": "BetterMultiSelection",
                    	"display-name": "BetterMultiSelection",
                    	"version": "1.3",
                    	"id": "515db8992abbd434da7f05192300283834e7d3ffb49068ab9db018aaf8ec00f0",
                    	"repository": "https://github.com/dail8859/BetterMultiSelection/releases/download/v1.3/BetterMultiSelection_v1.3_x64.zip",
                    	"description": "Provides better cursor movements when using multiple selections.",
                    	"author": "Justin Dailey",
                    	"homepage": "https://github.com/dail8859/BetterMultiSelection"
                    },
                    {
                    	"folder-name": "DoxyIt",
                    	"display-name": "DoxyIt",
                    	"version": "0.4.3",
                    	"id": "93802623dfd1e3db2cab6148f3158d6b3ca98a2f9556cc57bdc4228347acb62d",
                    	"repository": "https://github.com/dail8859/DoxyIt/releases/download/v0.4.3/DoxyIt_64.zip",
                    	"description": "Support for creating Doxygen comments.",
                    	"author": "Justin Dailey",
                    	"homepage": "https://github.com/dail8859/DoxyIt"
                    },
                    {
                    	"folder-name": "ElasticTabstops",
                    	"display-name": "ElasticTabstops",
                    	"version": "1.3",
                    	"id": "8cbb183c1fa059480739ce4be9b46b2c07ecf3360e5b1bfc373bee0cfde94d1d",
                    	"repository": "https://github.com/dail8859/ElasticTabstops/releases/download/v1.3/ElasticTabstops_64.zip",
                    	"description": "Support for Elastic Tabstops.",
                    	"author": "Justin Dailey",
                    	"homepage": "https://github.com/dail8859/ElasticTabstops"
                    },
                    {
                    	"folder-name": "LuaScript",
                    	"display-name": "LuaScript",
                    	"version": "0.8",
                    	"id": "15e355c7f299059d743950a6d53fe24cc7035ea3221736cb3d4d8a13ae6300f6",
                    	"repository": "https://github.com/dail8859/LuaScript/releases/download/v0.8/LuaScript_v0.8_x64.zip",
                    	"description": "Adds Lua scripting capabilities. This provides control over all of Scintilla's features and options with a light-weight, fully-functional programming language.",
                    	"author": "Justin Dailey",
                    	"homepage": "https://github.com/dail8859/LuaScript"
                    },
                    {
                    	"folder-name": "SurroundSelection",
                    	"display-name": "SurroundSelection",
                    	"version": "1.1",
                    	"id": "f6e02a1f4872995ba84e37a4c667598c970aa2ea46307a7b983c663f2ee46c8c",
                    	"repository": "https://github.com/dail8859/SurroundSelection/releases/download/v1.1/SurroundSelection_64.zip",
                    	"description": "Automatically surround the selection in quotes/brackets/parenthesis/etc.",
                    	"author": "Justin Dailey",
                    	"homepage": "https://github.com/dail8859/SurroundSelection"
                    }
                    
                    donhoD 1 條回覆 最後回覆 回覆 引用 0
                    • donhoD
                      donho @Scott Sumner
                      最後由 編輯

                      @Scott-Sumner

                      And to think, all this pain was wrought by one little ad in the corner of a window…

                      No Ads in the application even it’s a tiny one - it’s my taste, sorry if you’re offended by it. :)

                      During the implementation of PA, not only the project itself is interesting, but also the plugin folder structure has been reviewed and modified to make it better and cleaner. Not mention to it’ll bring the new features in Notepad++ in the future (SHA-256) and in GUP project as well.
                      You’re right that It’s painful, but the final product with iteration (thanks to the help of community) is not so bad.

                      I could just remove Plugin Manager and ignore the request of community, but I didn’t and I’m quite happy to make implementation of PA done finally.

                      1 條回覆 最後回覆 回覆 引用 3
                      • donhoD
                        donho @dail
                        最後由 編輯

                        @dail said:

                        64 bit plugin entries:
                        All the 64-bits packages don’t work.

                        Quick check in the SurroundSelection, found out the reason:
                        The name of plugin in the package is SurroundSelection_64.dll instead of SurroundSelection.dll.
                        I guess it’s the case for all other packages.

                        Please fix the packages then I’ll test it again.

                        dailD 1 條回覆 最後回覆 回覆 引用 0
                        • dinkumoilD
                          dinkumoil
                          最後由 編輯

                          @donho said:

                          Could you define the API you need by

                          Back from garden work and too tired to do anything. Will do it tomorrow.

                          1 條回覆 最後回覆 回覆 引用 1
                          • dailD
                            dail @donho
                            最後由 編輯

                            @donho said:

                            Quick check in the SurroundSelection, found out the reason:
                            The name of plugin in the package is SurroundSelection_64.dll instead of SurroundSelection.dll.

                            Ah yes you are right. Unfortunately I don’t know when I’ll have time to repackage/release them with the correct naming convention.

                            1 條回覆 最後回覆 回覆 引用 0
                            • dinkumoilD
                              dinkumoil
                              最後由 dinkumoil 編輯

                              @donho

                              Query full plugin DLL file path by message sent to Npp

                              As far as I know Npp is not able to know which plugin has sent a message to it. Thus the plugin has to send:

                              • its HMODULE (or some other unique ID known by Npp)
                              • a pointer to a buffer receiving the plugin DLL path
                              • the length of this buffer.

                              These are three parameters, that means it is one too much. In the following my proposal.

                              An additional struct type has to be introduced which can hold the buffer pointer and its length. The DLL HMODULE should be send as WPARAM and a pointer to the aforementioned struct as LPARAM.

                              #define NPPM_GETPLUGINDLLFILEPATH (NPPMSG + 97)
                              // BOOL NPPM_GETPLUGINDLLFILEPATH(HMODULE hDllModuleHandle, bufferDesc *buffer)
                              // Get full plugin DLL file path.
                              // If the function succeeds the return value is TRUE and the variable bufLen
                              // points to contains the number of TCHARs which have been copied to the buffer
                              // (not including the terminating 0-TCHAR).
                              // If the buffersize is too small the function fails. The return value is FALSE
                              // and the variable bufLen points to contains the number of TCHARs needed to hold
                              // the full plugin DLL file path (not including the terminating 0-TCHAR).
                              // If the function fails for another reason the return value is FALSE and the
                              // variable bufLen points to is set to 0.
                              //
                              // hDllModuleHandle can be obtained in DllMain when it is called with DLL_PROCESS_ATTACH.
                              // It is possible to call the function with bufDllPath set to NULL and the variable
                              // bufLen points to set to 0 to obtain the needed buffer size.
                              
                                      struct bufferDesc {
                                        TCHAR *bufDllPath;
                                        DWORD *bufLen;
                                      };
                              

                              If you have any idea for another way to identify the calling plugin DLL feel free to change the API and its definition.

                              1 條回覆 最後回覆 回覆 引用 0
                              • dinkumoilD
                                dinkumoil
                                最後由 dinkumoil 編輯

                                @donho

                                When digging in PowerEditor/src/MISC/PluginsManager/Notepad_plus_msgs.h I became aware that there is a problem with NPPM_GETPLUGINSCONFIGDIR. Its API documentation is very rudimentary. It is not clear if the function can handle paths longer than MAX_PATH (I guess not) and how it handles buffers with insufficient size.

                                Wouldn’t it be good to review the code of this function and possibly change its implementation in a way that it can handle paths longer than MAX_PATH and that it is possible to query the needed file path buffer size? Before you ask me: I’m not able to do that because I’m not a C++ dev.

                                1 條回覆 最後回覆 回覆 引用 0
                                • dinkumoilD
                                  dinkumoil
                                  最後由 編輯

                                  @donho
                                  I’ve seen that you already changed plugin loading behaviour for the next Npp release (commits 7e555b6, e9a489c and 1132125).

                                  I think it would be a good idea if the installer of the upcoming version would warn users that they can not use all old-style plugins anymore if they continue installation. Otherwise I’m afraid that a lot of angry users will flood the support forum with complains á la “New Npp version is destroying my workflows and productivity!”.

                                  1 條回覆 最後回覆 回覆 引用 1
                                  • dailD
                                    dail
                                    最後由 編輯

                                    @donho

                                    I came up with an easier way than re-releasing etc all my plugins for 64 bit…here is the entries for the 64 bit list I would appreciate if you could test to make sure they work since I’m currently unable to test it. Thanks.

                                    	{
                                    		"folder-name": "BetterMultiSelection",
                                    		"display-name": "BetterMultiSelection",
                                    		"version": "1.3",
                                    		"id": "e030a73278798df62c9f956f493e2baff1bb1ac8816c6a42e53a12c178ba56bc",
                                    		"repository": "https://github.com/dail8859/BetterMultiSelection/releases/download/v1.3/BetterMultiSelection_v1.3_x64_PA.zip",
                                    		"description": "Provides better cursor movements when using multiple selections.",
                                    		"author": "Justin Dailey",
                                    		"homepage": "https://github.com/dail8859/BetterMultiSelection"
                                    	},
                                    	{
                                    		"folder-name": "DoxyIt",
                                    		"display-name": "DoxyIt",
                                    		"version": "0.4.3",
                                    		"id": "8b63b3905b595795f263ed81340cf42bfcb0a42e8dabac78872c1bd72cdf59e8",
                                    		"repository": "https://github.com/dail8859/DoxyIt/releases/download/v0.4.3/DoxyIt_64_PA.zip",
                                    		"description": "Support for creating Doxygen comments.",
                                    		"author": "Justin Dailey",
                                    		"homepage": "https://github.com/dail8859/DoxyIt"
                                    	},
                                    	{
                                    		"folder-name": "ElasticTabstops",
                                    		"display-name": "ElasticTabstops",
                                    		"version": "1.3",
                                    		"id": "c5c9642b0c1b0bb8e59b1922346c3c4f434b29594b2630818eb7b288771e007b",
                                    		"repository": "https://github.com/dail8859/ElasticTabstops/releases/download/v1.3/ElasticTabstops_64_PA.zip",
                                    		"description": "Support for Elastic Tabstops.",
                                    		"author": "Justin Dailey",
                                    		"homepage": "https://github.com/dail8859/ElasticTabstops"
                                    	},
                                    	{
                                    		"folder-name": "LuaScript",
                                    		"display-name": "LuaScript",
                                    		"version": "0.8",
                                    		"id": "96d4eeafe46fa93434b7e4e70140691048c24cb5e40acba93aa1e10a57b19e7e",
                                    		"repository": "https://github.com/dail8859/LuaScript/releases/download/v0.8/LuaScript_v0.8_x64_PA.zip",
                                    		"description": "Adds Lua scripting capabilities. This provides control over all of Scintilla's features and options with a light-weight, fully-functional programming language.",
                                    		"author": "Justin Dailey",
                                    		"homepage": "https://github.com/dail8859/LuaScript"
                                    	},
                                    	{
                                    		"folder-name": "SurroundSelection",
                                    		"display-name": "SurroundSelection",
                                    		"version": "1.1",
                                    		"id": "f31a113cf30fdb286fd4d2dc40d2bfe4e66d0c0567dc5384d84e06635aeb8423",
                                    		"repository": "https://github.com/dail8859/SurroundSelection/releases/download/v1.1/SurroundSelection_64_PA.zip",
                                    		"description": "Automatically surround the selection in quotes/brackets/parenthesis/etc.",
                                    		"author": "Justin Dailey",
                                    		"homepage": "https://github.com/dail8859/SurroundSelection"
                                    	}
                                    
                                    donhoD 1 條回覆 最後回覆 回覆 引用 0
                                    • donhoD
                                      donho @dail
                                      最後由 編輯

                                      @dail
                                      64-bit plugins passed. commited and merged.

                                      dailD 1 條回覆 最後回覆 回覆 引用 1
                                      • dailD
                                        dail @donho
                                        最後由 編輯

                                        @donho said:

                                        64-bit plugins passed. commited and merged.

                                        Thanks! Much appreciated.

                                        1 條回覆 最後回覆 回覆 引用 1
                                        • donhoD
                                          donho
                                          最後由 編輯

                                          @dinkumoil said:

                                          Query full plugin DLL file path by message sent to Npp

                                          How about “Query full plugins home path by message sent to Npp” ?
                                          Since there is only one location of plugin from 7.6 version, the plugins home path\pluginUniqueName\pluginUniqueName.dll is full plugin DLL file path.

                                          1 條回覆 最後回覆 回覆 引用 2
                                          • dinkumoilD
                                            dinkumoil
                                            最後由 編輯

                                            @donho said:

                                            How about “Query full plugins home path by message sent to Npp” ?

                                            Would be good too and would reduce the parameters to 2 (pointer to buffer and pointer to buffer length), thus no additional struct neccessary. Would be great if you would implement it this way.

                                            1 條回覆 最後回覆 回覆 引用 2
                                            • 第一個貼文
                                              最後的貼文
                                            The Community of users of the Notepad++ text editor.
                                            Powered by NodeBB | Contributors