Как вызвать функцию после реализации (например, указатели функций или виртуальные функции, реализованные в приложении-потребителе) со сложным типом возврата из функции DLL?
Я попробовал следующую схему, но получил ошибки.
test.h:
#ifdef _DLL_IMPL
#define DLL_EXPORT __declspec(dllexport)
#else
#define DLL_EXPORT __declspec(dllimport)
#endif
typedef string (*test)(void);
extern DLL_EXPORT test __test;
DLL_EXPORT int launch();
test.cpp:
#define _DLL_IMPL
#include "Test.h"
test __test = 0;
int launch()
{
string a = __test();
return 0;
}
И приложение-потребитель выглядит так:
main.cpp:
#include "Test.h"
#pragma comment(lib, "Test.lib")
string test_impl()
{
string a = "test";
return a;
}
int main(int args, char** argv)
{
__test = &test_impl;
return launch();
}
И я получил следующее сообщение об ошибке:
Windows has triggered a breakpoint in TestRun.exe.
This may be due to a corruption of the heap, which indicates a bug in
TestRun.exe or any of the DLLs it has loaded.
This may also be due to the user pressing F12 while TestRun.exe has focus.
The output window may have more diagnostic information.
Я не знаю, что именно происходило. Ошибка также произошла, когда я попытался вернуть тип указателя на символ, который был бы создан в приложении-потребителе с использованием оператора new и был бы освобожден в функции DLL с помощью оператора delete [].
Может кто-нибудь объяснить причину возникновения ошибки и предложить мне какое-нибудь решение этой схемы? Спасибо!