Я пишу DLL-плагин для XChat 2 в C++ (не используя классы). Когда я пытаюсь загрузить плагин через меню XChat Load Plugin, я получаю ответ:
Нет символа xchat_plugin_init; это действительно плагин xchat?
Я следил за деталями, указанными в их плагине, и так организован мой проект:
Headers
stdafx.h
targetver.h
xchat-plugin.h (XChat plugin header)
Source
dllmain.cpp (Unmodified from its default)
plugin.cpp
stdafx.cpp (contains default #include "stdafx.h")
Resources
plugin.def (as listed in the doc)
plugin.cpp
существует из-за инструкций по сборке Windows. Это содержит:
static int join_cb(char *word[], void *userdata)
void xchat_plugin_get_info(char **name, char **desc, char **version, void **reserved)
int xchat_plugin_init(xchat_plugin *plugin_handle, char **plugin_name, char **plugin_desc, char **plugin_version, char **arg)
int xchat_plugin_deinit(...
Как вы можете видеть, у меня действительно есть xchat_plugin_init
, так почему XChat не может найти его? Я не уверен, но я думаю, что проблема может быть связана с тем, как plugin.def
. Не уверен. (FYI: Я немного новичок в написании DLL).
Изменение: это не похоже на то, что функции являются общедоступными... просматривая DLL Export Viewer, прототип функции для xchat_plugin_init
не существует, но он существует в других. Как сделать функции общедоступными?
Edit 2: Похоже, для этого есть две возможности: extern "C"
и использование файла определения. extern "C"
самом деле не делает функции видимыми внешне, хотя я не уверен, почему.
Файл определения плагина есть, но я не думаю, что он настроен должным образом. Невозможно добавить файл определения модуля.
Функции, которые XChat будет вызывать, должны быть объявлены extern "C"
:
extern "C" {
void xchat_plugin_get_info(char **name, char **desc, char **version, void **reserved);
int xchat_plugin_init(xchat_plugin *plugin_handle, char **plugin_name, char **plugin_desc, char **plugin_version, char **arg);
int xchat_plugin_deinit(...);
}
Это будет "деманлить" имена символов (например, они будут на C), чтобы они соответствовали тому, что ищет XChat.
extern "C"
к трем определениям функций, но они все еще не отображаются в DLL. Кроме того, у меня есть файл def (хотя я не уверен точно, куда он идет). Я не уверен, что это отвечает на вопрос, но я мог бы сделать это неправильно.