Я пишу плагин 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
Включено. Не уверен, хотя. (К вашему сведению: я новичок в написании DLL.)
Изменить: не похоже, что функции являются общедоступными … глядя через DLL Export Viewer, прототип функции не существует для xchat_plugin_init
в моем, но он существует в других. Как сделать функции общедоступными?
Изменить 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.
Других решений пока нет …