Итак, я подумал, а почему бы просто не скопировать мою DLL в локальную папку плагина Notepad++ и посмотреть, что произойдет?
Ну, я получаю это сообщение об ошибке при перезапуске Notepad++:
---------------------------
C:\Program Files\Notepad++\plugins\Demo\Demo.dll
---------------------------
This ANSI plugin is not compatible with your Unicode Notepad++.
Demo.dll is not compatible with the current version of Notepad++.
Do you want to remove this plugin from the plugins directory
to prevent this message from the next launch?
---------------------------
Yes No
---------------------------
Графически:

Как я могу изменить проект C# демонстрационного плагина, чтобы избежать этого сообщения об ошибке?
Тем временем я добавил функцию isUnicode(), но по-прежнему сталкиваюсь с той же проблемой. Вот как сейчас выглядит мой код:
namespace Kbg.Demo.Namespace
{
class Main
{
// The " Fields " region is collapsed.
#region " Startup/CleanUp "
static internal void CommandMenuInit()
{
...
// PluginBase.SetCommand(19, "isUnicode, return true always", isUnicode);
// PluginBase.SetCommand(20, "return your plugin name", getName);
PluginBase.SetCommand(21, "informs your plugin about Notepad++ and Scintilla handles", setInfo);
PluginBase.SetCommand(22, "called in case of Notepad++ or Scintilla events", beNotified);
PluginBase.SetCommand(23, "called in case of Windows messages forwarded by Notepad++", messageProc);
// PluginBase.SetCommand(24, "return the functions which should be available within your plugin menu", getFuncsArray);
}
// ...
static public bool isUnicode()
{
return true; // Return True always
}
static public string getName()
{
return "DDM_Demo"; // Return your plugin name
}
static public void setInfo()
{
// return "setInfo"; // Informs your plugin about notepad++ and scintilla handles
}
... // The others, mentioned in [Sinatr's second link][3] are there too.
Я нашел следующий код C++ для функции isUnicode():
#ifdef UNICODE
extern "C" __declspec(dllexport) BOOL isUnicode()
{
return TRUE;
}
#endif //UNICODE
Я понятия не имею, что именно означает часть __declspec(dllexport) (я предполагаю, что часть #ifdef не важна). Имеет ли это какое-либо значение для объявления/определения функции isUnicode()?
Комментарий к дампу Notepad++:
Я взял дамп процесса Notepad++.exe, но стек вызовов не дал результатов. Я не вижу никакой информации, которая могла бы объяснить, почему отображается это диалоговое окно, хотя функция isUnicode() явно существует.
Комментарий к DllExport и Dependency Walker:
Мне удалось заставить DllExport работать, но при открытии моей DLL с помощью Dependency Walker я ничего не вижу:

Комментарий о том, что точка останова не была достигнута:
Очень странно: когда я запускаю DLL (с Notepad++.exe в качестве внешней программы в качестве отправной точки), похоже, что функция isUnicode() даже не используется:

Когда я ставлю точку останова в другом месте, она тоже не срабатывает.
На самом деле окно отладки "Модули" выглядит совершенно пустым:

Есть ли у кого-нибудь идеи?
Может быть, это отправная точка: мой неуправляемый экспорт, похоже, не вызывается/вызывается:

Я очень наивно пытался заставить эти функции использоваться, но и здесь мне не удалось:
PluginBase.SetCommand(21, "informs your plugin about Notepad++ and Scintilla handles", Kbg.NppPluginNET.UnmanagedExports.setInfo); // does not compile (CS1503)