У меня есть решение с двумя проектами, одной DLL и одним консольным приложением.Консольное приложение является клиентом для вызова и тестирования функций в DLL.
Для первой функции greetings
я столкнулся с проблемой.Я должен отметить, что я совершенно новичок в C и C ++.
Проект DLL (называемый плагином) выглядит следующим образом:
plugin.h
#include "types.h" // which contains S32 and #include<string>
#define EXPORT extern "C" __declspec (dllexport)
EXPORT S32 WINAPI _3Greetings(string *str);
плагин.cpp
#include "plugin.h"
S32 __stdcall _3Greetings(string *str)
{
*str = "Hello From Plugin!";
return -1;
}
Все функции DLL должны возвращать -1
в случае успеха или [1-255]
в случае ошибки.Кроме того, у проекта есть plugin.def
для решения оформления имени соглашения о вызовах __stdcall
.
Консольное приложение выглядит следующим образом:
typedef U32(*GetGreetings)(string);
HMODULE DllHandler = ::LoadLibrary(L"plugin.dll");
if (DllHandler != NULL) {
string greetingText;
GetGreetings greetings = reinterpret_cast<GetGreetings>(GetProcAddress(DllHandler2, "_3Greetings"));
greetings(&greetingText); // THE PROBLEM HERE
cout << greetings << endl;
}
Проблема в том, что если я добавлю &
к greetingText
, я получу ошибку:
E0415 Не существует подходящего конструктора для преобразования из "std :: string *" в "std :: basic_string, std :: allocator>"
, а также:
C2664'U32 (std :: string)': невозможно преобразовать аргумент 1 из 'std :: string *' в 'std :: string'
Если я не поставлю &
, я получуисключение времени выполнения:
Исключение, выданное в 0x0FA65A72 (plugin.dll) в ConsoleApp.exe: 0xC0000005: Место записи нарушения прав доступа 0xCCCCCC00.